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?

Mohammad Sepahvand
la source

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.

Pops
la source
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.

MattGrommes
la source
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);
Mnementh
la source
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

cspann
la source
Je crois que vous vouliez le lier à codereply.com/answer/6i5bur/java-dynamic-arrays.html
Amit Kumar Gupta
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

Anuj Dhiman
la source
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];
Hao Deng
la source
4

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

Konrad Garus
la source
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).

Thiago Chaves
la source
-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

Personne
la source
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