La libreria di raccolte Scala fornisce implementazioni specializzate per Set di meno di 5 valori (vedere source). Gli iteratori per queste implementazioni restituiscono gli elementi nell'ordine in cui sono stati aggiunti, anziché l'ordinamento coerente basato su hash utilizzato per i set più grandi.
Inoltre, sameElements
(scaladoc) è definita su Iterable
s (è implementato in IterableLike
- vedi source); restituisce true solo se gli iteratori restituiscono gli stessi elementi nello stesso ordine.
Quindi, anche se Set(1,2,3)
e Set(3,2,1)
dovrebbe essere equivalenti, i loro iteratori sono diversi, quindi sameElements
restituisce false.
Questo comportamento è sorprendente, e probabilmente un bug poiché viola le aspettative matematiche per un Set (ma solo per alcune dimensioni di Set!).
Come da I.K. sottolinea nei commenti, ==
funziona bene se si stanno solo confrontando i set tra loro, ovvero Set(1,2,3) == Set(3,2,1)
. Tuttavia, sameElements è più generale in quanto può confrontare gli elementi di due iterabili. Ad esempio, List(1, 2, 3) == Array(1, 2, 3)
è falso, ma List(1, 2, 3) sameElements Array(1, 2, 3)
è true.
Più in generale, l'uguaglianza può essere fonte di confusione - notare che:
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)
ho submitted a fix per il Scala exercises che spiega il problema sameElements
.
Utilizzare '==' per verificare l'uguaglianza indipendentemente dall'ordine e dalle ripetizioni. –
Questo è un buon punto per confrontare 'Set's l'uno con l'altro, anche se ho appena notato che' Elenco (1,2,3) == Vettore (1,2,3) 'ma' Elenco (1,2,3) ! = Set (1,2,3) 'e' List (1,2,3)! = Array (1,2,3) 'che è un altro potenziale campo minato! – DNA
E come sottolinea Paul Draper nei commenti sottostanti, 'Array (1,2,3)! = Array (1,2,3)' !! – DNA