为了账号安全,请及时绑定邮箱和手机立即绑定

Java分组按列表

Java分组按列表

不负相思意 2021-05-07 14:11:50
class Student {     List<Integer> grades     }我想按年级对学生进行分组,但是如果每个学生只有一个年级,则groupingBy可以工作。还有其他兰巴舞的方法吗?我希望结果像 Map<Integer, List<Student>>
查看完整描述

2 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

Map<Integer, List<Student>> collect = students.stream()

                                                  .flatMap(student -> student.grades.stream()

                                                                                    .map(grade -> new AbstractMap.SimpleEntry<>(grade,

                                                                                            student)))

                                                  .collect(Collectors.groupingBy(entry -> entry.getKey(),

                                                          Collectors.mapping(Entry::getValue, Collectors.toList())));

因为我没有使用Java的Pair tuple实现 AbstractMap.SimpleEntry


查看完整回答
反对 回复 2021-05-26
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

groupingBy如果您有所帮助,它将完成此工作:您可能会在Javadoc中为groupingBy找到与此版本等效的版本。


final List<Student> students = ...;

// @formatter:off

students.stream()

        .flatMap(student -> student.grades.stream()

                                          .map(grade -> new StudentGrade(student, grade)))

        .collect(groupingBy(StudentGrade::getGrade, mapping(StudentGrade::getStudent, toList())));

// @formatter:on

现在,您得到一个Map<Integer, List<Student>>。过滤重复项取决于您。


您将需要这些导入:


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

import static java.util.stream.Collectors.mapping;

import static java.util.stream.Collectors.toList;

类StudentGrade很简单:


class StudentGrade {

  private final Student student;

  private final Integer   grade;

  public StudentGrade(Student student, Integer grade) {

    this.student = student;

    this.grade = grade;

  }

  public Student getStudent() {return student;}

  public Integer getGrade()   {return grade;}

}


查看完整回答
反对 回复 2021-05-26
  • 2 回答
  • 0 关注
  • 107 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信