我正在尝试根据我的唯一(非工作)答案回答my own old question。
这个想法是为了简化按值排序的地图的创建:
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)
知道为什么循环以及如何解决它?
答案 0 :(得分: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
元素进入非空地图时,Comparator
会使用提供的put