Soustrayant une arrayList d'une autre arrayList
J'ai deux arrayLists et je suis en train de "soustraire" une liste de tableaux à partir d'un autre. Par exemple, si j'ai un arrayList [1,2,3] et je suis en train de soustraire [0, 2, 4] l'résultant arrayList doit être [1,3].
List<Integer> a = new ArrayList<>(Arrays.asList(1, 2, 3));
List<Integer> b = Arrays.asList(0, 2, 4);
subtract(a,b) //should return [1,3]
Voici mon code.
//returns a new IntSet after subtracting a from b
//.minus().toString()
ArrayList<Integer> minusArray = new ArrayList<Integer>();
minusArray.addAll(array1);
for(int i =0; i< minusArray.size(); i++){
for(int j = 0; j < array2.size(); j++){
if(minusArray.get(i).equals(array2.get(j))){
minusArray.remove(i);
if(i == 0){
;
}
else if(j == 0){
;
}
else{
i = 0;
j = 0;
}
}
else{}
}
}
return minusArray;
Mon code fonctionne dans certains cas, comme si arrayList1 = [4,6]
et arrayList2 = [6]
il va me donner une raison de [4]
. Mais si je tente quelque chose comme [1,2,4]
et [0,4,8]
- Je obtenir cette exception:
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.get(Unknown Source)
at IntSet.minus(IntSet.java:119)
at IntSetDriver.main(IntSetDriver.java:62)
Voici le code que j'ai trouver. J'ai fait le test s'exécute à travers elle et pour moi, je pense que cela devrait fonctionner. Les entrées de l'utilisateur de ces arrayLists et ils sont triés, je ne sais pas, Hachage ou de la grande-O.
ArrayList<Integer> minusArray = new ArrayList<Integer>();
minusArray.addAll(array1);
for(int i =0; i< minusArray.size(); i++){
for(int j = 0; j < array2.size(); j++){
if(minusArray.get(i).equals(array2.get(j))){
minusArray.remove(i);
}
else{}
}
}
return minusArray;
source d'informationauteur Milwaukoholic
Vous devez vous connecter pour publier un commentaire.
Votre problème, c'est que dans votre minusArray.supprimer(...) appel, vous pouvez réduire la taille de la minusArray. Pour résoudre ce problème, démarrez au tableau.size() - 1 et compter à rebours à 0
Vérifier que - même qui ne sera pas corrigé. Vous avez besoin d'inverser l'ordre de vos boucles
Est-il une raison pour laquelle vous ne pouvez pas simplement utiliser la Liste.removeAll(Liste)?
Essayez d'utiliser la méthode de soustraction de org.apache.commons.les collections.CollectionUtils classe.
Renvoie une nouvelle Collection contenant b. La cardinalité de chaque élément e dans la Collection retournée sera la cardinalité de e dans un moins la cardinalité de e dans b, ou zéro, selon le plus élevé.
CollectionUtils.soustraire(java.util.Collection une, java.util.La collecte b)
De Apache Commons Collections
Traversant le
minusArray
l'aide d'un index est une façon de faire cela, mais je vous suggère de faire usage de lacontains(Object)
méthode, ce qui vous permettra alors d'utiliserremove(Object)
pour l'élément particulier dearray2
.Bien sûr, il y a toujours la
removeAll(Collection)
qui fait à peu près tout ce dont vous avez besoin...Vous pouvez utiliser org.apache.commons.les collections.ListUtils et de faire tout ce que vous voulez dans une seule ligne,=)
Juste au cas où vous prévoyez d'utiliser Java8vous pouvez également utiliser les flux:
Cette réponse ne permet pas de manipuler la liste d'origine et si c'est le but que nous pouvons utiliser
remove
. Aussi, nous pouvons utiliserforEach
(méthode par défaut dansIterator
) ou de flux avec filtre.Je devine que vous obtenez la plage de problème parce que vous avez éliminé l'un des éléments qui change de ce que la boucle interne est à la recherche d' (je sais que ce problème se produit lorsque vous traitez avec la normale des Listes et des Collections).
Ce que j'ai eu à faire dans le passé pour contourner ce problème, est de créer une liste d'éléments qui doivent être supprimés (c'est ceux que l'on trouve dans la liste d'origine). Parcourir cette nouvelle liste et d'éliminer immédiatement de la liste originale des éléments sans avoir à disposer d'un itérateur se déplaçant à travers elle.
la soustraction(a,b)
a
contient maintenantCela suit le suggestion de Goyave réalisateurs sur la façon de mettre en œuvre soustraire
Qui se comporte comme cette mise en œuvre utilisés dans Apache commons
Différence de removeAll()