2010-03-05 6 views
2

J'essaie de supprimer un int [] à partir d'une ArrayList. En raison de mon code, je n'ai que les valeurs, donc je crée le tableau, puis j'appelle remove();Supprimer int [] de ArrayList <int[]>

int[] pos = new int[]{0,1}; 
positionList.remove(pos); 

positionList est le corrisponding ArrayList

Cela ne fait fonctionne pas. Y at-il une autre possibilité que itérer dans la liste comme

for (int[] pos : positionList) { 
    if (posX == pos[0] && posY == pos[1]) { 
    positionList.remove(pos); 
    break; 
    } 
} 

Répondre

7

En regardant le posX et posY, je suis curieux de savoir si quelque chose comme ArrayList<Point> est une meilleure solution pour vous.

La raison pour laquelle le remove n'a pas pu trouver le tableau est que le nouveau tableau n'est pas equals dans le tableau déjà dans la collection.

(new int[0]).equals(new int[0]) // false! 

Si vous créer votre propre classe Point, alors vous pouvez @Override equals à se comporter comme vous voulez, et vous pouvez simplement appeler remove(new Point(posX, posY)).

Vous devriez également envisager d'avoir une place Set<Point> positionList, car les mises en œuvre offrent le retrait beaucoup plus rapide (O(1) pour HashSet, O(log N) pour TreeSet). Rappelez-vous à @Override hashCode (que vous avez à faire de toute façon si vous @Override equals), et faites Point implements Comparable<Point> (ou fournissez un Comparator<Point> externe) si vous voulez utiliser TreeSet ou avez besoin de trier les points dans d'autres contextes.

Si votre int[] a de nombreux éléments et une coutume Point classe n'est pas applicable, alors vous voudrez peut-être envisager de passer à la place List<Integer> (voir aussi: Effective Java 2e édition, point 25: préférer des listes à des tableaux). Il a le comportement equals dont vous avez besoin. C'est plus lent, mais ça peut être encore assez rapide. Enfin, si vous insistez pour utiliser int[], vous pouvez simplement l'insérer dans votre propre classe IntArray et utiliser un ArrayList<IntArray> à la place. @Override equals et hashCode respectivement pour utiliser Arrays.equals(int[], int[]) et hashCode(int[]).

+1

+1 pour la suggestion d'utiliser HashSet au lieu d'une liste. ArrayList est certainement la collection la plus inefficace pour les suppressions ad hoc. –

+0

Oui, j'essaie de couvrir toutes les bases pertinentes de manière incrémentale dans mes réponses. – polygenelubricants

+1

+1 sur tant de niveaux. –

7

C'est une mauvaise pratique d'utiliser des tableaux pour conserver des données qui ne sont pas une séquence d'éléments, littéralement.

Votre tableau est en fait un détenteur de données avec deux polices distinctes. Définissez une classe de coordonnées et remplacez Object.equals(Object). Ensuite, votre code deviendra beaucoup plus propre:

ArrayList<MyPoint> positionList; 
// fill list 
MyPoint testPos = new MyPoint(0, 1); 
positionList.remove(testPos); 

Vous devriez deviner comment définir MyPoint ..

+0

ou mieux encore, utilisez la classe Point2D ou Point réelle du JDK, http://java.sun.com/javase/6/docs/api/java/awt/geom/Point2D.html – basszero

+2

N'oubliez pas de surcharger l'objet # hashCode() aussi! http://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java –

+0

Il y a deux problèmes avec Point2D. D'abord c'est abstrait alors Dimitri aurait besoin d'écrire une classe quand même. Deuxièmement, il utilise des doubles tandis que Dimitri utilise des entiers. Mon point général était l'utilisation de structures de données au lieu de tableaux. –

Questions connexes