gpt4 book ai didi

java - 在将任何数据放入其中之前创建一个按值排序的 Map

转载 作者:行者123 更新时间:2023-12-01 15:16:24 26 4
gpt4 key购买 nike

我知道这个问题的答案已经以多种形式提供,但我找不到适合我的特定查询的答案。

我想要一个按值排序的 map ,并且需要在将数据放入其中之前创建它。我想出了下面的代码来创建它

private Map<String, Integer> mapUserScore = new ConcurrentSkipListMap<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
int i1=mapUserScore.get(o2);
int i2=mapUserScore.get(o1);
if(mapUserScore.get(o2)!=null && mapUserScore.get(o1)!=null){
int compare = mapUserScore.get(o2)-(mapUserScore.get(o1));
if(compare==0)compare=-1;
return compare;
}else
return 0;
}
});

所以基本上我希望 map 中的条目按整数值降序排序,以便得分最高的人位于顶部。但是,在插入第一个键值对时执行此操作,程序会退出并出现以下异常

Exception in thread "Thread-0" java.lang.StackOverflowError
at java.util.concurrent.ConcurrentSkipListMap.comparable(ConcurrentSkipListMap.java:658)
at java.util.concurrent.ConcurrentSkipListMap.doGet(ConcurrentSkipListMap.java:821)
at java.util.concurrent.ConcurrentSkipListMap.get(ConcurrentSkipListMap.java:1626)

经过跟踪,我发现行 int i1=mapUserScore.get(o2) 导致了此异常。谁能帮我理解 stackoverflow 的原因是什么?我在想,因为在任何项目存储在 map 中之前,代码会尝试使用 get() 方法对其进行排序来获取它,因此它会进入一些递归调用并导致异常。

最佳答案

如果我理解正确,您希望能够快速获得与名称相关的分数(因此需要 map ),并且您希望能够迭代具有最高值的名称-分数对得分第一。

我只会使用 HashMap<String, NameScore> (其中键是名称,值是名称-分数对)。这将为您提供 O(1) 查找。当您需要按分数排序的名称-分数对时,请创建一个新的 ArrayList<NameScore>来自values() map ,排序,然后返回。

关于java - 在将任何数据放入其中之前创建一个按值排序的 Map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11537373/

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