使用java流检查两个日期是否连续

时间:2016-12-08 12:18:23

标签: java date java-8 java-stream

如何检查列表是否有连续的日期。假设我有以下列表

ObjectId(1234)

我尝试在temp varilable中保留上一个日期但是没有用

4 个答案:

答案 0 :(得分:3)

还有一种干净的方法,您还可以使用并行Stream

List<Date> dates = new ArrayList<>();
dates.add(java.sql.Date.valueOf(LocalDate.of(2016, 11, 12)));
dates.add(java.sql.Date.valueOf(LocalDate.of(2016, 12, 15)));
dates.add(java.sql.Date.valueOf(LocalDate.of(2016, 11, 13)));
dates.sort(Comparator.naturalOrder());
boolean hasConsecutiveDates = IntStream.range(1, dates.size())
    .anyMatch(i -> 
         ChronoUnit.DAYS.between(dates.get(i - 1).toLocalDate(), dates.get(i).toLocalDate()) == 1);

答案 1 :(得分:2)

Streams很有用,但我不确定这是一个。这是我的去(没有溪流):

    Collections.sort(dates);
    for (int ix = 0; ix < dates.size() - 1; ix++) {
        Date d1 = dates.get(ix);
        Date d2 = dates.get(ix + 1);
        if (d1.toLocalDate().plusDays(1).equals(d2.toLocalDate())) {
            System.out.println("Consecutive: " + d1 + " and " + d2);
        }
    }

打印:

Consecutive: 2016-11-12 and 2016-11-13

答案 2 :(得分:2)

如果您真的只是想知道您的列表是否包含任何连续日期而您真的想要使用流,那么这可能是一个解决方案:

function test() {
    var regex = new RegExp("^[0-9]{1,11}$");
    var key = String.fromCharCode(!event.charCode ? event.which : event.charCode);
    if (!regex.test(key)) {
        event.preventDefault();
        return false;
    }
}

请注意,流实际上不是为了保持状态并且知道流中的其他元素。这就是为什么我们需要显示的谓词来跟踪前一个元素。

答案 3 :(得分:-1)

为什么不使用从before()继承的after()java.util.date个功能 您可以使用您选择的排序算法,但比较逻辑可以像

boolean isConsecutive = false; 
if(dates.get(1).before(dates.get(2)) || dates.get(1).after(dates.get(2))){
     isConsecutive = true;
}