public class Record {
//组 private String group;
//code private String code;
//数量 private Integer count; }
List<record> list=new ArrayList<>(); list.add(new Record("组 1","code1",2)); list.add(new Record("组 1","code2",1)); list.add(new Record("组 2","code1",1)); list.add(new Record("组 2","code3",1));</record>
前端希望的结果展示如下,所有左边的列(组)都是另一个地方查出来的需要与现在这个集合去匹配
合计 - | 3 | 1 | 1
现在除了 filter 再 groupby 之后 其他组里存在 code,但本组里不存在就没有完全显示,还有什么好的办法能够完整展示这个结果吗
Map<String, Integer> collect = list.stream().filter(record -> "组 1".equals(record.getGroup())) .collect( Collectors.groupingBy(Record::getCode, Collectors.summingInt(Record::getCount)));
{code2=1, code1=2} {code3=1, code1=1}
1
yokiam 2020-02-20 11:27:46 +08:00
你的头像让我想起了不太美好的回忆
|
2
godoway 2020-02-20 14:09:31 +08:00
用 Collector.of()构造一个包含所有 Column 的 HashMap 作初始值的 Collector 吧
|
3
aguesuka 2020-02-20 16:31:46 +08:00
按照我的理解,比如现在如果有 2 个组,3 个 code,你就要返回一个 size 是 2 的 json 数组,数组中是 map,map 里至少包括 3 个 code (可能还有组名或 id )。而你查询的数据如果没有则默认为 0。按照你当前的写法,如果有 n 个组,数组长 m 循环次数是 n * m。
我觉得你可以实现可以 DoubleKeyMap,第一次循环 list,DoubleKeyMap.put(group, code, count) 然后有两个 key set,做一次双重循环,getOrDefult(0)。 https://www.antlr.org/api/JavaTool/org/antlr/v4/runtime/misc/DoubleKeyMap.html |
4
aguesuka 2020-02-20 16:36:02 +08:00
|
5
godoway 2020-02-20 18:18:34 +08:00
试着写了一下
final Set<String> columns = list.stream().map(Record::getCode).collect(Collectors.toSet()); list.stream() .collect(Collectors.groupingBy(Record::getGroup)) .entrySet().stream() .map(entry -> { List<Record> tmp = entry.getValue(); Collector<Record, Map<String, Integer>, Map<String, Integer>> collector = Collector.of( () -> columns.stream().collect(Collectors.toMap(col -> col, count -> 0)), (map, record) -> { String code = record.getCode(); map.put(code, map.getOrDefault(code, 0) + 1); }, (m, sm) -> m ); Map<String, Integer> row = tmp.stream().collect(collector); return new HashMap.SimpleEntry<>(entry.getKey(), row); }) .forEach(System.out::println); 输出: 组 2={code3=1, code2=0, code1=1} 组 1={code3=0, code2=1, code1=1} |