2012-11-12 61 views
0

我有一個項目,我有一個類Halfedge(olny .class文件,所以沒辦法修改它)。 我想創建一個PriorityQueue。 爲了確定哪個元素更大,我不僅需要Halfedge類中的字段,還需要在我的代碼中創建的HashMap。PriorityQueue與外部參數

問題是:當我爲Halfedge定義比較器類時,我不能包含任何參數。

我的問題是:如何使用外部參數爲我的Halfedge類實現比較器類? (或簡單地說,我如何構建PriorityQueue)

非常感謝!

+0

不知道我在關注。你不能在'Comparator'的構造函數中包含對'HashMap'對象的引用(後來作爲成員)嗎?或者作爲替代 - 如果「比較器」是一個匿名的內部類,則可以從創建的方法訪問最終的變量。 – amit

回答

3

請看看下面的代碼:

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)); 
+0

非常感謝!這就是我需要的! – DanielX2010

2

注意,您可以從一個匿名內部類訪問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後一些元素不會改變 - 如果真的發生了 - 你的數據結構將被破壞,你會得到一個未定義的行爲。