final
匿名の内部クラスから変数にアクセスでき、必要に応じてこれを使用できることに注意してください。
簡単な例を次に示します。
public static void main(String args[]) {
final Map<String,Integer> map = new HashMap<>();
String s1 = "a";
String s2 = "b";
String s3 = "c";
map.put(s2, 1);
map.put(s1, 2);
map.put(s3, 3);
PriorityQueue<String> pq = new PriorityQueue<>(3, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return map.get(o1).compareTo(map.get(o2));
}
});
pq.add(s1);
pq.add(s2);
pq.add(s3);
while (pq.isEmpty() == false)
System.out.println(pq.poll());
}
Comparator
オブジェクトがmap
ローカル変数を使用していることに注意してください。変数map
が宣言されているため、これを行うことができますfinal
。
別の方法は、 (匿名の内部クラスでない場合)Map
のコンストラクターでへの参照を渡し、それをフィールドとして格納し、後で使用することです。Comparator
いずれの場合もMap
、要素が挿入された後、一部の要素のデータが変更されないようにする必要があります。変更されたPriorityQueue
場合、データ構造が破損し、未定義の動作が発生します。