Angenommen, ich habe
val dirty = List("a", "b", "a", "c")
Gibt es eine Listenoperation, die "a", "b", "c" zurückgibt?
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 dievalues
Methode aufrufen , um einenIterable
der Werte abzurufen. Die Schlüssel unterscheiden sich alle durch die Konstruktion.groupBy
Mitglied von verwendenscala.collection.Iterable[A]
.scala.collection.immutable.List
hat jetzt eine.distinct
Methode.Das Aufrufen
dirty.distinct
ist jetzt möglich, ohne in einSet
oder zu konvertierenSeq
.quelle
.distinct
ist nicht definiert fürscala.collection.Iterable[A]
. In diesem Fall müssten Sie also ein Upgradedirty
auf aSeq
oder aSet
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 aList
, 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.quelle
Die Verwendung von Set ist natürlich der richtige Weg, aber:
Funktioniert. Oder genauso
toSet
wie es das unterstütztSeqTraversable
Schnittstelle.quelle
Set
implementiertTraversable
, nichtSeq
. Der Unterschied besteht darin, dassSeq
den Elementen eine Reihenfolge garantiert wird, währendTraversable
dies nicht der Fall ist.inArr.distinct foreach println _
quelle
Der algorithmische Weg ...
quelle