1

上記の 、つまり、それ使用されるものにアクセスできるはずの aTreeMapを使用してインスタンス化しようとしています(「will」が正確に問題であるに違いないと思います...):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>をインスタンス化するときにmap変数がまだ初期化されていないため、このエラーが発生する理由を理解できますが、回避策はありますか?

解決策はimplementationsetComparatorのメソッドになりTreeMapますが、その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);
4

2 に答える 2

1

2か月後、@ 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}

とにかく、それは実際に効率的なツールではなく、技術的な課題の解決策と見なす必要があります (2 つの同一の並列マップが作成されるため)。そのため、慎重に使用してください...;)

于 2013-06-20T16:08:14.740 に答える
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 に答える