2016-11-07 89 views
0

我为PriorityQueue编写了一个比较器,以便根据HashMap中ArrayList中的第一个值给出最小值。更新传递给PriorityQueue的HashMap/ArrayList比较器

我的问题是,在我的程序的其余部分,我需要更新/更改ArrayList中的第一个值。我不确定如何做到这一点,以确保优先队列总是给我基于更新的正确结果?

感谢

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

它会给你在调用比较方法时的正确结果。另外,只是提及它不应该是'if(w1 - w <0){return 1;}'? – Thrasher

+0

所以每次我做PriorityQueue.peek()时都会调用比较方法; ?因此使用更新后的哈希映射/数组列表?是的,谢谢你指出......'='不应该在那里 – Lsldioo

回答

0

如果你改变你在一个PriorityQueue使用的键的值,则需要调整队列以反映更改。否则,您的队列可能会处于无效状态。数据结构无法跟踪您对用作密钥的任何值所做的更改。如果您更改了密钥,则必须通知数据结构事物已更改。

有针对性的排队不会每当您拨打peek时都会重新组织自己。所有peek确实返回队列中的第一个项目。唯一的比较是查看队列是否为空。

重新组织Java PriorityQueue的唯一方法是删除您更改的元素,然后重新插入它。

相关问题