web-dev-qa-db-fra.com

Les tableaux équivalent à ignorer l'ordre

Duplicata possible:
Java: vérification de l'égalité des tableaux (l'ordre n'a pas d'importance)

J'ai deux tableaux:

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};

Je dois vérifier si les deux contiennent les mêmes éléments (et de même longueur) indépendamment de l'ordre des éléments.

J'ai essayé Arrays.equals(a1, a2) mais il considère l'ordre des éléments. org.Apache.commons.lang.ArrayUtils Ne fournit pas cette chose.

Je sais que je peux obtenir le même résultat en créant ma propre méthode (en vérifiant la même longueur, puis en triant les deux tableaux et en utilisant Arrays.equals(a1, a2)) mais je voulais savoir si cette chose est fournie dans une API ou s'il y a plus intelligent façon de faire de même.

30
Anil Bharadia

Si vous avez ces tableaux dans quelque chose héritant de Collection, vous pouvez simplement utiliser collection.containsAll( otherCollection ) à partir de l'interface Collection. Cependant, vous devrez également comparer les longueurs des deux pour vérifier qu'un ensemble n'est pas un sur-ensemble de l'autre.

(Merci à Aardvarkk et aux jeux de tarte.)

http://docs.Oracle.com/javase/6/docs/api/Java/util/Collection.html#containsAll (Java.util.Collection)

Remarque: cela fonctionnera jusqu'à un certain point. Ceci est défini pour vérifier au moins un de tout élément existant. Autrement dit, si vous avez 3 a valeurs dans une collection et 7 a valeurs dans l'autre, cela ne sera pas oblige nécessairement à les qualifier d'inégaux.

Exemples:

[a, b, c] == [c, a, b]             // Works -- Mixed order
[a, b, c, d, d] == [a, b, d, c, d] // Works -- Mixed order with repeats
[a, b, c, d, d] == [a, b, b, c, d] // FAILS -- Different repeats
[a, b, c, d, d] != [a, b, c, d]    // Works -- Length differs with repeats
[a, b, c, d] != [a, b, c]          // Works -- Length differs
[a, b, d] != [a, b, c]             // Works -- Disjoint sets
24
BlackVegetable

je pense que cela peut fonctionner pour vous, triez le premier tableau avec

Arrays.sort(Object[]);

et après cela, vous pouvez comparer avec

Arrays.equals(Object[],Object[]);

le code complet est:

String[] a1 = {"a", "b", "c"};
String[] a2 = {"c", "b", "a"};
Arrays.sort(a2);

boolean result= Arrays.equals(a1, a2);
22
satvinder singh

Convertissez les listes en ensembles avant de les comparer:

new HashSet( Arrays.asList( a1 )).equals( new HashSet( Arrays.asList( a2 ) ));

Alternativement, vous pouvez trier les tableaux à l'aide de Arrays.sort() mais cela pourrait casser le code qui dépend de l'ordre des éléments dans les tableaux.

8
Aaron Digulla

Utilisation Java.util.Set méthode equals. Compare deux ensembles ont la même taille, et chaque membre de l'ensemble spécifié est contenu dans un autre ensemble.

1
Roman C