Supongamos que tengo
val dirty = List("a", "b", "a", "c")
¿Existe una operación de lista que devuelva "a", "b", "c"
Eche un vistazo a ScalaDoc para Seq ,
scala> dirty.distinct
res0: List[java.lang.String] = List(a, b, c)
Actualizar . Otros han sugerido usar en Set
lugar de List
. Está bien, pero tenga en cuenta que, de forma predeterminada, la Set
interfaz no conserva el orden de los elementos. Es posible que desee utilizar una aplicación que figura explícitamente que no preservar el orden, como collection.mutable.LinkedHashSet .
Map[String, File]
, donde las claves son la parte del nombre del archivo de interés. Una vez que se construye el mapa, puede llamar alvalues
método para obtener unIterable
valor de: todas las claves serán distintas por construcción.groupBy
miembro descala.collection.Iterable[A]
.scala.collection.immutable.List
ahora tiene un.distinct
método.Entonces, llamar
dirty.distinct
ahora es posible sin convertir aSet
oSeq
.fuente
.distinct
no está definido parascala.collection.Iterable[A]
. Así que en ese caso, habría que utilizar la actualizacióndirty
a unSeq
o unaSet
de todos modos (es decir, mediante el uso de cualquiera de los dos.toList
,.toSeq
o.toSet
los miembros) para que esto funcione.Antes de usar la solución de Kitpon, piense en usar a en
Set
lugar de aList
, asegura que cada elemento sea único.Como la mayoría de las operaciones de lista (
foreach
,map
,filter
, ...) son los mismos para los conjuntos y listas, el cambio de la colección podría ser muy fácil en el código.fuente
Usar Set en primer lugar es la forma correcta de hacerlo, por supuesto, pero:
Trabajos. O simplemente
toSet
como es compatible conSeqTraversable
interfaz.fuente
Set
implementaTraversable
, noSeq
. La diferencia es queSeq
garantiza un orden a los elementos, mientrasTraversable
que no.Para listas ya ordenadas
Si desea los distintos elementos de una lista que sabe que ya está ordenada , como a menudo he necesitado, lo siguiente funciona aproximadamente al doble de velocidad que
.distinct
:Resultados de rendimiento en una lista de 100.000.000 Ints aleatorios de 0 a 99:
Rendimiento con MutableList o ListBuffer
Si bien parecería que un enfoque de programación más mutable / no funcional podría ser más rápido que anteponer a una lista inmutable, la práctica muestra lo contrario. La implementación inmutable se desempeña mejor constantemente. Supongo que la razón es que scala enfoca sus optimizaciones del compilador en colecciones inmutables y lo hace bien. (Doy la bienvenida a otros para que presenten mejores implementaciones).
Implementaciones:
Prueba:
fuente
También puede utilizar la recursividad y la coincidencia de patrones:
fuente
removeDuplicates(tail.filter(_ != head))
inArr.distinct para cada println _
fuente
La forma algorítmica ...
fuente