Java List<Map>类型的数据按id排序后按date分组,分组后顺序不要变
时间: 2024-11-09 14:25:55 浏览: 32
在Java中,如果你有一个`List<Map<String, Object>>`类型的集合,其中包含`id`和`date`等键值对,并希望根据`id`进行排序,然后按照`date`字段进行分组,同时保持每个分组内的顺序不变,你可以这样做:
首先,你需要创建一个自定义的Comparator来比较Map,这里假设`id`是数字类型,可以自然排序,而`date`通常是一个Date对象,可以先将其转换成String以便于排序。
```java
import java.text.SimpleDateFormat;
import java.util.*;
class MapComparator implements Comparator<Map<String, Object>> {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
@Override
public int compare(Map<String, Object> map1, Map<String, Object> map2) {
Long id1 = (Long) map1.get("id");
Long id2 = (Long) map2.get("id");
// 先按id排序
int idCompare = Integer.compare(id1, id2);
if (idCompare != 0) return idCompare;
// 如果id相等,则按照日期排序,这里假设date都是字符串形式
String dateStr1 = dateFormat.format(map1.get("date"));
String dateStr2 = dateFormat.format(map2.get("date"));
return dateStr1.compareTo(dateStr2);
}
}
```
接着,你可以使用Collections.sort()方法并配合自定义的Comparator来完成排序和分组:
```java
List<Map<String, Object>> sortedAndGrouped = new ArrayList<>();
// 假设你已经填充了mapList
MapComparator comparator = new MapComparator();
Collections.sort(sortedAndGrouped, comparator);
// 使用Stream API进行分组,但注意Java Stream的groupingBy会改变元素顺序
Map<Long, List<Map<String, Object>>> groupedMaps = sortedAndGrouped.stream()
.collect(Collectors.groupingBy(map -> (long) map.get("id"), Collectors.toList()));
```
现在,`groupedMaps`中存储的就是按照id排序并且在每个id内按date排序后的数据。请注意,由于`Collectors.toList()`默认的内部排序规则,列表内的顺序可能会与输入的原始顺序略有差异,如果需要保证原顺序,可以考虑使用`LinkedHashMap`作为分组容器。
阅读全文