【问题标题】:Sort and convert values while performing groupby operation in Java在 Java 中执行 groupby 操作时对值进行排序和转换
【发布时间】:2022-12-11 18:48:05
【问题描述】:

我有以下行数据集:-

OrderId     Action                  Timestamp
3           Pay money               2015-05-27 12:48:47.000
3           Select Item             2015-05-27 12:44:47.000
1           Generate Payment        2015-05-27 12:55:47.000
2           Pay money               2015-05-27 12:48:47.000
2           Select Item             2015-05-27 12:44:47.000
2           Deliver                 2015-05-27 12:55:47.000
1           Generate Invoice        2015-05-27 12:48:47.000
1           Create PO               2015-05-27 12:44:47.000
3           Deliver                 2015-05-27 12:55:47.000

我想要实现的是一张地图:-

[3] -> ["Select Item", "Pay money", "Deliver"]
[1] -> ["Create PO", "Generate Invoice", "Generate Payment"]
[2] -> ["Select Item", "Pay money", "Deliver"]  

通过执行以下操作:-

  1. 我想按 orderId 分组。
  2. 按时间戳对操作进行排序。
  3. 创建一组动作(因为可能有重复)。

    我试图在单个 groupby 操作中执行此操作,因为执行单独的排序,如果数据集很大,映射操作会花费很多时间。

    我试着这样做:-

    orderRows.stream()
                    .collect(Collectors.groupingBy(OrderRow::getOrderId, 
                            mapping(Function.identity(),
                                    toCollection(
                                            () -> new TreeSet<>(Comparator.comparing(e -> e.timestamp))
                                    ))));
    

    但后来我得到输出为Map&lt;String, Set&lt;OrderRow&gt;&gt; 我在哪里寻找类似Map&lt;String, Set&lt;String&gt;&gt;的东西 如果有人能告诉我至少一个方向,我将非常感激......

【问题讨论】:

    标签: java java-stream groupingby


    【解决方案1】:

    您可以在应用collect 之前按时间戳对流元素进行排序。这将保证列表中的actions 将按要求的顺序使用。

    要保留这些字符串的顺序,您可以使用 LinkedHashSetTreeSet 在这种情况下没有帮助,因为您需要按集合中不存在的属性保持顺序)。

    var actionsById = orderRows.stream()
        .sorted(Comparator.comparing(OrderRow::getTimestamp))
        .collect(Collectors.groupingBy(
            OrderRow::getOrderId,
            Collectors.mapping(
                OrderRow::getAction,
                Collectors.toCollection(LinkedHashSet::new))
        ));
    

    【讨论】:

    • 我正是这样做的,但是在 groupingBy 之前进行单独排序所需的时间几乎是 6 倍。这是一项关键操作,应在几毫秒内完成。这就是为什么我想把所有东西都放在一起。
    猜你喜欢
    • 2012-12-01
    • 2021-08-27
    • 2018-02-01
    • 2022-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多