按天数拆分java.util.Date集合 [英] Split java.util.Date collection by Days
问题描述
请你帮我一下。我无法弄清楚算法。
Could you help me, please. I can't figure out the algorithm.
我有一组日期排序的集合,例如ArrayList这样的:
I have a sorted collection of Dates, for example ArrayList like this:
Wed Jan 22 00:00:00 MSK 2014
Wed Jan 22 00:30:00 MSK 2014
Wed Jan 23 01:00:00 MSK 2014
Wed Jan 23 01:30:00 MSK 2014
Wed Jan 23 02:00:00 MSK 2014
Wed Jan 24 02:30:00 MSK 2014
Wed Jan 24 03:00:00 MSK 2014
Wed Jan 24 03:30:00 MSK 2014
Wed Jan 24 04:00:00 MSK 2014
Wed Jan 28 04:30:00 MSK 2014
Wed Jan 28 05:00:00 MSK 2014
我需要该列表的另一个版本,分组(从00:00:00到23:59:59),因此它可以是列表数组,例如 List< List< Date>>
。在示例之后,它应该是大小为4的列表,第二个对象==
I need another version of this list, grouped by day (from 00:00:00 till 23:59:59), so it could be an array of lists, like List<List<Date>>
. Following the example it should be the list with size 4, with second Object ==
List<Date> {Wed Jan 23 01:00:00 MSK 2014;
Wed Jan 23 01:30:00 MSK 2014;
Wed Jan 23 02:00:00 MSK 2014; }
似乎很简单。但我找不到解决问题的简便方法。
Seems like an easy task. but I can't find convenient way to solve it. Thanks in advance.
更新
根据TEXHIK的回答,宽度为JDK 7,可以这样完成:
UPDATE According to TEXHIK's answer, width JDK 7 it could be done like this:
public List<List<Date>> split(List<Date> value) {
List<List<Date>> result = new ArrayList<>();
int day = value.iterator().next().getDate();
List<Date> newListEntry = new ArrayList<>();
for (Date date : value) {
if (date.getDate() == day) {
newListEntry.add(date);
}
else {
day = date.getDate();
result.add(newListEntry);
newListEntry = new ArrayList<>();
newListEntry.add(date);
}
}
result.add(newListEntry);//because the last sublist was not added
return result;
}
没关系,除非已弃用java.util.Date方法。会很高兴看到使用Java 8或Joda Time的答案。
It's OK, unless it's deprecated methods of java.util.Date. Will be glad to see the answers using Java 8 or Joda Time.
推荐答案
如果您对UTC的日子感到满意,生活就会变得愉快更简单:
If you're happy with UTC days, life becomes simpler:
- 由于unix纪元的毫秒数开始于一天的边界,因此您可以除以
- 每天长达24小时,这在很多情况下都很方便(例如,如果您要对数据进行分析)
在这种情况下,您可以使用类似以下的命令:
In that case, you can just use something like:
long millisPerDay = TimeUnit.DAYS.toMillis(1);
Map<Long, List<Date>> datesByDay = new HashMap<>();
for (Date date : dates) {
long day = date.getTime() / millisPerDay;
List<Dates> dayDates = datesByDay.get(day);
if (dayDates == null) {
dayDates = new ArrayList<>();
datesByDay.put(day, dayDates);
}
dayDates.add(date);
}
当然,多幅地图
,例如从番石榴中,将使此过程变得更简单:
Of course, a Multimap
, e.g. from Guava, will make this simpler:
long millisPerDay = TimeUnit.DAYS.toMillis(1);
Multimap<Long, Date> datesByDay = ArrayListMultimap.create();
for (Date date : dates) {
long day = date.getTime() / millisPerDay;
datesByDay.put(day, date);
}
这篇关于按天数拆分java.util.Date集合的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!