我有一个哈希表的形式
Map<String, Map<String,Double>
我需要处理它并创建另一个具有相同结构的文件。
以下样本说明目标
INPUT HASH TABLE
----------------------------
| | 12/7/2000 5.0 |
| id 1 | 13/7/2000 4.5 |
| | 14/7/2000 3.4 |
...
| id N | .... |
OUTPUT HASH TABLE
| id 1 | 1/1/1800 max(5,4.5,3.4) |
... ...
特别是,输出必须具有相同的键(id1,...,id n)
内部哈希表必须具有固定键(1/1/1800)和已处理的值。
我当前(无效)的代码:
output = input.entrySet()
.stream()
.collect(
Collectors.toMap(entry -> entry.getKey(),
entry -> Collectors.toMap(
e -> "1/1/2000",
e -> {
// Get input array
List<Object> list = entry.getValue().values().stream()
.collect(Collectors.toList());
DescriptiveStatistics stats = new DescriptiveStatistics();
// Remove the NaN values from the input array
list.forEach(v -> {
if(!new Double((double)v).isNaN())
stats.addValue((double)v);
});
double value = stats.max();
return value;
}));
问题出在哪里?
谢谢
最佳答案
问题是尝试在第一个Collectors.toMap
内调用Collectors.toMap
第二种类型。 Collectors.toMap
应该传递给接受Collector
的方法。
这是实现所需目标的一种方法:
Map<String, Map<String,Double>>
output = input.entrySet()
.stream()
.collect(Collectors.toMap(e -> e.getKey(),
e -> Collections.singletonMap (
"1/1/1800",
e.getValue()
.values()
.stream()
.filter (d->!Double.isNaN (d))
.mapToDouble (Double::doubleValue)
.max()
.orElse(0.0))));
请注意,不需要第二个
Collectors.toMap
。输出的内部Map
每个都有一个条目,因此您可以使用Collections.singletonMap
来创建它们。