Tableaux de longueur variable (dynamiques) en Java


108

Je me demandais comment initialiser un tableau d'entiers de sorte que sa taille et ses valeurs changent tout au long de l'exécution de mon programme, des suggestions?

Réponses:


121

Oui: utilisez ArrayList .

En Java, les tableaux "normaux" sont de taille fixe. Vous devez leur donner une taille et ne pouvez pas les agrandir ou les contracter. Pour modifier la taille, vous devez créer un nouveau tableau et copier les données souhaitées - ce qui est inefficace et pénible pour vous.

Heureusement, il existe toutes sortes de classes intégrées qui implémentent des structures de données communes, ainsi que d'autres outils utiles. Vous voudrez vérifier l'API Java 6 pour une liste complète d'entre eux.

Une mise en garde: ArrayList ne peut contenir que des objets (par exemple des entiers), pas des primitives (par exemple des ints). Dans la PLUPART des cas, l' autoboxing / l'autounboxing s'en chargera pour vous en silence, mais vous pourriez avoir un comportement étrange en fonction de ce que vous faites.


2
Je me demande pourquoi le code suivant est correct en java? int[] array = new int[size]; sizeest une variable, mais la longueur d'un tableau doit être fixe, ai-je raison? @Lord Torgamus
jerry_sjtu

12
@jerry_sjtu ouais, le tableau ne change pas de taille pour correspondre à sizemesure que le programme continue; il obtient la taille qui se trouve sizelorsque cette ligne est exécutée.
Pops

Chaque fois que je supprime un élément d'une ArrayList, je me retrouve avec un nullà la fin. Des idées pourquoi?
Aaron Franke

37

Les tableaux en Java sont de taille fixe. Ce dont vous avez besoin, c'est d'une ArrayList, l'une des nombreuses collections extrêmement précieuses disponibles en Java.

Au lieu de

Integer[] ints = new Integer[x]

tu utilises

List<Integer> ints = new ArrayList<Integer>();

Ensuite, pour changer la liste que vous utilisez ints.add(y)etints.remove(z) parmi de nombreuses autres méthodes pratiques, vous pouvez trouver dans les Javadocs appropriés.

Je recommande fortement d'étudier les classes Collections disponibles en Java car elles sont très puissantes et vous offrent beaucoup de fonctionnalités intégrées que les débutants en Java ont tendance à essayer de se réécrire inutilement.


voulez travailler jusqu'à ce que j'aie essayé: List <Integer> ints = new ArrayList <Integer> ();
gorbysbm

5
Pourquoi utilisez-vous à la List<Integer>place de ArrayList<Integer>?
Dean Meehan

25

Les tableaux ont une taille fixe une fois instanciés. Vous pouvez utiliser une liste à la place.

L'autoboxing rend une liste utilisable similaire à un tableau, vous pouvez y mettre simplement des int-values:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);

2
Pourquoi déclarez-vous une variable de référence de type List, et non ArrayList?
LppEdd

2
Parce qu'il vous permet de basculer simplement entre les implémentations de List si nécessaire, il vous suffit de changer le nouveau XYZList (). Si la variable est déclarée comme ArrayList, oyu peut utiliser des méthodes spécifiques à cette implémentation, rendant un changement plus compliqué.
Mnementh le

1
Merci, je comprends.
LppEdd

11

Je ne suis pas d'accord avec les réponses précédentes suggérant ArrayList, car ce ArrayListn'est pas un tableau dynamique mais une liste soutenue par un tableau. La différence est que vous ne pouvez pas effectuer les opérations suivantes:

ArrayList list = new ArrayList(4);
list.put(3,"Test");

Il vous donnera une IndexOutOfBoundsException car il n'y a pas encore d'élément à cette position, même si le tableau de sauvegarde permettrait une telle addition. Vous devez donc utiliser une implémentation Array extensible personnalisée comme suggérée par @ randy-lance



Je ne sais pas si ArrayList a une méthode put comme je le vois dans le code source Java8. J'essaie juste de savoir comment il se comporte avec une capacité donnée. Cependant trouvé la méthode ArrayList.add ().
Sanjeet A

11
Simple code for dynamic array. In below code then array will become full of size we copy all element to new double size array(variable size array).sample code is below 

public class DynamicArray {
 static   int []increaseSizeOfArray(int []arr){
          int []brr=new int[(arr.length*2)];
          for (int i = 0; i < arr.length; i++) {
         brr[i]=arr[i];     
          }
          return brr;
     }
public static void main(String[] args) {
     int []arr=new int[5];
      for (int i = 0; i < 11; i++) {
          if (i<arr.length) {
              arr[i]=i+100;
          }
          else {
              arr=increaseSizeOfArray(arr);
              arr[i]=i+100;
          }        
     }

for (int i = 0; i < arr.length; i++) {
     System.out.println("arr="+arr[i]);
}    
}

}

Source: Comment créer un tableau dynamique


7
  1. Il est recommandé d'utiliser List pour traiter les petites tailles.

  2. Si vous avez un grand nombre de nombres, n'utilisez JAMAIS la liste et l'autoboxing,

    Liste <Integer> liste

Pour chaque entier, un nouvel entier est créé automatiquement. Vous constaterez que cela devient lent lorsque la taille de la liste augmente. Ces nombres entiers sont des objets inutiles. Dans ce cas, il serait préférable d'utiliser une taille estimée,

int[] array = new int[ESTIMATED_SIZE];

4

Que diriez-vous d'utiliser un à la Listplace? Par exemple,ArrayList<integer>


4

Vous ne pouvez pas modifier la taille d'un tableau. Vous pouvez cependant créer un nouveau tableau avec la bonne taille et copier les données de l'ancien tableau vers le nouveau.

Mais votre meilleure option est d'utiliser IntList à partir de jacarta commons. ( ici )

Cela fonctionne comme un List mais prend moins d'espace et est plus efficace que cela, car il stocke les int au lieu de stocker les objets wrapper sur les int (c'est ce qu'est la classe Integer).


-4

J'ai répondu à cette question et non vous n'avez pas besoin d'un arraylist ou de toute autre chose, c'était une mission et je l'ai complétée donc oui les tableaux peuvent augmenter en taille. Voici le lien Comment utiliser Java Dynamic Array et voici le lien pour ma question à laquelle j'ai répondu Java Dynamic Arrays


1
c'est tout simplement faux. la réponse liée appelle System.arrayCopy (), copiant l'ancien tableau dans un nouveau avec une taille accrue, puis ajoutant la nouvelle entrée. les tableaux ne peuvent toujours pas avoir une taille dynamique.
katzenhut
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.