Java 中 list 一个集合的展示

2020-02-20 10:33:05 +08:00
 rqxiao

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>

前端希望的结果展示如下,所有左边的列(组)都是另一个地方查出来的需要与现在这个集合去匹配

------ code1 code2 code3

组 1 - | 2 | 1 | 0

组 2 - | 1 | 0 | 1

合计 - | 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}

2049 次点击
所在节点    程序员
5 条回复
yokiam
2020-02-20 11:27:46 +08:00
你的头像让我想起了不太美好的回忆
godoway
2020-02-20 14:09:31 +08:00
用 Collector.of()构造一个包含所有 Column 的 HashMap 作初始值的 Collector 吧
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
aguesuka
2020-02-20 16:36:02 +08:00
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}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/646034

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX