web-dev-qa-db-fra.com

Supprimer un élément du tableau et réduire le tableau

Comment puis-je supprimer un élément d'un tableau, puis redimensionner le tableau à une taille inférieure? De même, comment puis-je augmenter la capacité si je dois ajouter un autre article?

33
Joe

La taille d'un tableau Java est fixée lorsque vous l'allouez et ne peut pas être modifiée.

  • Si vous souhaitez "agrandir" ou "réduire" un tableau existant, vous devez allouer un nouveau tableau de la taille appropriée et copier les éléments du tableau. par exemple. en utilisant System.arraycopy(...) ou Arrays.copyOf(...). Une boucle de copie fonctionne également, même si elle semble un peu maladroite ... IMO.

  • Si vous voulez "supprimer" un ou plusieurs éléments d'un tableau (au sens le plus vrai ... ne les remplacez pas uniquement par null), vous devez allouer un nouveau tableau plus petit et copier les éléments souhaités. garder.

Il existe des alternatives sous la forme de bibliothèques tierces (par exemple, Apache Commons ArrayUtils), mais vous voudrez peut-être déterminer s’il vaut la peine d’ajouter une dépendance à la bibliothèque just pour un simple méthode que vous pourriez implémenter vous-même avec 5-10 lignes de code.


C'est mieux (c'est-à-dire plus simple ... et dans de nombreux cas, plus efficace1) pour utiliser une classe List à la place d'un tableau. Cela prendra en charge (au moins) la croissance du stockage de sauvegarde. Et il existe des opérations qui consistent à insérer et à supprimer des éléments n'importe où dans la liste.

Par exemple, la classe ArrayList utilise un tableau en tant que sauvegarde et le développe automatiquement selon les besoins. Cela ne réduit pas automatiquement la taille du tableau de sauvegarde, mais vous pouvez lui indiquer de le faire en utilisant la méthode trimToSize(); par exemple.

ArrayList l = ...
l.remove(21);
l.trimToSize();  // Only do this if you really have to.

1 - Je dis que c'est "plus efficace dans de nombreux cas" parce que ArrayList utilise une stratégie simple de "doubler la taille" lorsqu'il est nécessaire d'agrandir le tableau de sauvegarde. Cela signifie que si vous développez la liste en y ajoutant de manière répétée, chaque élément sera copié en moyenne une fois de plus. En revanche, si vous faites cela avec un tableau, vous finirez par copier chaque élément de tableau près de N/2 en moyenne.

25
Stephen C

Vous ne pouvez pas redimensionner le tableau en tant que tel, mais vous pouvez créer un nouveau tableau et copier efficacement les éléments de l'ancien tableau dans le nouveau tableau à l'aide d'une fonction utilitaire comme celle-ci:

public static int[] removeElement(int[] original, int element){
    int[] n = new int[original.length - 1];
    System.arraycopy(original, 0, n, 0, element );
    System.arraycopy(original, element+1, n, element, original.length - element-1);
    return n;
}

Une meilleure approche, cependant, consisterait à utiliser un ArrayList (ou une structure de liste similaire) pour stocker vos données, puis à utiliser ses méthodes pour supprimer les éléments si nécessaire.

17
Mark Elliot

Utiliser ArrayUtils.removeElement(Object[],Object) de org.Apache.commons.lang est de loin le moyen le plus simple de le faire.

int[] numbers = {1,2,3,4,5,6,7};
//removing number 1
numbers =(int[])ArrayUtils.removeElement(numbers, 1);
12
azraelAT

Puisqu'un tableau a une taille fixe qui est allouée lors de sa création, votre seule option est de créer un nouveau tableau sans l'élément que vous souhaitez supprimer.

Si l'élément que vous souhaitez supprimer est le dernier élément du tableau, cela devient facile à implémenter en utilisant Arrays.copy:

int a[] = { 1, 2, 3};
a = Arrays.copyOf(a, 2);

Après avoir exécuté le code ci-dessus, a pointe maintenant sur un nouveau tableau contenant seulement 1, 2.

Sinon, si l'élément que vous souhaitez supprimer n'est pas le dernier, vous devez créer un nouveau tableau de taille 1 et y copier tous les éléments, à l'exception de celui que vous souhaitez supprimer.

L'approche ci-dessus n'est pas efficace. Si vous devez gérer une liste d'éléments mutables en mémoire, utilisez plutôt une liste. Plus précisément, LinkedList supprimera un élément de la liste dans O(1) (théoriquement le plus rapide possible).

4
Guy

J'ai créé cette fonction ou classe. Je suis un peu nouveau mais mon ami avait besoin de ça aussi, alors j'ai créé ça:

public String[] name(int index, String[] z ){
    if(index > z.length){
        return z;
    } else {
        String[] returnThis = new String[z.length - 1];
        int newIndex = 0;
        for(int i = 0; i < z.length; i++){
            if(i != index){
                returnThis[newIndex] = z[i];
                newIndex++;
            }
        }
        return returnThis; 
    }
}

Étant donné que c'est très intéressant, j'ai pensé le poster ici.

2
Engineer
object[] newarray = new object[oldarray.Length-1];

for(int x=0; x < array.Length; x++)
{
  if(!(array[x] == value_of_array_to_delete))
  // if(!(x == array_index_to_delete))
   {
     newarray[x] = oldarray[x];
   }
}

Il n'y a aucun moyen de réduire la taille d'un tableau après sa création, mais vous pouvez copier le contenu dans un autre tableau de taille inférieure.

1
Mike

Les tableaux sont de taille fixe, vous ne pouvez pas les redimensionner après les avoir créés. Vous pouvez supprimer un élément existant en le définissant sur null:

objects[4] = null;

Mais vous ne pourrez pas supprimer tout cet emplacement du tableau et réduire sa taille de 1.

Si vous avez besoin d'un tableau de taille dynamique, vous pouvez utiliser un ArrayList. Avec lui, vous pouvez add() et remove() objets, et il grossira ou diminuera au besoin.

0
BoltClock

sans utiliser la méthode System.arraycopy, vous pouvez supprimer un élément d’un tableau avec les éléments suivants:

    int i = 0;
    int x = 0;
    while(i < oldArray.length){
        if(oldArray[i] == 3)i++;

        intArray[x] = oldArray[i];
        i++;
        x++;
    }

où 3 est la valeur que vous souhaitez supprimer.

0
tkolleh