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, Set
eher als zu verwenden List
. Das ist in Ordnung, aber beachten Sie, dass die Set
Schnittstelle 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 values
Methode aufrufen , um einen Iterable
der Werte abzurufen. Die Schlüssel unterscheiden sich alle durch die Konstruktion.
groupBy
Mitglied von verwenden scala.collection.Iterable[A]
.
scala.collection.immutable.List
hat jetzt eine .distinct
Methode.
Das Aufrufen dirty.distinct
ist jetzt möglich, ohne in ein Set
oder zu konvertieren Seq
.
.distinct
ist nicht definiert für scala.collection.Iterable[A]
. In diesem Fall müssten Sie also ein Upgrade dirty
auf a Seq
oder a Set
verwenden (dh entweder .toList
mit .toSeq
oder mit .toSet
Mitgliedern), damit dies funktioniert.
Denken Sie vor der Verwendung der Kitpon-Lösung an die Verwendung von a Set
anstelle 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 toSet
wie es das unterstütztSeq Traversable
Schnittstelle.
Set
implementiert Traversable
, nicht Seq
. Der Unterschied besteht darin, dass Seq
den Elementen eine Reihenfolge garantiert wird, während Traversable
dies 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 " "
}