gpt4 book ai didi

java - 使用 Java Stream 计算项目列表中日期的出现次数

转载 作者:搜寻专家 更新时间:2023-10-30 21:27:15 25 4
gpt4 key购买 nike

我有一个带有 (java.util.)Date 属性的项目列表,我想创建一个 DataSeriesItem 每天 从最早的日期开始到现在。它适用于带有时间线的图表系列。

该 DataSeriesItem 的创建将如下所示:
DataSeriesItem seriesItem = new DataSeriesItem(Date, occurrenceCount);
其中 occurrenceCount 是其 Date 属性与当天匹配的项目的计数。第一个参数也可以是 java.time.Instant

类型

我已经设法找到了一种可行的方法,但我确信我的方法非常很糟糕,并且可以通过一个流或两个流来完成。但是,我是流的初学者,凭我的知识无法做到。

流可以实现吗?它大概会是什么样子?
我并不是要求您重新实际执行我的整个实现,而只是指出您将使用的正确流函数和映射,并为奖励积分提供一个示例。

这是我丑陋的解决方案:

List<?> items = myItems;
Collection<Date> foundDates = new HashSet<>();

for (Object item : items) {
foundDates.add((Date)getPropertyValueFromItem(item, configurator.getDateProperty()));
}

//====== This is the part I am asking about ======//

Map<Instant, Integer> foundInstants = new HashMap<>();
foundDates.stream().sorted(Date::compareTo).forEach(date -> {
Calendar c = Calendar.getInstance();
c.clear(); // clear nanoseconds, or else equals won't work!
c.set(date.getYear()+1900, date.getMonth(), date.getDate(), 0, 0, 0);
if(!foundInstants.containsKey(c.toInstant())){
foundInstants.put(c.toInstant(), 1);
} else {
// increment count of that entry
Integer value = foundInstants.get(c.toInstant());
foundInstants.remove(c.toInstant());
foundInstants.put(c.toInstant(), ++value);
}
});

//====== Leaving this code here for context ======//
// Could this maybe simplyfied too by using streams ?

// find oldest date
Date dateIndex = foundDates.stream().min(Date::compareTo).get();
Date now = new Date();

// starting from oldest date, add a seriesItem for each day until now
// if dateOccurrences contains the current/iterated date, use it's value, else 0
while(dateIndex.before(now)){
Calendar c = Calendar.getInstance();
c.clear();// clear nanoseconds, or else equals won't work!
c.set(dateIndex.getYear()+1900, dateIndex.getMonth(), dateIndex.getDate(), 0, 0, 0);

if(foundInstants.containsKey(c.toInstant())){
ExtendedDataSeriesItem seriesItem = new ExtendedDataSeriesItem(c.toInstant(), foundInstants.get(c.toInstant()));
seriesItem.setSeriesType("singleDataPoint");
series.add(seriesItem);
} else {
ExtendedDataSeriesItem seriesItem = new ExtendedDataSeriesItem(c.toInstant(), 0);
seriesItem.setSeriesType("singleDataPoint");
series.add(seriesItem);
}
c.add(Calendar.DATE, 1); // adding a day is complicated. Calendar gets it right. Date does not. This is why I don't use Date here
dateIndex = c.getTime();
}

最佳答案

您可以使用groupingBy(),然后使用下游收集器counting()

Map<Date, Long> occurrances = dateList.stream().collect(
groupingBy(d -> yourTransformation(d), counting()));

从该 map 创建您的 DataSeriesItem 对象应该很容易。

关于java - 使用 Java Stream 计算项目列表中日期的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54147806/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com