使用Java8按间隔对localdatetime对象进行分组

fumotvh3  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(487)

我有一个以下格式的列表,我想把这个列表按分钟间隔分组。

List<Item> myObjList = Arrays.asList(
                new Item(LocalDateTime.parse("2020-09-22T00:13:36")), 
                new Item(LocalDateTime.parse("2020-09-22T00:17:20")),
                new Item(LocalDateTime.parse("2020-09-22T01:25:20")),
                new Item(LocalDateTime.parse("2020-09-18T00:17:20")),
                new Item(LocalDateTime.parse("2020-09-19T00:17:20")));

例如,给定10分钟的间隔,列表的前两个对象应该在同一组中,第三个对象应该在不同的组中,等等。
是否可以使用java的8 groupingBy 功能?
我的解决方案是将列表中的每个日期与列表中的所有其他日期进行比较,并将不同的日期x分钟添加到新列表中。这似乎是非常缓慢和'黑客'的解决办法,我想知道是否有一个更稳定的解决方案。

hmmo2u0o

hmmo2u0o1#

可以使用 Collectors#groupingBy 到组 LocalDateTime 对象以10分钟的间隔排列成列表。您必须修改此片段以与您的 Item 类,但逻辑是一样的。

List<LocalDateTime> myObjList = Arrays.asList(
    LocalDateTime.parse("2020-09-22T00:13:36"),
    LocalDateTime.parse("2020-09-22T00:17:20"),
    LocalDateTime.parse("2020-09-22T01:25:20"),
    LocalDateTime.parse("2020-09-18T00:17:20"),
    LocalDateTime.parse("2020-09-19T00:17:20")
);

System.out.println(myObjList.stream().collect(Collectors.groupingBy(time -> {
    // Store the minute-of-hour field.
    int minutes = time.getMinute();

    // Determine how many minutes we are above the nearest 10-minute interval.
    int minutesOver = minutes % 10;

    // Truncate the time to the minute field (zeroing out seconds and nanoseconds),
    // and force the number of minutes to be at a 10-minute interval.
    return time.truncatedTo(ChronoUnit.MINUTES).withMinute(minutes - minutesOver);
})));

输出

{
    2020-09-22T00:10=[2020-09-22T00:13:36, 2020-09-22T00:17:20],
    2020-09-19T00:10=[2020-09-19T00:17:20],
    2020-09-18T00:10=[2020-09-18T00:17:20],
    2020-09-22T01:20=[2020-09-22T01:25:20]
}
sdnqo3pr

sdnqo3pr2#

您没有指定组的键,所以我只使用 (minutes/10)*10 以获取标记到时间上的分钟范围的开始时间,将时间截断为小时。

List<Item> myObjList = Arrays.asList(
        new Item(LocalDateTime.parse("2020-09-22T00:13:36")),
        new Item(LocalDateTime.parse("2020-09-22T00:17:20")),
        new Item(LocalDateTime.parse("2020-09-22T01:25:20")),
        new Item(LocalDateTime.parse("2020-09-18T00:17:20")),
        new Item(LocalDateTime.parse("2020-09-19T00:17:20")));

Map<String, List<Item>> map = myObjList.stream()
        .collect(Collectors.groupingBy(item -> {
            int range =
                    (item.getTime().getMinute() / 10) * 10;
            return item.getTime()
                    .truncatedTo(ChronoUnit.HOURS).plusMinutes(range) +
                    " - " + (range + 9) + ":59";
        }));

map.entrySet().forEach(System.out::println);

印刷品

2020-09-22T00:10 - 19:59=[2020-09-22T00:13:36, 2020-09-22T00:17:20]
2020-09-19T00:10 - 19:59=[2020-09-19T00:17:20]
2020-09-18T00:10 - 19:59=[2020-09-18T00:17:20]
2020-09-22T01:20 - 29:59=[2020-09-22T01:25:20]

这是我上过的课。

class Item {
    LocalDateTime ldt;

    public Item(LocalDateTime ldt) {
        this.ldt = ldt;
    }

    public String toString() {
        return ldt.toString();
    }

    public LocalDateTime getTime() {
        return ldt;
    }
}

相关问题