¿Cómo en Scala para encontrar elementos únicos en la lista?Cómo en Scala para encontrar elementos únicos en la lista
Respuesta
La forma orden de preservación más eficaz de hacer esto sería utilizar un Set
como una estructura de datos auxiliares:
def unique[A](ls: List[A]) = {
def loop(set: Set[A], ls: List[A]): List[A] = ls match {
case hd :: tail if set contains hd => loop(set, tail)
case hd :: tail => hd :: loop(set + hd, tail)
case Nil => Nil
}
loop(Set(), ls)
}
Nosotros Puede envolver esto en una sintaxis más agradable utilizando una conversión implícita:
implicit def listToSyntax[A](ls: List[A]) = new {
def unique = unique(ls)
}
List(1, 1, 2, 3, 4, 5, 4).unique // => List(1, 2, 3, 4, 5)
Si se refiere a la Rosetta Code: Create a Sequence of unique elements
val list = List(1,2,3,4,2,3,4,99)
val l2 = list.removeDuplicates
// l2: scala.List[scala.Int] = List(1,2,3,4,99)
Desde List
es inmutable, usted no modifica la inicial List
llamando removeDuplicates
Advertencia: (!) Como se ha mencionado por this tweet, esto no conserva el orden:
scala> val list = List(2,1,2,4,2,9,3)
list: List[Int] = List(2, 1, 2, 4, 2, 9, 3)
scala> val l2 = list.removeDuplicates
l2: List[Int] = List(1, 4, 2, 9, 3)
Para un Seq
, ese método debería estar disponible en Scala2.8, de acuerdo con ticket 929.
Mientras tanto, tendrá que definir un método estático ad-hoc como el one seen here
¿Qué debo hacer si tengo Seq [String] not List? –
Llamar a 'toList', al parecer :) O, como lo propone @Synesso, use' foldLeft'. – incarnate
Un método ad-hoc simple es sólo para añadir la lista a un conjunto, y utilizar desde allí:
val l = List(1,2,3,3,3,4,5,5,6,7,8,8,8,9,9)
val s = Set() ++ x
println(s)
Produce:
> Set(5, 1, 6, 9, 2, 7, 3, 8, 4)
Esto funciona para un Seq (o cualquier Iterable), pero no es necesario en 2.8, en donde el método RemoveDuplicates probablemente será más fácil de leer. Además, no estoy seguro sobre el rendimiento del tiempo de ejecución frente a una conversión más pensada.
Además, tenga en cuenta la pérdida de pedidos.
rollo su propio filtro uniq con la retención de orden:
scala> val l = List(1,2,3,3,4,6,5,6)
l: List[Int] = List(1, 2, 3, 3, 4, 6, 5, 6)
scala> l.foldLeft(Nil: List[Int]) {(acc, next) => if (acc contains next) acc else next :: acc }.reverse
res0: List[Int] = List(1, 2, 3, 4, 6, 5)
Realmente disfruté mucho de esto, ya que permite una compleja lógica de filtrado. ¡Gracias! – incarnate
En 2.8, que es:
List(1,2,3,2,1).distinct // => List(1, 2, 3)
Imho, 1 y 2 no son elementos únicos en la lista. Solo el 3 es. Usted crea una lista de elementos únicos de la lista, que es algo diferente. –
Si eso es lo que quiere (generalmente no lo es), vaya con: Lista (1,2,3,2,1) .grupoBy (x => x) .filter (_._ 2.lengthCompare (1) == 0) .keySet – moveaway00
En mi humilde opinión, todas las interpretaciones de la cuestión son falsas:
¿Cómo en Scala para encontrar artículos únicos en la lista?
Dada esta lista:
val ili = List (1, 2, 3, 4, 4, 3, 1, 1, 4, 1)
el único elemento único en la lista es 2
. Los otros artículos no son únicos.
ili.toSet.filter (i => ili.indexOf (i) == ili.lastIndexOf (i))
lo encontrará.
la mayoría de los desarrolladores java/scala traducirían una pregunta de "artículos únicos en una lista dada" como "todos los valores distintos con una lista dada" no "todos los valores aparecen singularmente dentro de una lista dada" ... que es cómo cada respuesta antes de la tuya lo interpretó, así como también la persona que hizo la pregunta (quién aprobó dicha respuesta). ¿Qué viene en más de 2 años más tarde y ser más sensible en el análisis de una pregunta ya respondida? – mujimu
@mujimu: No recuerdo por qué me tropecé con la pregunta 2 años después. Tal vez sombebody cerró una pregunta similar como duplicado exacto y se vinculó aquí. A menudo trato de responder estas preguntas por mí mismo como un ejercicio antes de buscar las soluciones de los demás; si tienen una solución similar o mejor o si tiene sentido publicar la mía. Entonces descubrí que los demás respondieron una pregunta diferente. Después de saber cómo otros entendieron la pregunta de manera diferente, todavía creo que la terminología es incorrecta. El significado de una oración no debe juzgarse por mayoría. –
list.filter { x => list.count(_ == x) == 1 }
lista.toSet lo hará ya que Set por definición solo contiene elementos únicos
Esto fue señalado, en una respuesta anterior, hace más de 5 años, ¿cuál es su punto? – jwvh
- 1. elementos únicos en una lista de haskell
- 2. Contando elementos únicos en una lista
- 3. Encontrar elementos únicos en una matriz de cadenas en C
- 4. ¿Cómo asegurar que la lista contiene elementos únicos?
- 5. ¿Cómo encontrar elementos comunes en la lista de listas?
- 6. Cómo encontrar valores únicos en la matriz dentada
- 7. Comprobando si todos los elementos en una lista son únicos
- 8. GroupBy y cuente los elementos únicos en una lista
- 9. perl: contar elementos únicos en la matriz
- 10. ¿Obtienes elementos únicos de la lista de listas?
- 11. ¿Cómo obtengo elementos únicos en esta matriz?
- 12. Comprensión de la lista de Python, con elementos únicos
- 13. Contenedor para una pila de elementos únicos
- 14. XPath para obtener nombres de elementos únicos
- 15. Encuentra elementos de una lista que no está en la segunda lista (en Scala)
- 16. ¿Cómo controlo la eficacia de los elementos únicos en una lista?
- 17. Obtener elementos únicos de NSMutableArray
- 18. Colecciones concurrentes y elementos únicos
- 19. ¿Qué es Scala para encontrar si todos los elementos de una matriz tienen la misma longitud?
- 20. función Lista Scala para agrupar elementos idénticos consecutivos
- 21. LINQ: orden por recuento de elementos únicos en la lista <string>
- 22. Diferencia entre elementos consecutivos en la lista
- 23. ¿Cómo verificar si algunos elementos están en una lista?
- 24. encontrar el elemento insertado en la lista
- 25. Seleccione una lista de elementos únicos de una lista de nodos usando XPATH
- 26. Python: encontrar claves con valores únicos en un diccionario?
- 27. Algoritmo para encontrar bordes únicos desde malla poligonal
- 28. Identificación de elementos únicos en una matriz de celdas
- 29. LINQ: Cómo anexar lista de elementos en otra lista
- 30. únicos anidada Scala de código Java
Es demasiado complicado * ahora *. Scala 2.7 no tenía nada mejor. –