Liste de listes de listes

Je suis nouveau sur Java et je dois faire une liste de listes de listes. Je pourrais le faire en python, car un élément d’une liste peut être une liste. Par conséquent, dans une liste incorporée, la liste list[0] ferait référence à une liste et la list[0][0] ferait référence au zéroième élément de la liste incorporée. Existe-t-il un moyen simple d’implémenter ce comportement en Java?

Toutes les autres réponses sont techniquement correctes, mais à mon humble avis, si vous implémentez une liste approximative de listes de listes, vous ne traitez pas vos données au bon niveau d’abstraction. Par exemple, je suis à peu près sûr qu’une liste de listes signifie déjà “quelque chose” dans votre domaine d’activité. Encapsulez ce “quelque chose” dans un autre object afin que vous puissiez simplement avoir une liste au lieu d’un object difficile à utiliser et gérer la liste >>>.

Comme le dit Mario , vous devez probablement extraire un peu plus vos données. Mais, ce qui suit fera ce dont vous avez besoin.

En Java, vous voudriez quelque chose comme:

 List>> listOfListsOfLists =new ArrayList>>(); 

Ensuite, pour accéder aux éléments, vous utiliseriez:

 listOfListsOfLists.get(a).get(b).get(c); 

Ou, pour tout parcourir:

 for (List> list2: listOfListsOfLists) { for (List list1: list2) { for (Object o: list1) { // use `o` } } } 

Puisque toutes ces réponses me font peur, puis-je simplement append la suggestion que vous

  1. Créez un type de données pour exprimer vos données tout en encapsulant les détails de la structure, ou au moins

  2. Créer un type de clé qui encapsule un int [] (mais remplace correctement égaux et hashCode) et utilisez plutôt HashMap? Il est généralement rare que votre structure sortingdimensionnelle soit complètement remplie de toute façon.

Mieux encore, vous pouvez encapsuler cette carte et utiliser varargs pour un access en clair.

 public class NDimensionalArray { private final int dimensions; private final Map values = new HashMap(); private NDimensionalArray(int dimensions) { this.dimensions = dimensions; } public V get(int... indices) { checkIndices(indices); return values.get(new Key(indices)); } public void set(V value, int... indices) { checkIndices(indices); values.put(new Key(indices), value); } private void checkIndices(int[] indices) { if ( indices.length != dimensions ) { throw new IllegalArgumentException(); } } private static final class Key { private final int[] indices; private Key(int[] indices) { this.indices = indices; } @Override public int hashCode() { return Arrays.hashCode(indices); } @Override public boolean equals(Object obj) { return Arrays.equals(indices, ((Key)obj).indices); } } } 

Si les gens ont des exemples de bibliothèques de collections établies qui font déjà ce genre de choses, faites le moi savoir et j’appendai des liens.

Bien qu’il soit certainement vrai que vous puissiez construire une liste >> en Java, je ne peux m’empêcher de me demander, pourquoi voulez-vous faire cela? Ce n’est pas inconcevable que ce soit la meilleure solution à votre problème, mais ouah, pourquoi?

Je suppose que je pourrais imaginer quelque chose comme

 public class Employee ... List store; // all the employees in a store List> city; // all the store lists for a city List>> nation; // all the store lists for the nation 

Mais voudriez-vous vraiment le traiter de cette façon? Je ne sais pas, cela dépend de ce que vous devez faire avec.

Un exemple complet montrant la liste de listes avec les collections et les génériques (Java 1.5+)

 // declare the list of lists List> listOfListOfSsortingngs = new ArrayList>(); // populate List listOfSsortingngs = new ArrayList(); // one inner list listOfSsortingngs.add("one-one"); listOfSsortingngs.add("one-two"); listOfListOfSsortingngs.add(listOfSsortingngs); listOfSsortingngs = new ArrayList(); // and another one listOfSsortingngs.add("two-one"); listOfSsortingngs.add("two-two"); listOfListOfSsortingngs.add(listOfSsortingngs); // access Ssortingng oneOne = listOfListOfSsortingngs.get(0).get(0); // first element of first inner list Ssortingng twoTwo = listOfListOfSsortingngs.get(1).get(1); // second element of second inner list