根据DateTime行对HashBasedTable条目进行分组

时间:2019-03-11 22:18:31

标签: java algorithm datetime grouping hashtable

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

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

参考链接:

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

1 个答案:

答案 0 :(得分: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<DateTime, Map<C, V>>,该流是可流的。流是地图条目。我按日期时间将它们分组,并截断至最接近的100毫秒。我截断的方式:如果时间是6150毫秒,e.getKey().getMillisOfSecond() % 100给我50毫秒,我减去得到6100毫秒。因此,从6100到6199毫秒的所有时间都被分组在一起。在分组中,我使用下游收集器从结果内部列表的条目中选择值(Map<C, V> s。

免责声明:我尚未安装Guava / Google Core库,因此我还没有测试所有内容。