2017-11-09 16 views
3

私は要素のリストを持っています。このリスト型の特定の要素をグループ化し、ネストされたコレクションに変換する必要があります。ここで私は何二乗平均フラットリストの要素をJavaのネストされたコレクションに変換する

は、以下を検討している -

class StudentA { 
    private String name; 
    private int age; 
    private int subjectId; 
    private String subjectName; 
} 

class StudentB { 
    private String name; 
    private int age; 
    List<Subject> subject; 
} 

class Subject { 
    private int subjectId; 
    private String subjectName; 
} 

私は、入力としてList<StudentA>を持っています。しかし、このリストでは、各生徒は複数の科目を持つことができます。したがって、生徒情報は繰り返されます(例:[new StudentA("A",22,1,"X"), new StudentA("A",22,2,"Y"), new StudentA("B",24,1,"X") ]など)。 これは良い表現ではないと私はStudentBが要素として件名のリストを持っていることを以下format-

List<StudentB> 

ノート内のデータを必要としています。ここで

は私もjava8 ストリームを見て、私は考えているものですが、納得していない、

  • 私は 元のリスト内の各要素を反復昔ながらの反復的な方法と私は
  • 必要なものを構築します、 を有望に見える収集されたデータにGROUPBYているAPIは、しかし、私は私の StudentB型にリストにStudentAタイプから変換することができないよう

これを実行するうえで、効率的な方法は何でしょうか?どうもありがとう !

答えて

3

インスタンスをStudentAにグループ化すると、名前はMap<String,List<StudentA>>になります。そして、あなたはこのマップの値をストリーミングし、StudentBのインスタンスに変換することができます

List<StudentB> bList = 
    aList.stream() // Stream<StudentA> 
     .collect(Collectors.groupingBy(StudentA::getName)) // Map<String,List<StudentA>> 
     .values() // Collection<List<StudentA>> 
     .stream() // Stream<List<StudentA>> 
     .map(list -> { 
      StudentB b = new StudentB(); 
      b.setName(list.get(0).getName()); 
      b.setAge(list.get(0).getAge()); 
      list.forEach(a -> b.addSubject(new Subject(a.getSubjectID(),a.getSubjectName()))); 
      return b; 
     }) // Stream<StudentB> 
     .collect(Collectors.toList()); 

私はいくつかのメソッド名とコンストラクタの存在を仮定しての自由を取りました。

この解決策は、同じSubjectの複数のSubjectインスタンスを潜在的に作成するという欠点があります。これは、IDでインデックス化されたSubjectを含むMap<Integer,Subject>を作成し、必要なサブジェクトIDがまだMapでない場合にのみ、新しいSubjectを作成すると回避できます。

+0

ありがとうございました!まさに私が探していたもの。そして、同じ科目の科目の複数のインスタンスを作成しても問題ありません。私は何千ものここに対処していない – ranjith

+0

素敵な例! – HopeKing

関連する問題