使用比较器实例化TreeMap,该比较器应该能够访问所述TreeMap

时间:2013-04-04 09:30:50

标签: java sorting map comparator treemap

我正在尝试使用TreeMap来实例化ComparatorTreeMap应该能够访问所述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}}

2 个答案:

答案 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}

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