2010-04-07 7 views
2

Je crée une PriorityQueue avec plusieurs files d'attente. J'utilise un tableau pour stocker les multiples ArrayLists qui composent mes différentes PriorityQueues. Voici ce que j'ai pour mon constructeur jusqu'à présent:Tableau de ArrayList Java

ArrayList<ProcessRecord> pq; 
ArrayList[] arrayQ; 

    MultiList(){  
    arrayQ = new ArrayList[9]; 
    pq = new ArrayList<ProcessRecord>(); 
} 

Le problème vient quand je suis en train d'obtenir la taille de l'ensemble du réseau, qui est la somme des tailles de chaque ArrayList dans le tableau.

public int getSize() { 

    int size = 0; 

    for (int i = 1; i <= 9; i++) { 
     size = size + this.arrayQ[i].size(); 
    } 
    return size; 
} 

ne semble pas fonctionner. Est-ce que je déclare le tableau de ArrayList correctement? Je continue d'obtenir une erreur en disant que this.arrayQ[i].size() n'est pas une méthode. (le .size() étant le problème)

Merci pour toute aide!

David

+0

Bien que je ne pense pas que ce soit la cause de votre problème, cette boucle va ignorer complètement le premier élément du tableau, et lancer une ArrayIndexOutOfBoundsException quand il arrivera à la fin. Les tableaux Java sont indexés à zéro, donc les index valides pour un tableau à 9 éléments sont compris entre 0 et 8. – Syntactic

+0

Pourquoi n'utilisez-vous pas un seul tableau ou un tas pour l'implémentation de PriorityQueue? – helpermethod

+0

J'ai utilisé les deux dans des affectations passées, celle-ci était supposée être plusieurs PriorityQueues et les renvoyer dans un style round-robin prioritaire pour chaque file d'attente. –

Répondre

7

Quelques problèmes:

D'abord, les tableaux en Java sont indexés à zéro, de sorte que votre boucle devrait lire:

for (int i = 0; i < 9; i++) 

Ou, mieux, remplacer le chiffre magique 9 par arrayQ.length pour rendre votre la vie plus facile si la longueur change. ArrayLists - new ArrayList[9] crée un tableau de neuf références de type ArrayList, mais toutes ces références sont null. Ensuite, vous ne remplissez pas votre tableau avec ArrayLists - new ArrayList[9] crée un tableau de neuf références de type ArrayList. Après avoir créé le tableau dans votre constructeur, vous devrez instancier les ArrayLists eux-mêmes, en faisant quelque chose comme ceci:

for (int i = 0; i < arrayQ.length; i++) 
    arrayQ[i] = new ArrayList<ProcessRecord>(); 
+0

Fonctionne maintenant, il a effacé tout en ajoutant la boucle initialisant chaque élément dans le tableau. Peut-être bug IDE? –

+1

Il serait peut-être utile de spécifier le paramètre de type des instances de 'ArrayList' contenues dans' arrayQ', considérez: 'ArrayList [] arrayQ = (ArrayList []) Array.newInstance (ArrayList.class, 9); De cette façon, l'accès à 'ProcessRecord' à partir de l'élément' ArrayList' de 'arrayQ' ne nécessitera pas de cast supplémentaire. – Pooven

0

Vous devez mettre une vérification nulle. Votre boucle for suppose qu'il y a quelque chose dans lequel elle peut fonctionner, mais vous appelez la méthode .size() sur des éléments null, ce qui ne fonctionne pas, elle va lancer une exception NullPointerException.

Vous aurez également des problèmes avec votre boucle. L'indexation du tableau commence à 0, et non 1. Votre boucle commence à 1, et puisque vous l'utilisez pour accéder au tableau, vous commencerez avec le deuxième élément, et en essayant d'accéder à 1 élément au-delà de la portée du tableau, lancera une ArrayIndexOutofBoundsException.

+0

La conception elle-même est imparfaite comme cela a été souligné. Je suivais juste un modèle présenté par mon professeur. La raison pour laquelle le tableau est traité en commençant par 1 au lieu de 0 rend la sortie plus simple plus tard. Faux oui mais inévitable à ce stade.J'aime l'idée d'utiliser array.length cependant. Merci pour les informations sur les références NullPointer. La boucle d'initialisation pour le tableau est ce dont j'avais besoin. J'ai également ajouté une vérification d'erreur pour m'assurer que l'élément référencé n'est pas nul. Merci pour toute l'aide! –

3

A noter également: Je ne sais pas ce que vous faites, mais pourquoi êtes-vous mélange arrays et ArrayLists? C'est presque certainement une mauvaise décision de conception, et vous feriez mieux d'utiliser un ArrayList<ArrayList<Type>>.

Je vois que vous travaillez autour de votre échec de conception inhérent en utilisant un tableau de ArrayList, et non ArrayList<ProcessRecord>, mais ce n'est pas de type sécurisé, et vous devriez juste utiliser un type de collection approprié.

+0

Noob question, mais que voulez-vous dire par type de collection propre Stefan? La programmation n'est pas mon principal domaine d'intérêt (l'ingénierie informatique est ma spécialité) mais j'aimerais vraiment mieux comprendre la technique appropriée. –

+0

Utilisez une liste au lieu d'un tableau pour appliquer la sémantique que vous essayez d'obtenir. Avec votre tableau, array [i] = new ArrayList () serait compiler. Si au lieu d'un tableau, vous avez utilisé une liste , cela ne serait pas compilé. Idéalement, vous devez détecter les erreurs logicielles le plus tôt possible, et si vous pouvez attraper une erreur comme celle-ci lors de la compilation, ce que vous pouvez faire, vous devriez vous efforcer d'y parvenir. –

+0

C'est exactement ce que je cherche .. – satyajit