一、分析

实际应用场景,list中的元素的某个属性是重复的,因此可以按照此元素对list进行分组,最终放到Map集合,此元素为key值,分组后的list为value值

二、实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static Map<String,List<User>> splitGroup(List<User> list){
//初始化一个map
Map<String,List<User>> map = new HashMap<>();
for(User user : list){
String key = user.getId();
if(map.containsKey(key)){
//如果map中存在以此id作为的key,将数据元素存放当前key的list集合中
map.get(key).add(user);
}else{
//map中不存在以此id作为的key,新建key用来存放数据
List<User> userList = new ArrayList<>();
userList.add(user);
map.put(key,userList);
}
}
return map;

三、测试代码及测试结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public static void main(String[] args) {
List<User> list = new ArrayList<>();
//当前测试以id来分组,User实体类中成员变量有id及name,全参构造方法,toString方法
list.add(new User("1", "1"));
list.add(new User("1", "2"));
list.add(new User("2", "2"));
list.add(new User("2", "3"));
list.add(new User("2", "4"));
list.add(new User("3", "3"));

//测试普通方法
//Map<String, List<User>> stringListMap = splitGroup(list);

//测试stream流
Map<String,List<User>> stringListMap = list.stream().collect(Collectors.groupingBy(User::getId));

//将map集合转为set集合遍历
Set<Map.Entry<String, List<User>>> entries = stringListMap.entrySet();
for(Map.Entry m : entries){
System.out.println(m);
}
}

测试的结果如下

imagebf042a82007d3da8.png

四、实战

原数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class ThresholdVo {

@ApiModelProperty(value = "站点ID")
private Integer siteId;

@ApiModelProperty(value = "站点名称")
private String siteName;

@ApiModelProperty(value = "站点状态")
private Integer state;

@ApiModelProperty(value = "所属项目ID")
private Integer projId;

@ApiModelProperty(value = "所属项目名称")
private String projName;

@ApiModelProperty(value = "设备ID")
private String deviceId;

@ApiModelProperty(value = "设备名称")
private String deviceName;

@ApiModelProperty(value = "设备编号")
private String dNo;

@ApiModelProperty(value = "检测能力code")
private String mCode;

@ApiModelProperty(value = "低阈值")
private BigDecimal lowThreshold;

@ApiModelProperty(value = "实际值")
private Float av;

@ApiModelProperty(value = "高阈值")
private BigDecimal highThreshold;

@ApiModelProperty(value = "基础高层")
private BigDecimal basicHigh;

@ApiModelProperty(value = "时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date updateTime;

@ApiModelProperty(value = "是否异常")
private Integer isError;
}

目标数据结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
public class RealTimeDataVo {

@ApiModelProperty(value = "站点ID")
private Integer siteId;

@ApiModelProperty(value = "站点名称")
private String siteName;

@ApiModelProperty(value = "站点状态")
private Integer state;

@ApiModelProperty(value = "所属项目ID")
private Integer projId;

@ApiModelProperty(value = "所属项目名称")
private String projName;

@ApiModelProperty(value = "设备ID")
private String deviceId;

@ApiModelProperty(value = "设备名称")
private String deviceName;

@ApiModelProperty(value = "设备编号DeviceNo")
private String waterId;

@ApiModelProperty(value = "时间")
@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;

@ApiModelProperty(value = "监测能力")
private List<MoniVo> moniVoList;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class MoniVo {

@ApiModelProperty(value = "检测能力code")
private String moniCode;

@ApiModelProperty(value = "实际值")
private Float av;

@ApiModelProperty(value = "低阈值")
private BigDecimal lowThreshold;

@ApiModelProperty(value = "高阈值")
private BigDecimal highThreshold;

@ApiModelProperty(value = "基础高层")
private BigDecimal basicHigh;

@ApiModelProperty(value = "是否异常")
private Integer isError;
}

结构变化

image92b803f7aae32e4e.png

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
List<RealTimeDataVo> realTimeDataVoList = new ArrayList<>();
//用map来进行去重
HashMap<RealTimeDataVo, List<MoniVo>> map = new HashMap<>();
for (ThresholdVo thresholdVo : thresholdVos){
RealTimeDataVo realTimeDataVo = new RealTimeDataVo(thresholdVo);
MoniVo moniVo = new MoniVo(thresholdVo);
if(map.containsKey(realTimeDataVo)){
//如果map中存在以此realTimeDataVo作为的key,将moniVo存放当前key的list集合中
map.get(realTimeDataVo).add(moniVo);
}else{
//map中不存在以此realTimeDataVo作为的key,新建key用来存放List<MoniVo>
List<MoniVo> moniVoList = new ArrayList<>();
moniVoList.add(moniVo);
map.put(realTimeDataVo,moniVoList);
}
}
for (RealTimeDataVo realTimeDataVo : map.keySet()) {
realTimeDataVo.setMoniVoList(map.get(realTimeDataVo));
realTimeDataVoList.add(realTimeDataVo);
}

参考博客

https://blog.csdn.net/shang_0122/article/details/108753580