2016-08-09 8 views
0

私はこのようなクラスとオブジェクトのリストを持っている:Java 8ストリームを使用してネストされたコレクションでサマリーレポートを生成するにはどうすればよいですか?

class TestResult{ 
    int userId; 
    Set<String> subjects; 
    int score; 
} 

私は外側のマップをキーとして対象持って各被験者に

Map<String,Map<Integer, Integer>> 

をそれぞれのuserIdのスコアの要約を生成します。内部マップは、値としてのスコアの合計をキーとしてuserIdを持ちます。

+1

ニースによって提案されました。これまでに何を試しましたか? – Flown

+0

クラス名を追加しました。 –

答えて

0

(ご注意:以下に、私がMixedScoresとして、あなたの(現在は無名の)クラスにREFERE)

レッツ・A Collection<MixedScores>を取り、あなたが尋ねとして構成Map<String, Map<Integer, Integer>>を返すメソッドsumScoresを定義します。

ローカルクラスSingleScoreを使用すると、単一のMixedScoresインスタンスを複数のインスタンスに分割し、件名、userIdでグループ化し、最終的にすべてのスコアを合計することができます。コードで

:もちろん

Map<String, Map<Integer, Integer>> sumScores(Collection<MixedScores> scores) { 
    class SingleScore { 
     int userId; 
     String subject; 
     int score; 

     SingleScore(MixedScores mixedScores, String subject) { 
      this.userId = mixedScores.userId; 
      this.subject = subject; 
      this.score = mixedScores.score; 
     } 

     String getSubject() { 
      return subject; 
     } 

     int getUserId() { 
      return userId; 
     } 

     int getScore() { 
      return score; 
     } 
    } 

    return scores.stream() 
      .flatMap(x -> x.subjects.stream().map(subject -> new SingleScore(x, subject))) 
      .collect(groupingBy(SingleScore::getSubject, 
        groupingBy(SingleScore::getUserId, summingInt(SingleScore::getScore)))); 
} 

、一部の輸入があります

import static java.util.stream.Collectors.groupingBy; 
import static java.util.stream.Collectors.summingInt; 

import java.util.Collection; 
import java.util.Map; 
import java.util.Set; 

はあなたのためにこの仕事をしていますか?新しいクラスを作成せず

+0

なぜTOからの努力なしに本格的なソリューションを提供していますか? – Flown

+0

私はあなたのポイントを見る、@流行;悲しいかな、私はOP *へのあなたのコメントを見ましたが、それはわかりやすいようでしたが、あなたが気づいたように、研究努力はほとんどまたは全く示されませんでした。おそらく私は以前にhttp://meta.stackoverflow.com/questions/261592/how-much-research-effort-is-expected-of-stack-overflow-usersを見ていたはずです。申し訳ありません – logtwo

+0

ニース。しかし、ローカルクラスを作成する必要はありますか? –

0

もう一つの方法は、@Flown

   scores.stream() 
        .flatMap(x -> x.subjects.stream() 
          .map(subject -> new AbstractMap.SimpleEntry<String, Entry<Integer, Integer>>(subject, 
            new AbstractMap.SimpleEntry<Integer, Integer>(x.userId, x.score)))) 
        .collect(Collectors.groupingBy(Entry<String, Entry<Integer, Integer>>::getKey, 
          Collectors.groupingBy(p -> p.getValue().getKey(), 
            Collectors.summingInt((p -> p.getValue().getValue()))))); 
関連する問題