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 Setlugar de List. Está bien, pero tenga en cuenta que, de forma predeterminada, la Setinterfaz 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 alvaluesmétodo para obtener unIterablevalor de: todas las claves serán distintas por construcción.groupBymiembro descala.collection.Iterable[A].scala.collection.immutable.Listahora tiene un.distinctmétodo.Entonces, llamar
dirty.distinctahora es posible sin convertir aSetoSeq.fuente
.distinctno está definido parascala.collection.Iterable[A]. Así que en ese caso, habría que utilizar la actualizacióndirtya unSeqo unaSetde todos modos (es decir, mediante el uso de cualquiera de los dos.toList,.toSeqo.toSetlos miembros) para que esto funcione.Antes de usar la solución de Kitpon, piense en usar a en
Setlugar 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
toSetcomo es compatible conSeqTraversableinterfaz.fuente
SetimplementaTraversable, noSeq. La diferencia es queSeqgarantiza un orden a los elementos, mientrasTraversableque 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