私はIntegersのマップを持っています。地図の全要素を繰り返してStringに追加する必要がありますが、まずすべて結果を制限する必要がありますその後、マップの値に基づいてソートします(ソートしてから制限する方が効率的です)。Java 8ストリームAPIとラムダを使用してマップを操作する
Map<Integer, Integer> allHighScoresPerLevel=highScores.get(levelId);
Set<Map.Entry<Integer, Integer>> sortedHighScores=allHighScoresPerLevel.entrySet()
.stream().limit(Configuration.MAX_HIGHSCORES_DISPLAYED)
.map((e)->e).sorted((o1,o2)->(o1.getValue().compareTo(o2.getValue())))
.collect(Collectors.toCollection(TreeSet::new));
しかし、私は次の例外を取得しています:
ので、それを行うためには、私は、Java 8ストリームAPIとラムダ式を使用しています、これは私がこれまでに書いたコードは次のとおりです。
java.util.concurrent.ConcurrentHashMap$MapEntry cannot be cast to java.lang.Comparable
私はそれを得る、マップエントリはComparableを拡張していないので、エントリをソートするには何の自然な方法はありませんが、私はspecificlyソートする方法を教えるためにソートされた方法では、コンパレータ(ラムダ)を提供していますエントリ。
だから私は2つの質問がある:
1)これを行うための正しい方法は何ですか?私は何を間違えているのですか?
2)ストリームは安全ですか?私はマルチスレッド環境で作業しているので、トレッドセーフコレクションを返すコレクタを使用する必要がありますか?
'TreeSet'もソートされているので、そのコンストラクタにもコンパレータを渡す必要があります。 –
しかし、最後にはCollectors.toCollection(TreeSet :: new)を使用しています。これは、すでにソートされたオブジェクトで新しいTreeSetを作成するでしょうか? – fgonzalez
いいえ、 'TreeSet'は要素が挿入されているときにソートしようとします。代わりに 'List'を使うことができます。これは、要素の順序が維持されていることを保証します。 –