99 votes

Impossible de créer un tableau de LinkedLists en Java... ?

Je travaille sur une classe de matrice éparse qui besoins pour utiliser un tableau de LinkedLists afin de stocker les valeurs d'une matrice. Chaque élément du tableau (c'est-à-dire chaque LinkedList) représente une ligne de la matrice. Et, chaque élément des LinkedLists représente une colonne et la valeur stockée.

Dans ma classe, j'ai une déclaration du tableau comme :

private LinkedList<IntegerNode>[] myMatrix;

Et, dans mon constructeur pour la SparseMatrix, j'essaie de définir :

myMatrix = new LinkedList<IntegerNode>[numRows];

L'erreur que j'obtiens est "Cannot create a generic array of LinkedList<IntegerNode> ." J'ai donc deux problèmes : 1) qu'est-ce que je fais de travers, et 2) pourquoi le type est-il acceptable dans la déclaration du tableau s'il ne peut pas être créé ?

Edit : IntegerNode est une classe que j'ai créée. Et, tous mes fichiers de classe sont emballés ensemble.

140voto

Fredrik Points 2213

Pour une raison quelconque, vous devez exprimer le type et faire la déclaration comme ceci :

myMatrix = (LinkedList<IntegerNode>[]) new LinkedList<?>[numRows];

63voto

Sergey Points 1943

Vous ne pouvez pas utiliser la création de tableaux génériques. C'est un défaut/une caractéristique des génériques java.

Les voies sans avertissements sont :

  1. Utilisation de listes de listes au lieu de tableaux de listes :

    List< List<IntegerNode>> nodeLists = new LinkedList< List< IntegerNode >>();
  2. Déclarer la classe spéciale pour les tableaux de listes :

    class IntegerNodeList {
        private final List< IntegerNode > nodes;
    }

5voto

Dov Wasserman Points 1538

En dehors des problèmes de syntaxe, il me semble étrange d'utiliser un tableau et une liste liée pour représenter une matrice. Pour pouvoir accéder à des cellules arbitraires de la matrice, il faudrait probablement utiliser un tableau réel ou au moins une liste liée. ArrayList pour contenir les rangs, comme LinkedList doit parcourir toute la liste, du premier élément à un élément particulier, un élément de type O(n) par opposition à l'opération beaucoup plus rapide O(1) avec ArrayList ou un tableau réel.

Puisque vous avez mentionné que cette matrice est éparse, une meilleure façon de stocker les données est peut-être une carte de cartes, où une clé dans la première carte représente un indice de ligne, et sa valeur est une carte de ligne dont les clés sont un indice de colonne, avec la valeur étant votre classe IntegerNode. Ainsi :

private Map<Integer, Map<Integer, IntegerNode>> myMatrix = new HashMap<Integer, Map<Integer, IntegerNode>>();

// access a matrix cell:
int rowIdx = 100;
int colIdx = 30;
Map<Integer, IntegerNode> row = myMatrix.get(rowIdx); // if null, create and add to matrix
IntegerNode node = row.get(colIdx); // possibly null

Si vous devez être en mesure de parcourir la matrice ligne par ligne, vous pouvez faire en sorte que le type de carte de ligne soit une carte de type TreeMap et de même pour parcourir les colonnes dans l'ordre des index, mais si vous n'avez pas besoin de ces cas, HashMap est plus rapide que TreeMap . Des méthodes d'aide pour obtenir et définir une cellule arbitraire, en gérant les valeurs nulles non définies, seraient utiles, bien sûr.

4voto

Bob Points 21
class IntegerNodeList extends LinkedList<IntegerNode>{}

myMatrix = new IntegerNodeList [numRows];

3voto

user306708 Points 403

myMatrix = (LinkedList<IntegerNode>[]) new LinkedList[numRows];

Le moulage de cette manière fonctionne mais vous laisse toujours avec un avertissement désagréable :

"Sécurité du type : L'expression de type List[] nécessite une conversion non vérifiée "

Déclarer une classe spéciale pour les tableaux de listes :

class IntegerNodeList { private final List< IntegerNode > nodes; }

C'est une idée intelligente pour éviter l'avertissement. Peut-être qu'une interface serait un peu plus agréable à utiliser :

public interface IntegerNodeList extends List<IntegerNode> {}

puis

List<IntegerNode>[] myMatrix = new IntegerNodeList[numRows];

compile sans avertissement.

n'a pas l'air trop mal, n'est-ce pas ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X