说明
在项目里面,有时候经常要对数据做统计呈现给前端做各种类型的图,但是在后端中,有时候老是遇到需要将2个List
代码
package com.etone.project.controllers.dtracejobinfo;
import java.text.SimpleDateFormat;
import java.util.*;
public class Test {
public static void main(String[] args) {
mergeList1();
}
//list1中的日期为主要日期,如果list2中的有的日期在list1中不存在,会放到最后显示,会导致排序错乱,需要重新排序
// 如果符合这种情况,可以用如下方法
//map里面可以有多个key、value值,下面的也是可以合并到一个list<map>里面
//map1.put("date","2021-11-24");
//map1.put("num1",1);
//map1.put("count1",1);
public static void mergeList1() {
List<Map<String, Object>> list1 = new ArrayList<>();
List<Map<String, Object>> list2 = new ArrayList<>();
Map<String, Object> map1 = new HashMap<>();
map1.put("date", "2021-11-24");
map1.put("num1", 1);
Map<String, Object> map2 = new HashMap<>();
map2.put("date", "2021-11-25");
map2.put("num1", 2);
Map<String, Object> map3 = new HashMap<>();
map3.put("date", "2021-11-26");
map3.put("num1", 3);
Map<String, Object> map4 = new HashMap<>();
map4.put("date", "2021-11-27");
map4.put("num1", 4);
Map<String, Object> map5 = new HashMap<>();
map5.put("date", "2021-11-28");
map5.put("num1", 5);
Map<String, Object> map6 = new HashMap<>();
map6.put("date", "2021-11-25");
map6.put("num2", 6);
Map<String, Object> map7 = new HashMap<>();
map7.put("date", "2021-11-26");
map7.put("num2", 7);
Map<String, Object> map8 = new HashMap<>();
map8.put("date", "2021-11-28");
map8.put("num2", 8);
Map<String,Object> map11=new HashMap<>();
map11.put("date","2021-11-30");
map11.put("num2",11);
Map<String,Object> map12=new HashMap<>();
map12.put("date","2021-11-20");
map12.put("num2",12);
//第一步:模拟从数据库中查询统计数据,将结果放到List集合里面
//模拟数据库根据时间分组,统计第一种数量,并以升序的方式排列,这是第一条数据
list1.add(map1);
list1.add(map2);
list1.add(map3);
list1.add(map4);
list1.add(map5);
System.out.println("list1=" + list1.toString());
//模拟数据库根据时间分组,统计第二种数量,并以升序的方式排列,这是第二条数据
list2.add(map12);
list2.add(map6);
list2.add(map7);
list2.add(map8);
list2.add(map11);
System.out.println("list2=" + list2.toString());
//-------------------------------------------------------------------------------
//第二歩:将2个List<map>集合整合到一个List<map>集合里面
//下面才是实际需要的处理过程
//期望结果显示样例,如果时间相同,那么就放到一个集合里面如:[{date=2021-11-24, num1=1,num2=5}]
//处理方法,先将2个list里面的map加到一个新的List<map>集合里面,这样以后如果有多个list<map>,可以统一在一个list<map>处理
List<Map<String, Object>> list3 = new ArrayList<>();
//将list1集合里面的map添加到list3中
for (int i = 0; i < list1.size(); i++) {
list3.add(list1.get(i));
}
//将list2集合里面的map添加到list3中
for (int i = 0; i < list2.size(); i++) {
list3.add(list2.get(i));
}
System.out.println("将list1和list2放到list3=" + list3.toString());
//统一在一个list<map>里面处理,开始根据时间进行比对,整合到一个map里面
for (int i = 0; i < list3.size(); i++) {
Map map9 = list3.get(i);
for (int j = i + 1; j < list3.size(); ) {
Map<String, Object> map10 = list3.get(j);
if (map9.get("date") == map10.get("date")) {
for (Map.Entry entry : map10.entrySet()) {
if (entry.getKey().equals("date")) {
//不保存date
continue;
}
map9.put(entry.getKey(), entry.getValue());
}
//删除已合并的map避免重复比较
list3.remove(j);
continue;
}
j++;
}
}
System.out.println("经处理后的得到期望的list3结果=" + list3.toString());
//第三歩:通过date将list<map>集合重新按时间升序排列
//将处理后的list3集合按日期升序排序
Collections.sort(list3, new Comparator<Map<String, Object>>() {
//升序排列
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
return o1.get("date").toString().compareTo(o2.get("date").toString());
}
});
System.out.println("升序后排列结果="+list3.toString());
}
}
后台呈现结果如下:
list1=[{date=2021-11-24, num1=1}, {date=2021-11-25, num1=2}, {date=2021-11-26, num1=3}, {date=2021-11-27, num1=4}, {date=2021-11-28, num1=5}]
list2=[{date=2021-11-20, num2=12}, {date=2021-11-25, num2=6}, {date=2021-11-26, num2=7}, {date=2021-11-28, num2=8}, {date=2021-11-30, num2=11}]
将list1和list2放到list3=[{date=2021-11-24, num1=1}, {date=2021-11-25, num1=2}, {date=2021-11-26, num1=3}, {date=2021-11-27, num1=4}, {date=2021-11-28, num1=5}, {date=2021-11-20, num2=12}, {date=2021-11-25, num2=6}, {date=2021-11-26, num2=7}, {date=2021-11-28, num2=8}, {date=2021-11-30, num2=11}]
经处理后的得到期望的list3结果=[{date=2021-11-24, num1=1}, {date=2021-11-25, num1=2, num2=6}, {date=2021-11-26, num1=3, num2=7}, {date=2021-11-27, num1=4}, {date=2021-11-28, num1=5, num2=8}, {date=2021-11-20, num2=12}, {date=2021-11-30, num2=11}]
升序后排列结果=[{date=2021-11-20, num2=12}, {date=2021-11-24, num1=1}, {date=2021-11-25, num1=2, num2=6}, {date=2021-11-26, num1=3, num2=7}, {date=2021-11-27, num1=4}, {date=2021-11-28, num1=5, num2=8}, {date=2021-11-30, num2=11}]
Process finished with exit code 0