Java 基于DateTime行对HashBasedTable项进行分组

Java 基于DateTime行对HashBasedTable项进行分组,java,algorithm,datetime,grouping,hashtable,Java,Algorithm,Datetime,Grouping,Hashtable,我有一个HashBasedTable(com.google.common.collect.HashBasedTable),格式如下:TableDateTime来自org.joda.time.DateTime 我想根据特定的时间间隔对条目进行分组。例如,如果条目A和B彼此之间的距离在100ms以内,我想将它们分组在同一行上。我可以选择在处理过程中插入和插入后执行此操作。我应该如何以最有效的方式完成这项工作 参考链接: 下面是一个例子 Table<DateTime, String,

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

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

参考链接:

下面是一个例子

    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())));
Table yourTable=//您的HashBasedTable;
Map groupedRows=yourTable.rowMap()
.entrySet()
.stream()
.collect(收集器.groupingBy(e->e.getKey().minusMillis)(e.getKey().getMillisOfSecond()%100),
Collectors.mapping(Map.Entry::getValue,Collectors.toList());
为了使用流,我首先调用
rowMap
,以获得可流化的
Map
。该流包含多个映射条目。我将它们按日期时间截短到最接近100毫秒的时间进行分组。我截短的方式:如果时间是6150毫秒,
e.getKey().getmillisosofsecond()%100
给我50毫秒,我减去它得到6100毫秒。因此,从6100到6199毫秒的所有时间都被分组在一起。在分组中,我使用下游收集器从结果中内部列表的条目中选择值(映射)


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

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