我有一個項目,我有一個類Halfedge(olny .class文件,所以沒辦法修改它)。 我想創建一個PriorityQueue。 爲了確定哪個元素更大,我不僅需要Halfedge類中的字段,還需要在我的代碼中創建的HashMap。PriorityQueue與外部參數
問題是:當我爲Halfedge定義比較器類時,我不能包含任何參數。
我的問題是:如何使用外部參數爲我的Halfedge類實現比較器類? (或簡單地說,我如何構建PriorityQueue)
非常感謝!
我有一個項目,我有一個類Halfedge(olny .class文件,所以沒辦法修改它)。 我想創建一個PriorityQueue。 爲了確定哪個元素更大,我不僅需要Halfedge類中的字段,還需要在我的代碼中創建的HashMap。PriorityQueue與外部參數
問題是:當我爲Halfedge定義比較器類時,我不能包含任何參數。
我的問題是:如何使用外部參數爲我的Halfedge類實現比較器類? (或簡單地說,我如何構建PriorityQueue)
非常感謝!
請看看下面的代碼:
public class HalfedgeComparator
implements Comparator<Halfedge>;
{
Object param1 = null;
public HalfedgeComparator (Object param1) {
this.param1= param1;
}
public int compare(Halfedge item1, Halfedge item2)
{
return ...;
//your logic here where you can use the param1 passed in the constructor
}
}
和客戶端的代碼可能是:
Collections.sort(yourListHere, new HalfedgeComparator(yourExternalParamHere));
非常感謝!這就是我需要的! – DanielX2010
注意,您可以從一個匿名內部類訪問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
。
一個替代方案是在Comparator
的構造傳遞給Map
的引用(如果它不是一個匿名內部類),將其存儲爲一個字段和以後使用。
在任何情況下 - 你必須確保在Map
的數據元素插入到PriorityQueue
後一些元素不會改變 - 如果真的發生了 - 你的數據結構將被破壞,你會得到一個未定義的行爲。
不知道我在關注。你不能在'Comparator'的構造函數中包含對'HashMap'對象的引用(後來作爲成員)嗎?或者作爲替代 - 如果「比較器」是一個匿名的內部類,則可以從創建的方法訪問最終的變量。 – amit