2013-04-04 24 views
1

我試圖用Comparator應該能夠訪問上述TreeMap實例化一個TreeMap一個比較,即一個它使用對(我猜「」必須precisly是問題......):實例化一個TreeMap使用它應該能夠訪問表示TreeMap的

final Map<String, Integer> map = new TreeMap<String, Integer>(new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     Integer i = map.get(o1); 
     // Error: "the local variable map may not have been initialized" 
     return ...; 
    } 

}); 

我可以明白爲什麼這個錯誤發生時,實例化Comparator<String>時,因爲在map變量尚未初始化,但有沒有解決方法?

一種解決方案已經在the TreeMap implementation一個setComparator方法,但其comparator領域已經聲明爲final:

final Map<String, Integer> map = new TreeMap<String, Integer>(); 
Comparator<String> comparator = new Comparator<String>() { 

    @Override 
    public int compare(String o1, String o2) { 
     Integer i = map.get(o1); 
     return ...; 
    } 

}; 
// map.setComparator(comparator); 
+0

您是否嘗試對值進行排序? – assylias 2013-04-04 09:32:22

+1

根據我的理解,比較器應該只使用在比較方法中作爲參數提供的值。如果您使用其他值,您最終會將其綁定到外部值的狀態,然後比較器將不一致。這也解釋了爲什麼比較是最終的。如果你想要2個不同的比較器,你最好創建2個樹形圖實例。 – prashant 2013-04-04 09:35:41

+0

'Map '是不可能的? – 2013-04-04 09:41:05

回答

1

兩個月後,在已relooked爲the answer @hd1 gave me(不工作因爲是實際上),這裏是一個可能的解決方案:

public class SortedByValueMap<K, V extends Comparable<V>> implements Comparator<K> { 

    private final Map<K, V> map = new TreeMap<K, V>(); 

    private class CustomTreeMap<KK extends K, VV extends V> extends TreeMap<KK, VV> { 

     private static final long serialVersionUID = 9196929305071517886L; 

     private CustomTreeMap(Comparator<KK> c) { 
      super(c); 
     } 

     @Override 
     public VV put(KK key, VV value) { 
      map.put(key, value); 
      return super.put(key, value); 
     }; 

     @Override 
     public VV remove(Object key) { 
      map.remove(key); 
      return super.remove(key); 
     } 

    } 

    @Override 
    public int compare(K o1, K o2) { 
     return map.get(o1).compareTo(map.get(o2)); 
    } 

    public Map<K, V> getMap() { 
     return new CustomTreeMap<K, V>(this); 
    } 

} 

然後:

Map<String, Integer> map = new SortedByValueMap<String, Integer>().getMap(); 
map.put("r", 2); 
map.put("b", 0); 
map.put("a", 1); 
System.out.println(map); // prints {b=0, a=1, r=2} 

但無論如何,它必須被認爲是一個技術挑戰解決方案,而不是一個真正有效的工具(因爲創建了兩個相同的平行映射),所以使用sparin gly ... ;)

2

你能不能落實在你的類比較,並通過this以樹形圖的構造函數,例如:

class MyClass implements Comparator<MyClass> { 
private String property; 
@Override // java.util.Comparator.compare 
public int compare(MyClass o1, 
      MyClass o2) { 
return o1.getProperty().compare(o2.getProperty()); 
} 
@Override // java.util.Comparator.equals 
public boolean equals(Object o) { 
    return this.getProperty().equals(o.getProperty()); 
} 

public String getProperty() { 
    return this.property; 
} 

public void setProperty(String myPropertyValue) { 
    property = myPropertyValue; 
} 

TreeMap <String, MyClass> myMap = null; 

public MyClass() { 
    myMap = new TreeMap<String, MyClass>(this); 
} 

如果您需要進一步的幫助,請留下您的具體案例的更多信息的評論。