2

私が持っていた唯一の(機能していない)回答に基づいて、自分の古い質問に答えようとしています。

アイデアは、値でソートされたマップの作成を簡素化することでした:

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

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

    @Override
    public int compare(K o1, K o2) {
        return map.get(o1).compareTo(map.get(o2)); // <-- line #19
    }

    public Map<K, V> getMap() {
        return map;
    }

}

次に、それをインスタンス化するとき:

Map<String, Integer> map = new SortedByValueMap<String, Integer>().getMap();
map.put("a", 9); // works great
map.put("z", 0); // throws a StackOverflowException

スタック トレースは次のとおりです。

Exception in thread "main" java.lang.StackOverflowError
    at java.util.TreeMap.get(TreeMap.java:255)
    at main.Main$SortedByValueMap.compare(Main.java:19)
    at java.util.TreeMap.getEntryUsingComparator(TreeMap.java:351)
    at java.util.TreeMap.getEntry(TreeMap.java:322)
    at java.util.TreeMap.get(TreeMap.java:255)

ループしている理由と解決方法はありますか?

4

1 に答える 1

2

問題は、get()メソッドcompare()が提供されたコンパレーターのメソッド (あなたのクラス) を呼び出し、あなたのcompare()メソッドが呼び出さget()れるため、円で実行されてしまうことです。

at java.util.TreeMap.get(TreeMap.java:255) <--
at main.Main$SortedByValueMap.compare(Main.java:19)
at java.util.TreeMap.getEntryUsingComparator(TreeMap.java:351)
at java.util.TreeMap.getEntry(TreeMap.java:322)
at java.util.TreeMap.get(TreeMap.java:255) <--

このループに入る理由は、要素を空でないマップに入れるときにTreeMap提供された を使用するためです。Comparatorput

于 2013-06-20T13:12:14.757 に答える