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

Existe-t-il un moyen rapide (et intéressant) de supprimer un élément d’un tableau en Java?

Vous pouvez utiliser les ArrayUtils de commons lang.

array = ArrayUtils.removeElement(array, element) 

Bibliothèque commons.apache.org: Javadocs

Votre question n’est pas très claire. De votre propre réponse, je peux mieux dire ce que vous essayez de faire:

 public static Ssortingng[] removeElements(Ssortingng[] input, Ssortingng deleteMe) { List result = new LinkedList(); for(Ssortingng item : input) if(!deleteMe.equals(item)) result.add(item); return result.toArray(input); } 

NB: Ceci n’a pas été testé. La vérification des erreurs rest un exercice pour le lecteur (je lancerais une exception IllegalArgumentException si input ou deleteMe est nul; une liste vide sur une entrée de la liste NULL n’a pas de sens. Supprimer les chaînes null du tableau peut être utile, mais je Je laisserai cela aussi comme exercice, actuellement, il lancera un NPE quand il essaiera d’appeler les égaux sur deleteMe si deleteMe est nul.)

Les choix que j’ai faits ici:

J’ai utilisé une LinkedList. L’itération doit être tout aussi rapide et vous éviter tout redimensionnement, ou allouer une trop grande quantité de liste si vous supprimez beaucoup d’éléments. Vous pouvez utiliser une ArrayList et définir la taille initiale à la longueur de l’entrée. Cela ne ferait probablement pas beaucoup de différence.

Le meilleur choix serait d’utiliser une collection, mais si c’est pour une raison quelconque, utilisez arraycopy . Vous pouvez l’utiliser pour copier depuis et vers le même tableau avec un décalage légèrement différent.

Par exemple:

 public void removeElement(Object[] arr, int removedIdx) { System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx); } 

Modifier en réponse à un commentaire:

Ce n’est pas une autre bonne façon, c’est vraiment la seule façon acceptable.

Pour allouer une collection (crée un nouveau tableau), puis supprimez un élément (que la collection utilisera à l’aide de arraycopy), puis appuiera sur elle (crée un nouveau tableau SECOND) car chaque suppression nous amène au point où ce n’est pas un problème d’optimisation , c’est une mauvaise programmation criminelle.

Supposons que vous ayez un tableau prenant, disons, 100 Mo de ram. Maintenant, vous voulez itérer dessus et supprimer 20 éléments.

Essaie…

Je sais que vous ASSUMEZ que ça ne va pas être si grand, ou que si vous supprimiez autant de fois vous le coderiez différemment, mais j’ai corrigé énormément de code là où quelqu’un a fait des suppositions comme ça.

Vous ne pouvez pas supprimer un élément du tableau Java de base. Jetez un coup d’œil à diverses collections et à ArrayList à la place.

Une solution intéressante serait d’utiliser une liste au lieu d’un tableau en premier lieu.

 List.remove(index) 

Si vous devez utiliser des tableaux, deux appels à System.arraycopy seront probablement les plus rapides.

 Foo[] result = new Foo[source.length - 1]; System.arraycopy(source, 0, result, 0, index); if (source.length != index) { System.arraycopy(source, index + 1, result, index, source.length - index - 1); } 

( Arrays.asList est également un bon candidat pour travailler avec des tableaux, mais il ne semble pas prendre en charge la remove .)

Je pense que la question demandait une solution sans l’utilisation de l’API Collections. On utilise des tableaux pour les détails de bas niveau, où les performances sont importantes, ou pour une intégration SOA faiblement couplée. Dans les versions ultérieures, il est correct de les convertir en collections et de les transmettre à la logique métier.

Pour les performances de bas niveau, il est généralement déjà masqué par le mélange rapide et impératif d’états par les boucles for, etc. Dans ce cas, la conversion entre les collections et les baies est lourde, illisible et nécessite beaucoup de ressources.

Au fait, TopCoder, n’importe qui? Toujours ces parameters de tableau! Soyez donc prêt à les gérer quand vous êtes dans l’arène.

Voici mon interprétation du problème et une solution. La fonctionnalité est différente de celle de Bill K et jelovirt . En outre, il gère avec élégance le cas où l’élément n’est pas dans le tableau.

J’espère que cela pourra aider!

 public char[] remove(char[] symbols, char c) { for (int i = 0; i < symbols.length; i++) { if (symbols[i] == c) { char[] copy = new char[symbols.length-1]; System.arraycopy(symbols, 0, copy, 0, i); System.arraycopy(symbols, i+1, copy, i, symbols.length-i-1); return copy; } } return symbols; } 

Vous pouvez utiliser l’ API ArrayUtils pour le supprimer de manière “agréable”. Il implémente de nombreuses opérations (supprimer, rechercher, append, contenir, etc.) sur les tableaux.
Regarde. Cela m’a simplifié la vie.

Certaines conditions préalables sont nécessaires pour celles écrites par Bill K et dadinn

 Object[] newArray = new Object[src.length - 1]; if (i > 0){ System.arraycopy(src, 0, newArray, 0, i); } if (newArray.length > i){ System.arraycopy(src, i + 1, newArray, i, newArray.length - i); } return newArray; 

Vous ne pouvez pas modifier la longueur d’un tableau, mais vous pouvez modifier les valeurs que l’index contient en copiant les nouvelles valeurs et les stocker dans un numéro d’index existant. 1 = mike, 2 = jeff // 10 = george 11 passe à 1 micro écrasant.

 Object[] array = new Object[10]; int count = -1; public void myFunction(Ssortingng ssortingng) { count++; if(count == array.length) { count = 0; // overwrite first } array[count] = ssortingng; } 

ok, merci beaucoup maintenant j’utilise sth comme ceci:

 public static Ssortingng[] removeElements(Ssortingng[] input, Ssortingng deleteMe) { if (input != null) { List list = new ArrayList(Arrays.asList(input)); for (int i = 0; i < list.size(); i++) { if (list.get(i).equals(deleteMe)) { list.remove(i); } } return list.toArray(new String[0]); } else { return new String[0]; } } 

Copiez votre tableau d’origine dans un autre tableau, sans que l’élément soit supprimé.

Une méthode plus simple consiste à utiliser une liste, un ensemble … et à utiliser la méthode remove ().

Échangez l’élément à supprimer avec le dernier élément, si le redimensionnement du tableau n’est pas un intérêt.

J’espère que vous utiliserez les collections java collection / java commons!

Avec java.util.ArrayList, vous pouvez faire les choses suivantes:

 yourArrayList.remove(someObject); yourArrayList.add(someObject); 

Utilisez un ArrayList :

 alist.remove(1); //removes the element at position 1 

Bien sûr, créer un autre tableau 🙂