gpt4 book ai didi

java - 试图简化按值排序映射的创建会抛出 StackOverflowException

转载 作者:行者123 更新时间:2023-11-30 09:20:50 28 4
gpt4 key购买 nike

我正在尝试回答 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)

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

最佳答案

问题是 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 在您 元素放入非空 map 时使用提供的Comparator

关于java - 试图简化按值排序映射的创建会抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17214249/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com