按天数拆分java.util.Date集合 [英] Split java.util.Date collection by Days

查看:210
本文介绍了按天数拆分java.util.Date集合的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请你帮我一下。我无法弄清楚算法。

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆