Tableau à deux dimensions de Listes
Je suis dans le besoin de une matrice en deux dimensions de liste, par exemple, ArrayList, et je me demande ce qui est le plus préférable dans ce cas. Il ne doit être de taille 4x4.
Dois-je utiliser quelque chose comme
ArrayList[][] foo = new ArrayList[4][4];
ou
ArrayList<SomeClass>[][] foo = new ArrayList[4][4];
et initialiser tous les éléments avec le bon type dans une boucle for ou
ArrayList<ArrayList<ArrayList<SomeClass>>> foo = ArrayList<ArrayList<ArrayList<SomeClass>>>();
La première méthode génère des avertissements, comme il devrait être paramétrées et si j'ajoute l'utilisation de la deuxième-je obtenir unchecked conversion des avertissements. Mais si je boucle sur les éléments et les initialiser, il ne devrait pas y avoir de problème, même si j'ai toujours l'avertissement? La dernière méthode ne permet pas de générer des avertissements et fonctionne probablement très bien, mais il se sent un peu en désordre.
EDIT: j'Ai quelques belles réponses à ma question, même si elle était un peu floue. Mais c'était essentiellement de la façon de faire un tableau de Listes. Créer une classe personnalisée pour gérer les lignes/colonnes, il fait un beaucoup plus facile.
- La deuxième méthode devrait lire:
ArrayList<SomeClass>[][] foo = new ArrayList<SomeClass>[4][4];
, cependant, ayant un tableau de listes semble un peu bizarre. Avez-vous vraiment besoin d'un tableau en 2 dimensions? Si oui, pourriez-vous préciser un peu plus d'informations sur la raison? - Ayant ArrayList<SomeClass>[][] foo = new ArrayList<SomeClass>[4][4]; Est produit le message d'erreur "Impossible de créer un générique de tableau de ArrayList<SomeClass>, c'est pourquoi je l'ai laissée 🙂
- Et la raison pour laquelle j'ai besoin c'est que j'ai une table contenant des "résultats". En fonction du résultat d'une opération, je veux ajouter ces objets à l'une de ces listes dans le tableau 2D. Ne fait que rendre les choses plus claires? 🙂
Vous devez vous connecter pour publier un commentaire.
Fixer la première méthode comme suit:
Liste[][] foo = new ArrayList[4][4];
La deuxième méthode n'est pas ce dont vous avez besoin. Vous essayez de créer 4 dimensions tableau au lieu de 2 dimensions de la matrice de 4*4 éléments.
En outre, je voudrais vous donner un conseil: ne jamais utiliser de la classe de béton dans la partie gauche d'une affectation, c'est à dire
ArrayList list = ....
UtilisationList list = ...
Et éviter d'utiliser trop compliqué structures de données. 2 dimensions tableau de listes est trop compliqué. Créez votre propre classe qui encapsule certaines fonctionnalités, puis de créer une collection ou un tableau (mieux 1 dimensions) d'objets de votre classe.
getRow()
etgetColumn()
?ArrayList
avec unLinkedList
si nécessaire. Si vous avez besoin de plus d'informations sur les capacités (comme triés ou non) que vous pourriez avoir des interfaces supplémentaires (pensez àSet
vsSortedSet
) mais sachant que des implémentations concrètes est rarement utile à l'utilisateur d'une méthode.Ici l'exemple de matrice 2x2 avec l'initialisation explicite.
Comme Alex l'a déjà dit, avoir un 2 dimensions tableau de listes est assez compliqué et facile de se tromper ou être utilisé dans une wron façon.
Depuis votre tableau doit représenter un tableau, vous pouvez créer des classes pour les lignes ou les colonnes, selon ce qui est le plus important.
Alternativement, vous pouvez créer une classe pour chaque cellule de la table et de gérer un tableau 2D de cellules, si vous savez exactement quel est le nombre de cellules que vous auriez:
Voici deux approches. D'abord est ce que vous avez demandé, la seconde est encapsulé version (avec tableau 2d transformé en 1d tableau pour faciliter interne de manipulation).
Comme l'a dit avant, vous devez déclarer des variables comme les interfaces autant que possible (mais pas plus).
Que dire, si tout ce que vous voulez dire, c'est, à ses une Liste et ne pas attendre que quelqu'un se comporter différemment en fonction de la mise en œuvre concrète, il suffit d'utiliser la Liste, pas de liste de tableaux comme type de variable.
Mais si vous utilisez par exemple. LinkedSet il peut être une bonne idée d'utiliser LinkedSet comme type de variable (et en tant que valeur de retour de fonctions), si vous voulez la "promesse" qu'il énumère tous les éléments rapidement et dans l'ordre d'insertion. Si vous utilisez Set, l'utilisateur ne dépend d'aucun ordre particulier de l'itération.
btw. méfiez-vous de l'initialisation explicite. Il est agréable de syntaxe, mais il crée anonyme intérieur de la classe et elle peut conduire à inintended la rétention de la classe parent. Mais si vous savez ce que vous faites et qu'il n'est pas possible de se passer (aucune référence) il n'y a rien de mal à l'utiliser.