Pourquoi mon ArrayList.supprimer(id) d'appel ne fonctionne pas?
J'ai une liste de tableaux, qui comprend un certain nombre d'éléments que je veux supprimer. J'ai les id des éléments à supprimer stockées dans une autre liste. Compris le code suivant devrait fonctionner de façon triviale, mais pour une raison quelconque, le supprimer() les appels sont de retour pour valeur faux:
ArrayList<Integer> toRemove = new ArrayList<Integer>();
ArrayList<JCheckBox> al = new ArrayList<JCheckBox>();
/* Code that adds a bunch of items to al, and a few integers to toRemove */
System.out.println("Size before removing: " + al.size());
for (int i = toRemove.size() - 1; i >= 0; i--) {
System.out.println("Removing id: " + toRemove.get(i) + ": ");
System.out.println(al.get(toRemove.get(i)));
System.out.println(al.remove(toRemove.get(i)));
}
System.out.println("Size after removing: " + al.size());
Que j'obtiendrais si le get() appel a également présenté une fausse valeur, mais il ne fait retourner l'objet en question. Ce qui me manque ici?
La sortie du code ci-dessus:
Size before removing: 3
Removing id: 2:
javax.swing.JCheckBox[...]
false
Size after removing: 3
Vous pouvez poster exacte des déclarations pour " al " et "toRemove'?
Posté le définitions demandées.
Posté le définitions demandées.
OriginalL'auteur zigdon | 2010-08-26
Vous devez vous connecter pour publier un commentaire.
Ma conjecture est que vous rencontrez un problème avec le fait que
remove()
est surchargé avec les deuxint
etObject
, tandis queget()
prend seulement uneint
. Essayezremove(toRemove.get(i).intValue())
.remove(Object)
deAbstractCollection
recherche dans la liste et supprimer l'objet, ce qui ne sera pas là parce que vous l'envoyez unInteger
et la liste a seulementJCheckBox
s. Vous tentez d'appelerremove(int)
, mais parce que vous êtes en lui donnant unInteger
, l'Objet de surcharge est appelée à la place. Par la conversion de laInteger
à unint
, vous évitez ce problèmeAussi, vous pouvez toujours être sûr que l'Id toRemove est toujours égal à l'index? Si toRemove n'est pas plus à moins de l'ordre, il ne sera pas.
Cette réponse ne considère pas
NULL
objetsLa question implique il n'y a pas
null
s. Si il y avait unnull
puis la ligne au-dessus de laremove()
appel jeter un pointeur null alors que l'unboxing de l'argument à l'extérieurget()
appel.OriginalL'auteur ILMTitan
Il y a deux problèmes avec votre code.
Tout d'abord, le mal "toRemove" la méthode est chargé. Lorsque vous appelez "toRemove.get(i)", la valeur de retour est autoboxed en java.lang.Entier, au lieu d'un int. Par conséquent, java.util.Liste#remove(Object) est appelée à la place de java.util.Liste#remove(int). C'est en essayant de supprimer un objet Integer, et renvoie la valeur false.
Si vous avez jeté un Entier de type int, la méthode désirée se invoquée.
Deuxième problème: à chaque fois que vous supprimez un élément de la liste, l'index de tous les éléments de changement, que ces éléments sont "déplacé" vers le bas. Il existe plusieurs façons de contourner ce problème. L'un est de trier votre liste d'index dans l'ordre décroissant. Une autre serait d'utiliser un ensemble d'indices, de créer un nouveau tableau, et les copier dans le nouveau tableau uniquement les éléments dont l'index n'est pas dans le jeu.
OriginalL'auteur dhm
javax.swing.JCheckBox[...]?
Aussi, essayez de supprimer des éléments par des Objets de valeur, comme ici:
http://www.easywayserver.com/blog/java-remove-element-in-arraylist/
OriginalL'auteur Hila's Master