2011-12-01 5 views

risposta

13

Si può provare a convertirli in Set e quindi a confrontarli, poiché l'uguaglianza in Set è definita come avere gli stessi elementi indipendentemente dall'ordine.

assert a as Set == b as Set 
assert a as Set != c as Set 
+9

Che funziona fintanto che gli elementi della lista non sono duplicati. Per gli elenchi che possono avere duplicati, questo metodo non rileverà se hanno lo stesso numero di ogni singolo elemento. (Non ho l'impressione che questo sia qualcosa a cui l'OP importa, quindi la tua risposta è ancora valida, solo una FYI per gli altri che trovano questa risposta). –

8

semplicemente l'ordinamento dei risultati e il confronto è un modo semplice, se i vostri elenchi non sono troppo grandi:

def a = [1, 3, 2] 
def b = [2, 1, 3] 
def c = [2, 4, 3, 1] 

def haveSameContent(a1, a2) { 
    a1.sort(false) == a2.sort(false) 
} 

assert haveSameContent(a, b) == true 
assert haveSameContent(a, c) == false 

La false passato a sort è quello di prevenire riordino sul posto. Se è possibile modificare l'ordine degli elenchi, è possibile rimuoverlo e possibilmente guadagnare un po 'di prestazioni.

+0

Non c'è alcun senso nel confrontare un valore booleano con 'true' o' false'. Penso che "asserisci hasSameContent (a, b)" e "asserisci! HaveSameContent (a, c)" si legge meglio. – epidemian

+0

Questa è davvero una questione di opinione. Penso che sia più chiaro con '== false' che ti aspetti un output falso. È piuttosto facile perdere un singolo punto esclamativo quando si sfoglia il codice. (Inoltre, non dimenticare, a causa della verità di Groovy, '! 0' o'! [] 'Restituisce' true', ma 'assert [] == false' fallirà.) – OverZealous

+0

Ho provato, ma non è vero – nikli