Java将列表转换为集合图[重复]

Posted

技术标签:

【中文标题】Java将列表转换为集合图[重复]【英文标题】:Java convert a list to a map of sets [duplicate] 【发布时间】:2018-02-28 20:12:28 【问题描述】:

假设我有一个名为 Student 的对象列表。对象 Student 是这样定义的

public Class Student 
    private String studentName;
    private String courseTaking;

在学生列表中,可以有多个学生对象具有相同的studentName但不同的courseTaking。现在我想把学生列表变成一张studentName和courseTaking的地图

Map<String, Set<String>>

键是studentName,值是把同一个学生的所有课程放在一起作为一个集合。如何使用 stream() 和 collect() 做到这一点?

【问题讨论】:

当你问如何“使用 lambda 表达式”时,你真的是想问如何使用 Streams 来做到这一点?因为它可以通过 Streams 和方法引用 (假设存在 getter 方法) 来完成,没有任何 lambda 表达式,所以你的问题是为什么它必须使用 lambda 表达式? 是的,我确实是想使用 stream()。很抱歉在初稿中没有说清楚。我可以使用 groupBy() 将列表转换为列表映射,但我不知道如何将其转换为集合映射。 所以您为学生正在学习的每门课程重复了Student 对象?肯定感觉不对。课程应该是Student 对象中的一个数组。 students.stream().collect(groupingBy(Student::getStudentName, mapping(Student::getCourseTaking, toSet()))) 【参考方案1】:

我想这就是你要找的东西:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;


public class *** 

  private static class SO46310655 
    public static void main(String[] args) 
      final List<Student> students = new ArrayList<>();
      students.add(new Student("Zoff", "Java 101"));
      students.add(new Student("Zoff", "CompSci 104"));
      students.add(new Student("Zoff", "Lit 110"));
      students.add(new Student("Andreas", "Kotlin 205"));
      Map<String, Set<String>> map = students.stream().collect(
          Collectors.groupingBy(
              Student::getStudentName,
              Collectors.mapping(
                  Student::getCourseTaking,
                  Collectors.toSet()
              )
          )
      );
      System.out.println(map);
    

    public static class Student 
      private final String studentName;
      private final String courseTaking;

      public Student(String studentName, String courseTaking) 
        this.studentName = studentName;
        this.courseTaking = courseTaking;
      

      public String getStudentName() 
        return studentName;
      

      public String getCourseTaking() 
        return courseTaking;
      
    
  

收益Andreas=[Kotlin 205], Zoff=[Java 101, CompSci 104, Lit 110]

【讨论】:

以上是关于Java将列表转换为集合图[重复]的主要内容,如果未能解决你的问题,请参考以下文章

集合的使用

如何在java中将字符串集合转换为字符串数组[重复]

Python基础(3) - 去掉列表或元组中的重复元素

Java集合—容器了解

python删除列表中得重复得数据

Python序列结构--集合