Suponha que eu tenha
val dirty = List("a", "b", "a", "c")
Existe uma operação de lista que retorna "a", "b", "c"
Suponha que eu tenha
val dirty = List("a", "b", "a", "c")
Existe uma operação de lista que retorna "a", "b", "c"
Respostas:
Dê uma olhada no ScalaDoc for Seq ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Atualize . Outros sugeriram usar em Setvez de List. Tudo bem, mas esteja ciente de que, por padrão, a Setinterface não preserva a ordem dos elementos. Você pode querer usar uma implementação de Set que preserva explicitamente a ordem, como collection.mutable.LinkedHashSet .
Map[String, File], onde as chaves são a parte do nome do arquivo de interesse. Assim que o mapa for construído, você pode chamar o valuesmétodo para obter um Iterabledos valores - as chaves serão todas distintas por construção.
groupBymembro de scala.collection.Iterable[A].
scala.collection.immutable.Listagora tem um .distinctmétodo.
Portanto, dirty.distinctagora é possível fazer chamadas sem converter para um Setou Seq.
.distinctnão está definido para scala.collection.Iterable[A]. Então, nesse caso, você teria que usar upgrade dirtypara a Seqou a de Setqualquer maneira (ou seja, usando um .toList, .toSeqou .toSetmembros) para que isso funcione.
Antes de usar a solução do Kitpon, pense em usar um Setao invés de um List, isso garante que cada elemento seja único.
Como a maioria das operações de lista ( foreach, map, filter, ...) são os mesmos para os conjuntos e listas, mudando coleção poderia ser muito fácil no código.
Usar Set em primeiro lugar é a maneira certa de fazer isso, é claro, mas:
scala> List("a", "b", "a", "c").toSet.toList
res1: List[java.lang.String] = List(a, b, c)
Trabalho. Ou apenas toSetporque suporta oSeq Traversable interface.
Setimplementa Traversable, não Seq. A diferença é que Seqgarante uma ordem aos elementos, enquanto Traversablenão.
A maneira algorítmica ...
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 " "
}