2016-11-07 91 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的唯一方法是刪除您更改的元素,然後重新插入它。

相關問題