List集合按某个属性或者字段进行分组的操作

yizhihongxing

一、背景介绍
在Java中,List是最常用的集合类型之一,它可以存储任何类型的对象,但在实际开发中,我们有时需要按照某种属性或者字段对List中的元素进行分组,这可以通过Java8中新增的Stream API来实现。

二、具体实现步骤

1.创建一个包含多个元素的List集合,例如:

List<Student> students = new ArrayList<>();
students.add(new Student("Tom", "math", 85));
students.add(new Student("Tom", "english", 90));
students.add(new Student("Mary", "math", 92));
students.add(new Student("Mary", "english", 87));

2.使用Stream API对List进行分组,例如按照学生姓名进行分组

Map<String, List<Student>> groupByName = students.stream().collect(Collectors.groupingBy(Student::getName));

这里使用了Stream中的groupingBy()方法来对List进行分组,需要提供一个按照哪个属性分组的条件,该方法会返回一个Map对象,其中键为分组条件,值为List集合,即按照该条件分组后的结果。

3.使用Stream API进一步处理分组结果,例如计算每个分组的平均分

Map<String, Double> avgScoreByName = groupByName.entrySet().stream()
        .collect(Collectors.toMap(Map.Entry::getKey, v -> {
            List<Student> list = v.getValue();
            double sumScore = list.stream().mapToInt(Student::getScore).sum();
            return sumScore / list.size();
        }));

这里使用了Stream中的toMap()方法将分组结果转换成键值对形式,并对每个分组求出平均分。其中,我们使用了EntrySet()方法获取Map中的键值对,并展开进行处理。

三、示例说明

示例一:按照性别对员工进行分组

假设我们有一个Employee类,其中包含了员工的姓名、性别和工资三个属性,现在我们需要按照性别对所有员工进行分组,并统计每个分组的平均工资。

public class Employee {
    private String name;
    private String sex;
    private double salary;

    public Employee(String name, String sex, double salary) {
        this.name = name;
        this.sex = sex;
        this.salary = salary;
    }

    //getter、setter方法
}

List<Employee> employees = new ArrayList<>();
employees.add(new Employee("Tom", "Male", 5000));
employees.add(new Employee("Jane", "Female", 6000));
employees.add(new Employee("John", "Male", 4000));
employees.add(new Employee("Lucy", "Female", 7000));

Map<String, Double> groupBySex = employees.stream().collect(Collectors.groupingBy(Employee::getSex, Collectors.averagingDouble(Employee::getSalary)));

这里我们使用了两级分组,首先按照性别进行分组,然后对每个分组进行平均工资的计算,最终输出结果为:

{Female=6500.0, Male=4500.0}

示例二:按照省份进行多级分组

假设我们有一个Person类,其中包含了人员的姓名、年龄和省份三个属性,现在我们需要按照省份对所有人进行分组,并统计每个省份中不同年龄段的人员数量。

public class Person {
    private String name;
    private int age;
    private String province;

    public Person(String name, int age, String province) {
        this.name = name;
        this.age = age;
        this.province = province;
    }

    //getter、setter方法
}

List<Person> persons = new ArrayList<>();
persons.add(new Person("Tom", 20, "Guangdong"));
persons.add(new Person("Jane", 25, "Guangdong"));
persons.add(new Person("John", 30, "Guangdong"));
persons.add(new Person("Lucy", 35, "Guangxi"));
persons.add(new Person("Steven", 40, "Guangxi"));
persons.add(new Person("Bob", 45, "Guangxi"));

Map<String, Map<Integer, Long>> groupByProvinceAndAge = persons.stream()
        .collect(Collectors.groupingBy(Person::getProvince, Collectors.groupingBy(p -> p.getAge() / 10, Collectors.counting())));

这里我们也使用了两级分组,其中第一级按照省份进行分组,第二级按照年龄段进行分组,并计算每个分组中的人员数量。最终输出结果为:

{
    Guangdong={
        2=1, 
        3=1, 
        4=1
    }, 
    Guangxi={
        3=1, 
        4=2
    }
}

其中,Guangdong省中有2个20~30岁的人员、1个30~40岁的人员和1个40~50岁的人员;Guangxi省中有1个30~40岁的人员和2个40~50岁的人员。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:List集合按某个属性或者字段进行分组的操作 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • windows安装python2.7

    以下是“Windows安装Python 2.7”的完整攻略: Windows安装Python 2.7 Python 2.7是一种流行的Python版本,它在Windows上的安装非常简单。以下是如何在Windows上安装Python 2.7的步骤: 1. 下载Python 2.7 首先,您需要从Python官方网站下载Python2.7的安装程序。您可以在以…

    other 2023年5月7日
    00
  • java面向对象的三个特征

    Java面向对象的三个特征 Java作为一种面向对象的编程语言,其核心思想是“万物皆对象”。理解面向对象的三个特征对于学习和掌握Java编程至关重要。 封装性 封装性是Java面向对象的一种基本特征,指的是将数据和行为打包成一个整体,对外提供统一的访问接口,同时隐藏了实现细节。通过封装,可以实现信息的隐藏和保护,使得程序更加健壮和安全。 在Java中,封装是…

    其他 2023年3月28日
    00
  • qt项目开发实例(含源码)

    以下是详细讲解“Qt项目开发实例(含源码)”的标准Markdown格式文本: Qt项目开发实例(含源码) Qt是一个跨平台的C++应用程序开发框架,可以用于发桌面应用程序、移动应用程序和嵌入式应用程序。本文将介绍Qt项目开发的实例,包括Qt项目创建、Qt项目的编译和Qt项目的运行,同时提供两个示例说明。 1. Qt项目的创建 可以使用Qt Creator创建…

    other 2023年5月9日
    00
  • Win7资源管理器的常见应用技巧(图文教程)

    Win7资源管理器的常见应用技巧(图文教程) Win7资源管理器是Windows 7操作系统中的一个重要工具,它可以帮助用户管理文件和文件夹。下面是一些常见的应用技巧,帮助您更好地使用Win7资源管理器。 1. 快速访问常用文件夹 Win7资源管理器的快速访问功能可以帮助您快速打开常用的文件夹。您可以在左侧导航栏中找到“快速访问”部分。要添加一个文件夹到快速…

    other 2023年9月6日
    00
  • 魔兽世界7.2.5射击猎怎么堆属性 wow7.25射击猎配装属性优先级攻略

    魔兽世界7.2.5射击猎配装属性优先级攻略 射击猎作为一个远程输出职业,在进行配装时需要重点关注一些属性以达到最高的输出效果。那么在魔兽世界7.2.5版本中,射击猎应该如何进行属性堆叠呢?以下就是针对7.2.5版本射击猎配装属性优先级攻略的详细说明: 1. 总体要求 首先,射击猎在进行配装时需要注意以下几个方面: 尽量保证爆发能力,即在短时间内输出尽量高的伤…

    other 2023年6月27日
    00
  • Java利用Request请求获取IP地址的方法详解

    Java利用Request请求获取IP地址的方法详解 在Java中,我们可以使用Request请求来获取客户端的IP地址。下面是一种常用的方法来实现这个功能。 1. 获取HttpServletRequest对象 首先,我们需要获取HttpServletRequest对象,该对象包含了客户端请求的信息。可以通过在方法参数中添加HttpServletReques…

    other 2023年7月30日
    00
  • vscode如何快捷键一键生成vue模板

    以下是关于“VSCode如何快捷键一键生成Vue模板”的完整攻略,包括基本知识和两个示例。 基本知识 在VSCode中,可以使用插件来快速生成Vue模板。其中,Vue 2ippets是一个常用的插件,它提供了许多常用的Vue模板代码片段,可以使用快捷键快速生成Vue模板。 解决方案 以下是解决“VSCode如何快捷键一键生成Vue模板”的步骤: 安装Vue …

    other 2023年5月7日
    00
  • vantcell单元格

    Vantcell单元格攻略 Vantcell是一款基于Vue.js的移动端UI组件库,其中的单元格组件可以用于展示列表数据。本攻略将介绍Vantcell单元格的使用方法,包括元格的基本用法、自定义单元格、单元格的事件等。 基本用法 Vantcell单元格的基本用非常简单,只需要在代码中引入Vantcell组件库,并使用van-cell标签即可。例如: &lt…

    other 2023年5月7日
    00
合作推广
合作推广
分享本页
返回顶部