Supponiamo di averlo fatto
val dirty = List("a", "b", "a", "c")
Esiste un'operazione di elenco che restituisce "a", "b", "c"
Supponiamo di averlo fatto
val dirty = List("a", "b", "a", "c")
Esiste un'operazione di elenco che restituisce "a", "b", "c"
Risposte:
Dai un'occhiata a ScalaDoc per Seq ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Aggiorna . Altri hanno suggerito di utilizzare Setpiuttosto che List. Va bene, ma tieni presente che per impostazione predefinita l' Setinterfaccia non mantiene l'ordine degli elementi. Si consiglia di utilizzare un set di implementazione che esplicitamente non conserva ordine, come collection.mutable.LinkedHashSet .
Map[String, File], in cui le chiavi sono la parte del nome del file di interesse. Una volta costruita la mappa, puoi chiamare il valuesmetodo per ottenere un Iterabledi valori: le chiavi saranno tutte distinte per costruzione.
groupBymembro di scala.collection.Iterable[A].
scala.collection.immutable.Listora ha un .distinctmetodo.
Quindi dirty.distinctora è possibile chiamare senza convertire in Seto Seq.
.distinctnon è definito per scala.collection.Iterable[A]. Quindi, in questo caso, dovreste usare l'aggiornamento dirtya una Seqo Setcomunque (cioè utilizzando uno .toList, .toSeqo .toSetmembri) per questo al lavoro.
Prima di utilizzare la soluzione di Kitpon, pensa di utilizzare a Setpiuttosto che a List, in modo che ogni elemento sia unico.
Come la maggior parte delle operazioni di lista ( foreach, map, filter, ...) sono gli stessi per i set e liste, cambiando la raccolta potrebbe essere molto semplice nel codice.
Usare Set in primo luogo è il modo giusto per farlo, ovviamente, ma:
scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
Lavori. O proprio toSetcome supporta ilSeq Traversable interfaccia.
Setimplementa Traversable, no Seq. La differenza è che Seqgarantisce un ordine agli elementi, mentre Traversableno.
Il modo algoritmico ...
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 " "
}