2016-11-07 4 views
0

HashMapのArrayListの最初の値に基づいて最小の値を与えるように、PriorityQueueのコンパレータを作成しました。PriorityQueueコンパレータに渡されるHashMap/ArrayListの更新

私の問題は、残りのプログラムでは、ArrayListの最初の値を更新/変更する必要があるということです。優先度のキューが常に私に更新に基づいて適切な結果を与えることを確認するためにそれを行う方法がわからないのですか?あなたはPriorityQueueでキーとして使用している値を変更した場合

おかげ

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

これは、compareメソッドを呼び出すときに適切な結果を得られます。また言及すると、それは 'if(w1 - w <0){return 1;}'であってはなりません。 – Thrasher

+0

したがって、PriorityQueue.peek()を実行するたびにcompareメソッドが呼び出されます。 ?したがって、更新されたハッシュマップ/配列リストを使用していますか?そして、ええ、それを指摘してくれてありがとう... '='はそこにはいけません – Lsldioo

答えて

0

は、変更を反映するためにキューを調整する必要があります。そうしないと、キューが無効な状態になる可能性があります。データ構造では、キーとして使用している値の変更を追跡することはできません。キーを変更した場合は、変更されたことをデータ構造に通知する必要があります。

peekを呼び出すたびにキューがになると、は再構成されません。すべてpeekは、キューの最初の項目を返します。唯一の比較は、キューが空であるかどうかを確認することです。

Java PriorityQueueを再編成する唯一の方法は、変更した要素を削除してから再度挿入することです。