对java list 中的日期进行分段获取 5C

在 java list中,存放了一段范围的日期对象,例如:

 [
'2018-03-01 00:00:00',
'2018-03-02 00:00:00',
'2018-03-03 00:00:00',
'2018-03-04 00:00:00',

'2018-03-10 00:00:00',
'2018-03-11 00:00:00',
'2018-03-12 00:00:00',

'2018-03-14 00:00:00',
'2018-03-15 00:00:00',
'2018-03-16 00:00:00'
]

有一个周期类:

 class Period{
      private Date startDate;
            private Date endDate;
 }

现在想要实现的效果是:获得 list 中每一段连续的日期,并将每一段连续的日期第一个日期作为 start date,最后一个日期作为 end date。比如:

 [
 '2018-03-01 00:00:00',
'2018-03-02 00:00:00',
'2018-03-03 00:00:00',
'2018-03-04 00:00:00'
]
上面这段日期对应的 Period 的实体的start date 为 2018-03-01 00:00:00, end date 为 2018-03-04 00:00:00

不知道用什么算法能解决此问题。

谢谢各位大神帮忙!

3个回答

转成map备用。然后排序(有可以排序的方法),从小到大排序,排序后取第一条,从第一条的基础上加上一天的时间,然后去map里看看有没有,如果有就用放到另一个集合中,并且在加了一天时间的数据上继续加一天然后继续找,如果找不到了,就看看上一条是第几条,然后再这个条数+1找到下一条,然后再加一天。。。。循环下去

这没那么麻烦把,数据很多都是从数据库里拉出来的,先排序,确定时间顺序,就可以了,之后用Timestamp这个java.sql类操作方法,好用点,也可以其他的

List periodList = new ArrayList<>();
Period p = null;
LocalDateTime prev = null;
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
for (String s : datesList) {
if (prev == null) { // starting new period
prev = LocalDateTime.parse(s, fmt);
p = new Period();
p.setStartDate(prev);
} else { // in the middle of a period
LocalDateTime date = LocalDateTime.parse(s, fmt);
// check the difference in days
// convert to LocalDate to ignore hours in the comparison
if (ChronoUnit.DAYS.between(prev.toLocalDate(), date.toLocalDate()) > 1) {
// difference is more than 1 day, period ended
p.setEndDate(prev);
periodList.add(p);

        // start new period
        p = new Period();
        p.setStartDate(date);
        prev = date;
    } else {
        prev = date;
    }
}

}
// check last period
if (p != null && p.getEndDate() == null) {
p.setEndDate(p.getStartDate());
periodList.add(p);
}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问