web-dev-qa-db-fra.com

Longueur variable (dynamique) Matrices dans Java

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

105
Mohammad Sepahvand

Oui: utilisez ArrayList .

En Java, les tableaux "normaux" ont une taille fixe. Vous devez leur donner une taille et ne pouvez pas les agrandir ni les contracter. Pour changer 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 en obtenir une liste complète.

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, autoboxing/autounboxing s'en charge silencieusement pour vous, mais vous pouvez avoir un comportement étrange en fonction de ce que vous faites.

116
Pops

Les tableaux dans Java ont une taille fixe. Ce qu'il vous faut, c'est une ArrayList, 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, utilisez ints.add(y) et ints.remove(z) parmi beaucoup d'autres méthodes utiles que vous pouvez trouver dans les Javadocs appropriés.

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

34
MattGrommes

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

La sélection automatique permet de rendre une liste utilisable semblable à un tableau, vous pouvez simplement y insérer des valeurs int:

List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
23
Mnementh
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

10
Anuj Dhiman

Je ne suis pas d'accord avec les réponses précédentes suggérant ArrayList, parce que ArrayList est pas un tableau dynamique, mais une liste adossée à un tableau. La différence est que vous ne pouvez pas faire ce qui suit:

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

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

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

  2. Si vous avez un grand nombre de nombres, NEVER utilisez List et la liste de sélection automatique,

    List <Integer> list

Pour chaque int unique, un nouvel Integer est créé automatiquement. Vous constaterez qu'il devient lent lorsque la taille de la liste augmente. Ces entiers sont des objets inutiles. Dans ce cas, utiliser une taille estimée serait mieux,

int[] array = new int[ESTIMATED_SIZE];
7
Hao Deng

Vous ne pouvez pas changer 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 dans le nouveau.

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

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

4
Thiago Chaves

Pourquoi ne pas utiliser un List? Par exemple, ArrayList<integer>

4
Konrad Garus