【问题标题】:Grouping HashBasedTable entries based on DateTime row根据 DateTime 行对 HashBasedTable 条目进行分组
【发布时间】:2019-03-11 22:18:31
【问题描述】:

我有一个 HashBasedTable (com.google.common.collect.HashBasedTable),格式如下:Table<DateTime, C, V>DateTime 来自org.joda.time.DateTime

我想根据特定的时间间隔对条目进行分组。例如,如果条目 A 和 B 彼此相差 100 毫秒,我想将它们组合在同一行上。我可以选择在处理过程中插入以及插入后执行此操作。我应该如何以最有效的方式做到这一点?

参考链接:

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/collect/HashBasedTable.html

https://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html

【问题讨论】:

  • “在 100 毫秒内” 如果时间是 6080 ms6150 ms6220 ms? #1 和#2 相距100ms 以内,#2 和#3 相距100ms 以内,但#1 和#3 相距100ms 以上。它们应该如何分组?
  • 通常,您不会将“彼此相距 100 毫秒”分组,而是创建 100 毫秒宽的时隙,方法是将时间截断到 100 毫秒的边界,然后在 Map<DateTime, List<V>> 中收集数据,所以落入同一时间段的所有值都将添加到该时间段的列表中。
  • @ole-v-v: Table type: com.google.common.collect.HashBasedTable and DateTime type: org.joda.time.DateTime 解决第一条评论@andreas: 在插入6150时,我会将它与@分组987654336@,对于6220,因为相对于第一组 (6080) 超过 100 毫秒,我会将其分开。要解决第二条评论@andreas:是的,这听起来像是一种更合理的方法。假设我可以将其四舍五入到最接近的 100 毫秒。
  • 使用 Joda-Time 是固定要求吗?询问是因为 Joda-Time 已被现代 Java 日期和时间 API java.time 取代。

标签: java algorithm datetime grouping hashtable


【解决方案1】:

这是一个例子。

    Table<DateTime, String, String> yourTable = // your HashBasedTable;
    Map<DateTime, List<Map<String, String>>> groupedRows = yourTable.rowMap()
            .entrySet()
            .stream()
            .collect(Collectors.groupingBy(e -> e.getKey().minusMillis(e.getKey().getMillisOfSecond() % 100),
                    Collectors.mapping(Map.Entry::getValue, Collectors.toList())));

为了使用流,我首先调用rowMap 来获取Map&lt;DateTime, Map&lt;C, V&gt;&gt;,它是可流的。流是地图条目。我将它们按截断到最接近 100 毫秒的日期时间分组。我截断的方式:如果时间是 6150 毫秒,e.getKey().getMillisOfSecond() % 100 给我 50 毫秒,我减去它得到 6100 毫秒。因此,从 6100 到 6199 毫秒的所有时间都被组合在一起。在分组中,我使用 下游收集器 从结果中的内部列表的条目中挑选值(Map&lt;C, V&gt;s)。

免责声明:我没有安装 Guava/Google 核心库,所以我没有测试所有内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多