2016-11-07 4 views
0

J'ai écrit un comparateur pour un PriorityQueue afin qu'il me donne la plus petite valeur basée sur la première valeur dans ArrayList à partir de la HashMap.Mise à jour de HashMap/ArrayList passée à PriorityQueue Comparator

Mon problème est que, dans le reste de mon programme, j'ai besoin de mettre à jour/modifier ces premières valeurs dans ArrayList. Je ne suis pas sûr comment faire cela pour m'assurer que la file d'attente prioritaire me donne toujours le bon résultat basé sur les mises à jour?

Merci

public class MyComparator implements Comparator<Integer>{ 
    HashMap<Integer, ArrayList<Integer>> hm; 
    public MyComparator(HashMap<Integer, ArrayList<Integer>> hm){ 
     this.hm = hm; 
    } 
    @Override 
    public int compare (Integer num, Integer num1){ 
     ArrayList<Integer> list = hm.get(num); 
     int w = list.get(0); 
     ArrayList<Integer> list1 = hm.get(num1); 
     int w1 = list1.get(0); 
     if(w1 - w == 0){ 
      return 0; 
     } 
     if(w1 - w <= 0){ 
      return 1; 
     } 
     else{ 
      return -1; 
     } 
    } 
} 
+0

Il vous donnera le résultat approprié au moment où vous appelez la méthode de comparaison. aussi, juste pour mentionner qu'il ne devrait pas être 'if (w1 - w <0) {return 1;}'? – Thrasher

+0

Ainsi la méthode de comparaison est appelée chaque fois que je fais PriorityQueue.peek(); ? Donc, en utilisant les listes de hachage carte/tableau mis à jour? Et ouais merci de l'avoir signalé ... le '=' ne devrait pas être là – Lsldioo

Répondre

0

Si vous modifiez la valeur que vous utilisez comme une clé dans une PriorityQueue, vous devez ajuster la file d'attente pour refléter le changement. Sinon, votre file d'attente sera potentiellement dans un état invalide. La structure des données ne peut pas garder trace des modifications que vous apportez à la valeur que vous utilisez comme clé. Si vous modifiez les clés, vous devez informer la structure de données que les choses ont changé.

La file d'attente ne sera pas se réorganiser chaque fois que vous appelez peek. Tout peek est de retourner le premier élément de la file d'attente. La seule comparaison qu'il fait est de voir si la file d'attente est vide. La seule façon de réorganiser un Java PriorityQueue est de supprimer l'élément que vous avez modifié, puis de le réinsérer.