私が持っていた唯一の(機能していない)回答に基づいて、自分の古い質問に答えようとしています。
アイデアは、値でソートされたマップの作成を簡素化することでした:
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)
ループしている理由と解決方法はありますか?