2016-05-26 3 views
3

私はこのタイプのマップを持っています。 Map<Group, List<Person>> これは、メンバーのリスト全体を含むグループのセットです。 ストリームとラムダ式を使用しているグループが最大の人物を探したいと思っていましたが、成功しませんでした。 私を助けてもらえますか?ありがとうさまざまなリストの出現数をカウントするJava

+3

あなたがしようとしたものを投稿を開始すべきであるが、その人の詐欺アドバイスので、あなたはそれから始まります。 – Manu

+0

'Person'クラスは' .equals() 'をオーバーライドしていますか、あるいは同じオブジェクトを識別する別の方法を持っていますか? – 4castle

+0

これは実際には難しい質問です...私はそれを行うことができますが、それはif文と変更可能なハッシュマップを使った実際には醜いリダクション操作を伴うので、スーパー機能ではありません。これは 'groups.values()。stream.flatmap(l - > l.stream())のようなものですreduce(新しいHashMap ()、(s、m) - > {//醜いコード}) .entrySet.stream()。sort(//もっと醜いコード).getFirst(); ' –

答えて

5

.flatMap()の後に.collect()があり、全体でMapの各人の頻度がわかります。このような

何か:

Person socialButterfly = groupMap.values() 
    .stream() 
    .flatMap(Collection::stream) 
    .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())) 
    .entrySet().stream() 
    .max(Map.Entry.comparingByValue()) 
    .get().getKey(); 

Ideone Tested

+0

私は今それをテストしました。できます! 'groupingBy'が同じものとして分類できる人物を識別できるように' Person'が '.equals(Object)'をオーバーライドしていることを確認してください。 – 4castle

+0

ニースの答え男。 –

+1

@ YassinHajajありがとう! :) 'Map.Entry.comparingByValue()'が見つかったとき、私は本当に興奮しました。私がOPからの情報をあまりにも多く手に入れることができたのは変です。私の思うような質問はかなり簡単でした。複雑さを考えると、私は他の解決策から質問を閉じることに同意しない。 – 4castle

関連する問題