java - 按日期分组项目

标签 java java-8 java-stream java-time

我的列表中有项目,项目有一个字段,显示项目的创建日期。

enter image description here

我需要根据用户提供的“压缩”对它们进行分组。选项有 DayWeekMonthYear

如果用户选择day 压缩,我需要将我的项目分组,这样在同一天创建的项目将被分组。在我上面的例子中,只有项目 1 和项目 2 是在同一天创建的。其他人也是组,但他们只有一个项目,因为在他们那一天,只创建了一个项目。

{{item1, item2}, {item3}, {item4}, {item5}, {item6}, {item7}}

如果用户选择:

{{item1, item2, item3, item4}, {item5}, {item6}, {item7}}

如果用户选择月份:

{{item1, item2, item3, item4, item5}, {item6}, {item7}}

如果用户选择year:

{{item1, item2, item3, item4, item5, item6}, {item7}}

创建组后,项目的日期并不重要。我的意思是 key 可以是任何东西,只要创建了组即可。

在使用Map的情况下,我认为键如下:

day = 一年中的第几天
week = 一年中的第几周
月份 = 月份
= 年

这个问题的最佳解决方案是什么?我什至无法启动它,我想不出除了迭代之外的解决方案。

最佳答案

我会在分类器上使用 Collectors.groupingBy 和调整后的 LocalDate,这样具有相似日期的项目(根据给定的压缩由用户)组合在一起。

为此,首先创建以下 Map:

static final Map<String, TemporalAdjuster> ADJUSTERS = new HashMap<>();

ADJUSTERS.put("day", TemporalAdjusters.ofDateAdjuster(d -> d)); // identity
ADJUSTERS.put("week", TemporalAdjusters.previousOrSame(DayOfWeek.of(1)));
ADJUSTERS.put("month", TemporalAdjusters.firstDayOfMonth());
ADJUSTERS.put("year", TemporalAdjusters.firstDayOfYear());

注意:对于“day”,使用了一个TemporalAdjuster,它让日期保持不变。

接下来,使用用户提供的压缩来动态选择如何对您的项目列表进行分组:

Map<LocalDate, List<Item>> result = list.stream()
    .collect(Collectors.groupingBy(item -> item.getCreationDate()
            .with(ADJUSTERS.get(compression))));

LocalDate 通过 LocalDate.with(TemporalAdjuster) 调整方法。

关于java - 按日期分组项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45060886/

相关文章:

Java Streams 将列表拆分为子列表,单独处理这些列表并将它们合并回来

java - BigDecimal 汇总统计

java - 是否可以只下载页面的 HEAD 标签?

java - 所有的 Java 小程序都去哪儿了?

javascript - BIRT 在脚本中将 HTML 文本转换为纯文本

java - Custom Comparator.comparing only by field in Java 8

java - 连接并行流

java - Android - 一键更改到创建的下一个屏幕。下一件怎么办?

java - jacoco maven 插件可以从文件中读取排除项吗?

java - 根据具有不同值的另一个数组对数组进行排序