java List集合按照条件分组:Map<String,List<Object>>

 

一、项目场景:

        1、根据一个条件筛选出数据,数据形式为List<>;

        2、从筛选出来的List<>中,根据某一元素进行分组,筛选出需要的数据。

解法:

        因为某一元素下边会对应多条数据信息,所以首先想到的是使用Map<String,List<Object>>形式去做关系映射。

二、代码实现

考点:如何对List集合中的元素按照某个特性进行分组

1、首先我们创建一个Student类

package com.cn.Arithmetic;

import lombok.Data;

/**
 * @ClassName Student
 * @Description TODO
 * @Author WYD
 * @Date 2022/9/21 22:16
 * @Version 1.0
 */
@Data
public class Student {

    //姓名
    private String name;
    //年龄
    private int age;
    //分类依据
    private String type;


}

2、接下来我们我们创建几个Student的实例化对象,然后按照type属性进行分组,然后使用Map集合存储这些分组。

package com.cn.Arithmetic;

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

/**
 * @ClassName GroupingArray
 * @Description TODO
 * @Author WYD
 * @Date 2022/9/21 22:15
 * @Version 1.0
 */
public class GroupingArray {

    public static void main(String[] args) {
        //创建map集合,用于存储分组后的list集合对象
        Map<String, List<Student>> map1 = new HashMap<>();
        Map<String, List<Student>> map2 = new HashMap<>();

        //实例化对象
        Student s1 = new Student();
        s1.setName("张三");
        s1.setAge(19);
        s1.setType("A");
        Student s2 = new Student();
        s2.setName("李四");
        s2.setAge(12);
        s2.setType("A");
        Student s3 = new Student();
        s3.setName("王五");
        s3.setAge(22);
        s3.setType("A");
        Student s4 = new Student();
        s4.setName("小明");
        s4.setAge(12);
        s4.setType("B");
        Student s5 = new Student();
        s5.setName("小红");
        s5.setAge(12);
        s5.setType("B");

        //将实例化对象添加到list集合中
        List<Student> list = new ArrayList<>();
        list.add(s1);
        list.add(s2);
        list.add(s3);
        list.add(s4);
        list.add(s5);

        //打印未分组的list
        System.out.println("未分组前的集合");
        System.out.println(list);
        System.out.println("=============================");


        System.out.println("第一种分组方法");
        //使用第一种分组的办法
        map1 = groupingArrayListOne(list);
        System.out.println(map1);
        //遍历分组后的map1
        traverseMap(map1);

        System.out.println("=============================");

        System.out.println("第二种分组方法");
        //使用第二种分组的办法
        map2 = groupingArrayListTwo(list);
        System.out.println(map2);
        //遍历分组后的map2
        traverseMap(map2);
    }

    //第一种分组的方法
    public static Map<String, List<Student>> groupingArrayListOne(List<Student> list) {
        Map<String, List<Student>> map = new HashMap<>();
        //分组
        for (Student l : list) {
            //判断是否存在该key
            if (map.containsKey(l.getType())) {
                //存在就获取该key的value然后add
                map.get(l.getType()).add(l);
            } else {
                List<Student> lt = new ArrayList<>();
                lt.add(l);
                //不存在就put
                map.put(l.getType(), lt);
            }
        }
        return map;
    }

    //第二种分组的方法
    public static Map<String, List<Student>> groupingArrayListTwo(List<Student> list) {

        //使用jdk8的流式编程对list集合进行分组
        Map<String, List<Student>> listMap = list.stream().collect(Collectors.groupingBy(t -> t.getType()));
        return listMap;

    }

    //遍历Map集合
    public static void traverseMap(Map<String, List<Student>> map) {
        for (String s : map.keySet()) {
            System.out.println(map.get(s));
        }
    }

    /*
    未分组前的集合
    [Student(name=张三, age=19, type=A), Student(name=李四, age=12, type=A), Student(name=王五, age=22, type=A), Student(name=小明, age=12, type=B), Student(name=小红, age=12, type=B)]
    =============================
    第一种分组方法
    {A=[Student(name=张三, age=19, type=A), Student(name=李四, age=12, type=A), Student(name=王五, age=22, type=A)], B=[Student(name=小明, age=12, type=B), Student(name=小红, age=12, type=B)]}
    [Student(name=张三, age=19, type=A), Student(name=李四, age=12, type=A), Student(name=王五, age=22, type=A)]
    [Student(name=小明, age=12, type=B), Student(name=小红, age=12, type=B)]
    =============================
    第二种分组方法
    {A=[Student(name=张三, age=19, type=A), Student(name=李四, age=12, type=A), Student(name=王五, age=22, type=A)], B=[Student(name=小明, age=12, type=B), Student(name=小红, age=12, type=B)]}
    [Student(name=张三, age=19, type=A), Student(name=李四, age=12, type=A), Student(name=王五, age=22, type=A)]
    [Student(name=小明, age=12, type=B), Student(name=小红, age=12, type=B)]
     */
}

以上为两种遍历方式,可以做参考!

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彦登的登

动力来源

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值