171 votes

Supprimer un élément d'un tableau (Java)

Existe-t-il un moyen rapide (et agréable) de supprimer un élément d'un tableau en Java?

267voto

Peter Lawrey Points 229686

Vous pouvez utiliser ArrayUtils de commons lang.

 array = ArrayUtils.removeElement(array, element)
 

Javadocs

47voto

Adam Jaskiewicz Points 7485

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.

46voto

Bill K Points 32115

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.

40voto

Vlad Gudim Points 10161

Vous ne pouvez pas supprimer un élément du tableau Java base. Jetez un oeil à différentes Collections et ArrayList au lieu de cela.

16voto

jelovirt Points 3531

Nice cherche solution serait d’utiliser une liste au lieu de tableau en premier lieu.

Si vous avez pour utiliser les tableaux, deux appels à `` sera très probablement le plus rapide.

( est également un bon candidat pour travailler avec des tableaux, mais il ne semble pas soutenir .)

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