2010-09-01 4 views
19

Assumendo:Esiste un metodo API che confronta i contenuti di un Seq indipendentemente dall'ordine?

val l1 = List(1,2,3) 
val l2 = List(2,3,1) 

Voglio un metodo che conferma che l1 è pari a l2 (come nel stessi contenuti ma ordine diverso). C'è un metodo API su List/Seq per fare questo?

l1.sameElements(l2) 

non funziona come verifica ordine pure.

mi è venuta in mente la seguente:

l1.foldLeft(l1.size == l2.size)(_ && l2.contains(_)) 

C'è qualcosa di più succinta quanto sopra per fare questo confronto?

+0

http://stackoverflow.com/questions/2944617/use-example-of-scala-observableset-trait –

+0

In che modo la domanda collegata si riferisce a questa domanda? – ssanj

+0

Gli insiemi potrebbero risolvere il suo problema, ma il suo commento alla risposta in basso afferma che vuole che anche i duplicati siano supportati, quindi Set ora non funzionerà. –

risposta

27

Se quello che vuoi è "queste liste contengono gli stessi elementi, a prescindere dalla ordine o ripetizioni":

l1.toSet == l2.toSet

Se quello che vuoi è "queste liste contengono gli stessi elementi, e con lo stesso numero di ripetizioni di ogni ":

l1.sorted == l2.sorted

Se quello che vuoi è" queste liste contengono gli stessi elementi e sono le stesse dimensioni, ma il numero di ripetizioni di una data elemento può variare tra le due liste ":

l1.size == l2.size && l1.toSet == l2.toSet

+0

Anche io voglio soddisfare gli elementi duplicati. Quindi Lista (1,2,3,3) non dovrebbe essere uguale (Lista (3,2,1)) – ssanj

+0

Ok, modificato per riflettere che :) –

+0

Elenco (1,2,3,3) .sorted! = Elenco (3,2,1) – ssanj

9

Mentre

l1.sorted == l2.sorted 

è corretto, sia le prestazioni runtime è O (n log n), a causa del l'ordinamento. Per le grandi liste, si sono probabilmente meglio con

l1.groupBy(identity) == l2.groupBy(identity) 

che dovrebbe essere O (n), assumendo una discreta implementazione di groupBy.

+0

In Scala, non penso che il gruppo di soluzione funzionerà perché i valori della mappa saranno matrici, e quelle saranno confrontate usando l'uguaglianza di riferimento. 'l1.groupBy (identity) .mapValues ​​(_. length) == ...' funzionerebbe comunque. – csjacobs24

Problemi correlati