Angenommen, ich habe
val dirty = List("a", "b", "a", "c")
Gibt es eine Listenoperation, die "a", "b", "c" zurückgibt?
Angenommen, ich habe
val dirty = List("a", "b", "a", "c")
Gibt es eine Listenoperation, die "a", "b", "c" zurückgibt?
Antworten:
Schauen Sie sich das ScalaDoc für Seq an ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Update . Andere haben vorgeschlagen, Seteher als zu verwenden List. Das ist in Ordnung, aber beachten Sie, dass die SetSchnittstelle standardmäßig die Elementreihenfolge nicht beibehält. Möglicherweise möchten Sie eine Set-Implementierung verwenden, die die Reihenfolge explizit beibehält , z. B. collection.mutable.LinkedHashSet .
Map[String, File], in dem der Schlüssel der Teil des Dateinamen von Interesse ist. Sobald die Karte erstellt wurde, können Sie die valuesMethode aufrufen , um einen Iterableder Werte abzurufen. Die Schlüssel unterscheiden sich alle durch die Konstruktion.
groupByMitglied von verwenden scala.collection.Iterable[A].
scala.collection.immutable.Listhat jetzt eine .distinctMethode.
Das Aufrufen dirty.distinctist jetzt möglich, ohne in ein Setoder zu konvertieren Seq.
.distinctist nicht definiert für scala.collection.Iterable[A]. In diesem Fall müssten Sie also ein Upgrade dirtyauf a Seqoder a Setverwenden (dh entweder .toListmit .toSeqoder mit .toSetMitgliedern), damit dies funktioniert.
Denken Sie vor der Verwendung der Kitpon-Lösung an die Verwendung von a Setanstelle von a List, um sicherzustellen, dass jedes Element einzigartig ist.
Da die meisten Listenoperationen ( foreach, map, filter, ...) sind für Sets und Listen, könnte sehr leicht in der Codesammlung zu ändern sein.
Die Verwendung von Set ist natürlich der richtige Weg, aber:
scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
Funktioniert. Oder genauso toSetwie es das unterstütztSeq Traversable Schnittstelle.
Setimplementiert Traversable, nicht Seq. Der Unterschied besteht darin, dass Seqden Elementen eine Reihenfolge garantiert wird, während Traversabledies nicht der Fall ist.
Der algorithmische Weg ...
def dedupe(str: String): String = {
val words = { str split " " }.toList
val unique = words.foldLeft[List[String]] (Nil) {
(l, s) => {
val test = l find { _.toLowerCase == s.toLowerCase }
if (test == None) s :: l else l
}
}.reverse
unique mkString " "
}