一、项目场景:
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)]
*/
}
以上为两种遍历方式,可以做参考!