尝试简化按值排序的映射的创建会引发StackOverflowException

时间:2013-06-20 12:56:58

标签: java sorting map

我正在尝试根据我的唯一(非工作)答案回答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)

知道为什么循环以及如何解决它?

1 个答案:

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