Existe-t-il un moyen rapide (et agréable) de supprimer un élément d'un tableau en Java?
Réponses
Trop de publicités?Votre question n'est pas très clair. À partir de votre propre réponse, je peux dire mieux ce que vous essayez de faire:
public static String[] removeElements(String[] input, String deleteMe) {
List result = new LinkedList();
for(String item : input)
if(!deleteMe.equals(item))
result.add(item);
return result.toArray(input);
}
NB: Ce n'est pas testée. La vérification des erreurs est laissé comme exercice au lecteur (je jetterais IllegalArgumentException si l'entrée ou deleteMe est nulle; une liste vide sur null entrée de la liste n'a pas de sens. La suppression des Chaînes vides de la matrice peut avoir du sens, mais je vais laisser ça comme un exercice trop; actuellement, il va jeter un NPE quand il essaie de l'appeler égale sur deleteMe si deleteMe est null).
Les choix que j'ai fait ici:
J'ai utilisé une LinkedList. Itération doit être tout aussi rapide, et vous éviter tout changement de taille, ou de l'allocation de trop grandes d'une liste si vous finissez par la suppression de beaucoup d'éléments. Vous pourriez utiliser une ArrayList, et de définir la taille initiale de la longueur de l'entrée. Il n'y aurait probablement pas faire beaucoup de différence.
Le meilleur choix serait d'utiliser un ensemble, mais si c'est pour une raison quelconque, utilisez:
http://java.sun.com/j2se/1.4.2/docs/api/java/lang/System.html#arraycopy(java.lang.Objet, int, java.lang.Objet, int, int)
Regarder les docs. Vous pouvez l'utiliser pour copier à partir de et pour la même matrice avec un léger décalage.
Donc pour supprimer un élément:
public void removeElement(Object[] a, int del) {
System.arraycopy(a,del+1,a,del,a.length-1-del);
}
Edit en réponse au commentaire:
Ce n'est pas une bonne façon, c'est vraiment la seule façon acceptable.
Pour allouer une collection (crée un nouveau tableau), puis supprimer un élément (dont la collection fera à l'aide de arraycopy) puis d'appeler toArray (crée un DEUXIÈME tableau) pour tous les supprimer nous amène au point où il n'est pas de l'optimisation de problème, c'est pénalement mauvaise programmation.
Supposons que vous ayez un tableau reprenant, disons, 100 mo de ram. Maintenant, vous voulez parcourir et de le supprimer de 20 éléments.
Lui donner un essai...
Je sais que vous SUPPOSEZ qu'il ne va pas être très grand, ou que, si vous étiez la suppression que beaucoup d'à la fois vous auriez du code différemment, mais j'ai corrigé beaucoup de code où quelqu'un a fait des hypothèses comme ça.