我的列表中有项目,项目有一个字段,显示项目的创建日期。
我需要根据用户提供的“压缩”对它们进行分组。选项有 Day
、Week
、Month
和 Year
。
如果用户选择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/