web-dev-qa-db-fra.com

Java ArrayList of Arrays?

Je veux créer un tableau multidimensionnel sans taille fixe.

Je dois pouvoir ajouter des éléments de String[2] à elle.

J'ai essayé de regarder:

private ArrayList<String[]> action = new ArrayList<String[2]>();

mais ça ne marche pas. Quelqu'un a-t-il d'autres idées?

43
Rumpleteaser

Devrait être

private ArrayList<String[]> action = new ArrayList<String[]>();
action.add(new String[2]);
...

Vous ne pouvez pas spécifier la taille du tableau dans le paramètre générique, ajoutez uniquement des tableaux de taille spécifique à la liste ultérieurement. Cela signifie également que le compilateur ne peut pas garantir que tous les sous-tableaux sont de la même taille, cela doit être assuré par vous.

Une meilleure solution pourrait être d'encapsuler cela dans une classe, où vous pouvez garantir la taille uniforme des tableaux en tant qu'invariant de type.

70
Péter Török

BTW. vous devriez préférer le codage par rapport à une interface.

private ArrayList<String[]> action = new ArrayList<String[]>();

Devrait être

private List<String[]> action = new ArrayList<String[]>();
12
daniel

Étant donné que la taille de votre tableau de chaînes est fixée au moment de la compilation, vous feriez mieux d'utiliser une structure (comme Pair) qui requiert exactement deux champs, et ainsi éviter les erreurs d'exécution possibles avec l'approche tableau.

Code:

Puisque Java ne fournit pas de classe Pair, vous devrez définir la vôtre.

class Pair<A, B> {
  public final A first;
  public final B second;

  public Pair(final A first, final B second) {
    this.first = first;
    this.second = second;
  }

  //
  // Override 'equals', 'hashcode' and 'toString'
  //
}

puis l'utiliser comme:

List<Pair<String, String>> action = new ArrayList<Pair<String, String>>();

[Ici, j'ai utilisé List car il est considéré comme une bonne pratique de programmer des interfaces. ]

4
missingfaktor

Comme déjà répondu, vous pouvez créer une ArrayList of String Arrays comme @ Péter Török l'a écrit;

    //Declaration of an ArrayList of String Arrays
    ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();

Lorsque vous affectez différents tableaux de chaînes à cette liste de tableaux, la longueur de chaque tableau de chaînes sera différente.

Dans l'exemple suivant, 4 tableaux de chaînes différents ont été ajoutés, leurs longueurs varient.

String Array #1: len: 3
String Array #2: len: 1
String Array #3: len: 4
String Array #4: len: 2

Le code de démonstration est comme ci-dessous;

import Java.util.ArrayList;

public class TestMultiArray {

    public static void main(String[] args) {
        //Declaration of an ArrayList of String Arrays
        ArrayList<String[]> listOfArrayList = new ArrayList<String[]>();

        //Assignment of 4 different String Arrays with different lengths
        listOfArrayList.add( new String[]{"line1: test String 1","line1: test String 2","line1: test String 3"}  );
        listOfArrayList.add( new String[]{"line2: test String 1"}  );
        listOfArrayList.add( new String[]{"line3: test String 1","line3: test String 2","line3: test String 3", "line3: test String 4"}  );
        listOfArrayList.add( new String[]{"line4: test String 1","line4: test String 2"}  );

        // Printing out the ArrayList Contents of String Arrays
        // '$' is used to indicate the String elements of String Arrays
        for( int i = 0; i < listOfArrayList.size(); i++ ) {
            for( int j = 0; j < listOfArrayList.get(i).length; j++ )
                System.out.printf(" $ " + listOfArrayList.get(i)[j]);

            System.out.println();
        }

    }
}

Et la sortie est la suivante;

 $ line1: test String 1 $ line1: test String 2 $ line1: test String 3
 $ line2: test String 1
 $ line3: test String 1 $ line3: test String 2 $ line3: test String 3 $ line3: test String 4
 $ line4: test String 1 $ line4: test String 2

Indiquez également que vous pouvez initialiser un nouveau tableau de Sting comme ci-dessous;

new String[]{ str1, str2, str3,... }; // Assuming str's are String objects

C'est la même chose avec;

String[] newStringArray = { str1, str2, str3 }; // Assuming str's are String objects

J'ai écrit cette démonstration juste pour montrer qu'aucun objet ArrayList, tous les éléments sont des références à différentes instanciations de tableaux de chaînes, donc la longueur de chaque tableau de chaînes ne doit pas nécessairement être la même, ni C'est important.

ne dernière note: Il sera préférable d'utiliser ArrayList dans une interface List, au lieu de celle que vous avez utilisée dans votre question.

Il sera préférable d'utiliser l'interface List comme ci-dessous;

    //Declaration of an ArrayList of String Arrays
    List<String[]> listOfArrayList = new ArrayList<String[]>();
3
Levent Divilioglu
ArrayList<String[]> action = new ArrayList<String[]>();

Pas besoin de String[2];

3
Koerr

Cela fonctionne très bien.

ArrayList<String[]> a = new ArrayList<String[]>();
    a.add(new String[3]);
    a.get(0)[0] = "Zubair";
    a.get(0)[1] = "Borkala";
    a.get(0)[2] = "Kerala";
System.out.println(a.get(0)[1]);

Le résultat sera

Borkala
0
ZBorkala