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?