posicionamiento name keywords etiquetas etiqueta description content codigo scala scala-collections

scala - name - seo html



Los Scala Sets contienen los mismos elementos, pero sameElements() devuelve false (1)

La biblioteca de colecciones Scala proporciona implementaciones especializadas para conjuntos de menos de 5 valores (consulte la source ). Los iteradores para estas implementaciones devuelven elementos en el orden en que se agregaron , en lugar del orden coherente basado en hash utilizado para conjuntos más grandes.

Además, sameElements ( scaladoc ) se define en Iterable s (se implementa en IterableLike - vea la source ); devuelve verdadero solo si los iteradores devuelven los mismos elementos en el mismo orden.

Entonces, aunque Set(1,2,3) y Set(3,2,1) deberían ser equivalentes, sus iteradores son diferentes, por sameElements tanto sameElements devuelve falso.

Este comportamiento es sorprendente, y podría decirse que es un error ya que viola las expectativas matemáticas de un Set (¡pero solo para ciertos tamaños de Set!).

Como IK señala en los comentarios, == funciona bien si solo está comparando Conjuntos entre sí, es decir, Set(1,2,3) == Set(3,2,1) . Sin embargo, sameElements es más general porque puede comparar los elementos de dos iterables. Por ejemplo, List(1, 2, 3) == Array(1, 2, 3) es falso, pero List(1, 2, 3) sameElements Array(1, 2, 3) es verdadero.

En términos más generales, la igualdad puede ser confusa: tenga en cuenta que:

List(1,2,3) == Vector(1,2,3) List(1,2,3) != Set(1,2,3) List(1,2,3) != Array(1,2,3) Array(1,2,3) != Array(1,2,3)

He enviado una solución para los ejercicios de Scala que explica el sameElements problema de elementos.

Mientras trabajaba en los ejercicios de Scala en Iterables , me encontré con el siguiente comportamiento extraño:

val xs = Set(5,4,3,2,1) val ys = Set(1,2,3,4,5) xs sameElements ys // true val xs = Set(3,2,1) val ys = Set(1,2,3) xs sameElements ys // false - WAT?!

Seguramente estos conjuntos tienen los mismos elementos y deben ignorar el orden; ¿Y por qué esto funciona como se espera solo para el conjunto más grande?