341 votes

Moyen simple de trouver si deux listes différentes contiennent exactement les mêmes éléments ?

Ce qui est le plus simple pour savoir si deux Listes contiennent exactement les mêmes éléments, dans les bibliothèques de base de Java?

Il ne devrait pas d'importance si les deux Listes sont la même instance ou pas, et il ne devrait pas d'importance si le paramètre de type de la Listes sont différentes.

par exemple

List list1
List<String> list2; 
// ... construct etc

list1.add("A");
list2.add("A"); 
// the function, given these two lists, should return true

Il y a probablement quelque chose à me regarder en face, je sais :-)


EDIT: Pour préciser, je cherchais exactement les mêmes éléments et le nombre d'éléments, dans l'ordre.


EDIT: Merci pour la réponse évidente, je ne pouvais pas les voir pour la recherche :-)

Bien que toutes les réponses jusqu'à présent sont corrects, certains le sont plus que d'autres, donc je vais attendre un peu pour le meilleur et arrondis réponse avant de l'accepter.

471voto

Laurence Gonsalves Points 50783

Si vous vous souciez de l'ordre, alors il suffit d'utiliser la méthode equals:

list1.equals(list2)

À partir de la javadoc:

Compare l'objet spécifié avec cette liste pour l'égalité. Retourne true si et seulement si l'objet spécifié est aussi une liste, les deux listes ont la même taille, et toutes les paires correspondantes de les éléments dans les deux listes sont égales. (Deux éléments e1 et e2 sont égales si (e1==null ? e2==null : e1.equals(e2)).) En d'autres termes, deux les listes sont définies à être égales si elles contiennent les mêmes éléments dans les mêmes ordre. Cette définition s'assure que la méthode equals fonctionne correctement à travers les différentes implémentations de la Liste de l'interface.

Si vous voulez vérifier indépendant de la commande, vous pouvez copier tous les éléments de décors et d'utilisation est égale à la résultante des Ensembles:

Set<Object> set1 = new Set<Object>();
set1.addAll(list1);
Set<Object> set2 = new Set<Object>();
set2.addAll(list2);
set1.equals(set2)

Un inconvénient de cette approche est qu'il ne vérifie pas les doublons exactement. par exemple: si list1 ["A", "B", "A"] et list2 ["A", "B", "B"] l'approche dirais même qu'ils sont égaux.

Si vous ne voulez pas de ces à être traités comme des égaux, mais vous n'avez pas de soins sur commande, vous pouvez trier les listes avant de les comparer ou vous pourriez faire la même chose que la série approche, mais avec un Multiset (ne faisant pas partie de la norme bibliothèques, mais Google Goyave est un bon.

116voto

Tom Points 6907

J'ai posté un tas de trucs dans les commentaires, je pense qu'il mérite sa propre réponse.

Comme tout le monde le dit ici, en utilisant equals() dépend de l'ordre. Si vous n'avez pas de soins sur commande, vous avez 3 options.

Option 1

Utiliser containsAll(). Cette option n'est pas l'idéal, à mon avis, car il offre pire des cas, la performance, O(n^2).

Option 2

Il existe deux variantes:

2a) Si vous n'avez pas de soins sur le maintien de l'ordre devotre listes de... Collections.sort() sur les deux listes. Ensuite, utilisez l' equals(). Ce est O(nlogn), parce que vous n'deux sortes, et puis un O(n) comparaisons.

2b) Si vous avez besoin de maintenir des listes de commande, vous pouvez copier les deux listes en premier. ENSUITE, vous pouvez utiliser la solution 2a sur le copié listes. Cependant cela peut être peu attrayant, si la copie est très cher.

Cela conduit à:

Option 3

Si vos exigences sont les mêmes que la partie 2b, mais la copie est trop cher. Vous pouvez utiliser un TreeSet à faire le tri pour vous. Vidage de chaque liste dans son propre TreeSet. Il sera classé dans le jeu, et les listes initiales demeurent intacts. Procédez ensuite à l' equals() comparaison sur les deux TreeSets. L' TreeSetss peut être construit en temps O(nlogn) de temps, et l' equals() O(n).

Faites votre choix :-).

EDIT: j'ai presque oublié le même avertissement que Laurence Gonsalves points. Le TreeSet mise en œuvre permettra d'éliminer les doublons. Si vous vous souciez de doublons, vous aurez besoin d'une sorte de tri multiset.

8voto

daveb Points 24831

La méthode equals sur liste fera cela, listes sont classés, alors pour être égale deux listes doivent avoir les mêmes éléments dans le même ordre.

1voto

Pierre Points 15256
<pre><code></code><p><code></code>fonction.</p><pre><code></code></pre><p><code></code><code></code> fonction.</p></pre>

0voto

Jeremy Smyth Points 11001

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X