1

我正在尝试实例化一个TreeMapusing a Comparator,它应该能够访问 said TreeMap,即它将用于的那个(我猜“ will ”肯定是问题所在......):

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变量尚未初始化,但是有任何解决方法吗?

解决方案本来是 implementation 中的方法setComparator但它的字段已被声明为 final:TreeMapcomparator

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);
4

2 回答 2

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);
}

如果您需要进一步的帮助,请发表评论,提供有关您的具体案例的更多信息。

于 2013-04-04T09:46:38.897 回答
1

两个月后,在重新查看了@hd1 给我的答案(实际上并不能正常工作)之后,这是一个可能的解决方案:

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}

但无论如何,它必须被视为一个技术挑战解决方案,而不是一个真正有效的工具(因为创建了两个相同的平行地图),所以要谨慎使用它......;)

于 2013-06-20T16:08:14.740 回答