V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rqxiao
V2EX  ›  程序员

Java 中 list 一个集合的展示

  •  
  •   rqxiao · 2020-02-20 10:33:05 +08:00 · 2037 次点击
    这是一个创建于 1524 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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}

    5 条回复    2020-02-20 18:18:34 +08:00
    yokiam
        1
    yokiam  
       2020-02-20 11:27:46 +08:00
    你的头像让我想起了不太美好的回忆
    godoway
        2
    godoway  
       2020-02-20 14:09:31 +08:00
    用 Collector.of()构造一个包含所有 Column 的 HashMap 作初始值的 Collector 吧
    aguesuka
        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
    aguesuka
        4
    aguesuka  
       2020-02-20 16:36:02 +08:00
    godoway
        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}
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3154 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 14:30 · PVG 22:30 · LAX 07:30 · JFK 10:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.