Map<String, List<Object>> 按key降序排列
时间: 2023-09-24 19:02:52 浏览: 128
可以使用Java8的Stream API来实现。具体实现方法如下:
```
Map<String, List<Object>> map = ... // 待排序的Map
Map<String, List<Object>> sortedMap = map.entrySet().stream()
.sorted(Map.Entry.<String, List<Object>>comparingByKey().reversed())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(oldValue, newValue) -> oldValue, LinkedHashMap::new));
```
解释一下上述代码的实现逻辑:
1. 调用Map的entrySet()方法将Map转换为一个包含键值对的Set集合。
2. 调用Stream API的sorted()方法并传入一个Comparator,按照键值对的键(即Map的key)进行降序排序。
3. 调用Stream API的collect()方法将排序后的键值对重新组装为一个新的Map。
4. 使用LinkedHashMap作为新Map的实现类,以保证插入顺序。
最终得到的sortedMap就是按照key降序排列的Map。
相关问题
对 Map<String, List<Map<String, Object>>>中的list group by 并且生成Map<String,Map<String, List<Map<String, Object>>>>
可以使用Java 8的Stream API来对Map<String, List<Map<String, Object>>>中的list进行分组,并生成Map<String, Map<String, List<Map<String, Object>>>>。下面是一个示例代码:
```java
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class GroupByExample {
public static void main(String[] args) {
Map<String, List<Map<String, Object>>> originalMap = ...; // 原始的Map<String, List<Map<String, Object>>>对象
Map<String, Map<String, List<Map<String, Object>>>> groupedMap = originalMap.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> entry.getValue().stream()
.collect(Collectors.groupingBy(
map -> (String) map.get("groupKey")
))
));
System.out.println(groupedMap);
}
}
```
在上面的代码中,我们使用了`Collectors.groupingBy`方法来对list进行分组,分组的依据是list中每个Map对象的`groupKey`属性的值。最终,我们将分组结果存储在一个新的Map对象`groupedMap`中。
Java Map<List<Map<String, Object>>>类型数据,每个key的value只保留一条,然后转成List<Map<String, Object>>
如果你有一个`Map<List<Map<String, Object>>>`的数据结构,其中每个Key对应一个子列表,你想移除每个子列表中重复的元素并将其转换为新的`List<Map<String, Object>>`,可以按照以下步骤操作:
1. 遍历外部的Map,对于每个子列表:
- 使用Java Stream的`distinct()`方法去除重复项,因为`List<Map<String, Object>>`本身是有序的,所以默认的`distinct()`就足够了,它会基于`equals()`和`hashCode()`进行比较,确保唯一性。
- 将去重后的子列表作为一个单独的对象存储起来,例如`Optional<Map<String, Object>>`,这可以避免创建新的Map实例,直到真正需要时才构造。
```java
Map<String, List<Map<String, Object>>> originalMap = ...;
Map<String, Optional<Map<String, Object>>> deduplicatedMap = originalMap.entrySet().stream()
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> {
List<Map<String, Object>> value = entry.getValue();
return value.stream()
.distinct()
.findFirst(); // 返回第一个非重复元素,或者Optional.empty()如果没有重复
},
(prev, next) -> prev // 后面的映射覆盖前面的,这里不需要合并
));
```
2. 将`Optional<Map<String, Object>>`转换回`List<Map<String, Object>>`:
可以使用`Stream.concat()`和`orElseGet()`来完成,或者直接过滤掉`Optional.empty()`:
```java
List<Map<String, Object>> finalResult = deduplicatedMap.values().stream()
.map(Optional::get) // 或者.map(Map::orElseThrow(() -> new IllegalStateException("No unique element found")))
.collect(Collectors.toList());
```
这里的`.orElseGet(() -> ...)`提供了默认值,当`Optional`是空的时候,会执行给定的函数获取默认值,这里是抛出异常。
最终的`finalResult`就是一个不含重复项的新列表,其中每个Key对应的value都是唯一的。
阅读全文
相关推荐














