この質問への回答が多くのバリエーションで提供されていることは知っていますが、特定のクエリでは見つかりませんでした。
値でソートされたマップが必要で、データを入れる前にマップを作成する必要があります。私はそれを作成するために以下のコードを思いついた
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;
}
});
したがって、基本的には、マップ内のエントリを整数値で降順に並べ替えて、最高得点者が一番上になるようにします。ただし、最初のキーと値のペアが挿入されたときにこれを行うと、プログラムは以下の例外で終了します
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の理由が何であるかを理解するのを手伝ってくれる人はいますか? アイテムがマップに格納される前に、コードが get() メソッドを使用してアイテムを取得しようとするため、再帰呼び出しに入り、例外が発生すると考えています。