JAVA8 可以用 Lambda 表达式对 List 进行排序,但是只适用于List 中为实体类对象,比如List<Car>,其中Car为汽车类,这类型排序网上很多,一搜就能找到,就不说明了。
但是经常遇到 List<? extends Map> 类型的结构该如何排序呢?下面进入正题。
案例:
在 List 中存入 Map,其中 Map 存入两个属性:roomNo(房间号)、time(时间)。
排序规则:先按照 roomNo 进行升序排列,如果 roomNo 一致再按照 time 降序排列。
下面是代码:
public static void main(String[] args) {
// 生成待用数据
List<Map<String, Object>> list = Lists.newArrayList();
Map map1 = new DataMap();
Map map2 = new DataMap();
Map map3 = new DataMap();
Map map4 = new DataMap();
map1.put("roomNo", "0102");
map1.put("time", "2020-01-01 00:00:11");
map2.put("roomNo", "0101");
map2.put("time", "2020-01-01 00:00:12");
map3.put("roomNo", "0102");
map3.put("time", "2020-01-01 00:00:13");
map4.put("roomNo", "0102");
list.add(map1);
list.add(map2);
list.add(map3);
list.add(map4);
// 排序器
Comparator<Map<String, Object>> comparator = new Comparator<Map<String, Object>>() {
@Override
public int compare(Map<String, Object> o1, Map<String, Object> o2) {
int o1RoomNo = Integer.parseInt(o1.get("roomNo").toString());
int o2RoomNo = Integer.parseInt(o2.get("roomNo").toString());
if (o1RoomNo > o2RoomNo) {
return 1;
}else if (o1RoomNo < o2RoomNo) {
return -1;
}else{
// 若是相同房间号,则比较时间
if (o1.get("time") == null || o2.get("time") == null ) {
return 1;
}
DateTime o1Time = DateTimeUtil.parse(o1.get("time").toString());
DateTime o2Time = DateTimeUtil.parse(o2.get("time").toString());
if (DateTimeUtil.compare(o1Time, o2Time) > 0) {
return -1;
}else if (DateTimeUtil.compare(o1Time, o2Time) < 0) {
return 1;
}
return 0;
}
}
};
System.out.println(" --------------------------- 排序前 -----------------------------------");
System.out.println();
for (Map map : list) {
System.out.println(map);
}
// 排序
list.sort(comparator);
System.out.println(" --------------------------- 排序后 -----------------------------------");
System.out.println();
for (Map map : list) {
System.out.println(map);
}
}
运行程序,打印如下:
--------------------------- 排序前 -----------------------------------
{"roomNo":"0102","time":"2020-01-01 00:00:11"}
{"roomNo":"0101","time":"2020-01-01 00:00:12"}
{"roomNo":"0102","time":"2020-01-01 00:00:13"}
{"roomNo":"0102"}
--------------------------- 排序后 -----------------------------------
{"roomNo":"0101","time":"2020-01-01 00:00:12"}
{"roomNo":"0102","time":"2020-01-01 00:00:13"}
{"roomNo":"0102","time":"2020-01-01 00:00:11"}
{"roomNo":"0102"}
本文介绍了如何使用 Java8 的 Lambda 表达式对 List<Map> 结构进行多字段排序,具体场景是在 List 中存储 Map,Map 包含 roomNo 和 time 两个字段。排序规则为首先根据 roomNo 升序,roomNo 相同时按 time 降序。示例代码展示了具体的实现方式,并给出了运行结果。
5030

被折叠的 条评论
为什么被折叠?



