web-dev-qa-db-fra.com

Comment créer correctement une ArrayList of ArrayLists?

J'essaie de créer une ArrayList of ArrayLists. Je veux créer 25 ArrayLists et que ceux-ci aient des valeurs différentes. L'objectif étant de créer un dictionnaire trié par longueur de mot.

Mon code ressemble à

    for(int i = 0; i < 25; i++)
         list2D.add(list);
    for(int i = 0; i < stringList; i++)
         list2D.get(stringList.get(i).length()).add(stringList.get(i))

Le problème est que chaque liste contient les mêmes valeurs une fois celle-ci terminée.

Je sais pourquoi le problème se passe. "list" est une ArrayList, les ArrayList sont des objets et si vous éditez un objet, tout ce qui contient cet objet sera édité.

Pour résoudre le problème, j'ai essayé

    for(int i = 0; i < 25; i++){
        list = new ArrayList<String>();
        for(int i2 = 0; i2 < stringList.size(); i2++){
            if(stringList.get(i).length() == i)
                list.add(stringList.get(i2));
        }
        list2D.add(list);
    }

Mais quand je teste mon "list2D"

    for(int i = 0; i < 25; i++)
         System.out.print(list2D.get(i).size()+" ");

Je reçois

0 0 0 0 0 58110 0 58110 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

et je ne sais pas pourquoi ...

De plus, il peut être pertinent de noter que stringList contient 58110 valeurs.

Aussi, je ne veux pas avoir à faire 25 ArrayLists différents!

7
java

Merci. J'ai trouvé une solution très facile cependant ...

for(int i = 0; i < 25; i++)
    list2D.add(new ArrayList<String>());
for(int i = 0; i < Word.size(); i++)
    list2D.get(stringList.get(i).length()).add(stringList.get(i));
1
java

Je voudrais essayer ce qui suit pour faire un seul passage de la stringList

List<List<String>> dict = new ArrayList<>();
for(string s: stringsList) {
    int len = s.length();
    // add new array lists as required, could be any length, assuming << 100
    while(dict.size() <= len) dict.add(new ArrayList<String>());
    // add the string to the right list.
    dict.get(len).add(s);
}
11
Peter Lawrey

C'est facile. Par exemple, vous pouvez les créer comme ceci: http://ideone.com/3NZwWU

// just for convenience, initializes arraylist with values
static <T> ArrayList<T> AL(T... values) {
    ArrayList<T> r = new ArrayList<T>();
    for (T x : values) {
        r.add(x);
    }
    return r;
}

public static void main (String[] args) throws Java.lang.Exception
{
    System.out.println(AL(
        AL(3,2,24,131),
        AL("this", "is", "second", "array")));
    // prints `[[3, 2, 24, 131], [this, is, second, array]]`

}
2
Sarge Borsch

// fabrique un artiste avec 19 éléments

  ArrayList<ArrayList> arrList = new ArrayList<ArrayList>();
  for(int i = 1; i < 20; i++){
     arrList.add(new ArrayList<Integer>(5*i+5));
  }
0
Ash Searle