我正在尝试使用TreeMap
来实例化Comparator
,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>
for(我猜“将”必须是问题......):
map
我可以理解为什么会出现这种错误,因为在实例化setComparator
时,comparator
变量尚未初始化,但有没有解决方法?
解决方案可能是the TreeMap
implementation中的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);
方法,但其{{1}}字段已被声明为最终字段:
{{1}}
答案 0 :(得分:1)
你不能在你的类上实现Comparator并将this
传递给TreeMap构造函数,例如:
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);
}
如果您需要进一步的帮助,请发表评论,提供有关您具体案例的更多信息。
答案 1 :(得分:1)
两个月后,在重新查看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}
但无论如何,它必须被视为技术挑战解决方案而不是真正有效的工具(因为创建了两个相同的平行地图),所以谨慎使用它...... ;)