86 votes

Comment puis-je supprimer des objets à partir d'un tableau en Java?

Étant donné un tableau de n Objets, disons que c'est un tableau de chaînes de caractères, et il a les valeurs suivantes:

foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";

Que dois-je faire pour supprimer/supprimer toutes les chaînes/objets égal à "a" dans le tableau?

114voto

Chris Jester-Young Points 102876

[Si vous voulez un peu de prêt-à-utiliser le code, veuillez défiler vers mon "Edit3" (après la coupe). Le reste est ici pour la postérité.]

Pour étoffer Éboueur de l'idée:

List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

Edit: je suis maintenant à l'aide d' Arrays.asList au lieu de Collections.singleton: singleton est limitée à une inscription, alors que l' asList approche permet d'ajouter d'autres cordes à filtrer plus tard: Arrays.asList("a", "b", "c").

Edit2: L'approche ci-dessus conserve le même tableau (le tableau est toujours la même longueur); l'élément après la dernière est définie sur null. Si vous voulez un nouveau tableau de taille exactement comme nécessaire, utilisez ceci à la place:

array = list.toArray(new String[0]);


Edit3: Si vous utilisez ce code sur une base fréquente la même classe, vous pouvez envisager d'ajouter ceci à votre classe:

private static final String[] EMPTY_STRING_ARRAY = new String[0];

Ensuite, la fonction devient:

List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

Ce sera alors arrêtez de souiller votre tas inutile chaîne vide des tableaux qui seraient autrement newed à chaque fois que votre fonction est appelée.

cynicalman de la suggestion (voir les commentaires) sera également aider avec les tas de détritus, et de l'équité, je tiens à mentionner:

array = list.toArray(new String[list.size()]);

Je préfère mon approche, car il peut être plus facile d'obtenir la taille explicite de mal (par exemple, en appelant size() sur la mauvaise liste).

32voto

Vitalii Fedorenko Points 17469

Une alternative à Java 8:

String[] filteredArray = Arrays.stream(array)
    .filter(e -> !e.equals(foo)).toArray(String[]::new);

20voto

Dustman Points 1706

Faire un List de la matrice avec l' Arrays.asList(), et appelez - remove() sur tous les éléments appropriés. Puis appelez toArray() sur la "Liste" à faire de retour dans un nouveau tableau.

Pas très performant, mais si vous encapsuler correctement, vous pouvez toujours faire quelque chose de plus rapide plus tard.

7voto

bugs_ Points 1407

Vous pouvez utiliser une bibliothèque externe:
org.apache.commons.lang.ArrayUtils.supprimer(java.lang.Objet tableau [], int index)
Il est en projet Apache Commons Lang http://commons.apache.org/lang/

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