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 Set
piuttosto che List
. Va bene, ma tieni presente che per impostazione predefinita l' Set
interfaccia 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 values
metodo per ottenere un Iterable
di valori: le chiavi saranno tutte distinte per costruzione.
groupBy
membro di scala.collection.Iterable[A]
.
scala.collection.immutable.List
ora ha un .distinct
metodo.
Quindi dirty.distinct
ora è possibile chiamare senza convertire in Set
o Seq
.
.distinct
non è definito per scala.collection.Iterable[A]
. Quindi, in questo caso, dovreste usare l'aggiornamento dirty
a una Seq
o Set
comunque (cioè utilizzando uno .toList
, .toSeq
o .toSet
membri) per questo al lavoro.
Prima di utilizzare la soluzione di Kitpon, pensa di utilizzare a Set
piuttosto 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 toSet
come supporta ilSeq Traversable
interfaccia.
Set
implementa Traversable
, no Seq
. La differenza è che Seq
garantisce un ordine agli elementi, mentre Traversable
no.
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 " "
}