2016-12-08 54 views
0

如何檢查是連續的,如果名單已經連續dates.Suppose我有列表類似下面檢查兩個日期使用Java流

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))); 

我試過拿着臨時varilable以前的日期,但沒有工作

+0

所以,你想按日期排序列表? –

+1

你爲什麼要使用流? –

+1

「我試着在臨時變量中保留上一個日期,但那沒有用」請顯示你的嘗試。 –

回答

2

如果你真的只是想知道,如果你的列表中包含任何連續的日期,你真的想使用流,這可能是解決方案:

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))); 

boolean hasConsecutiveDates 
    = dates.stream() 
      .sorted() 
      .anyMatch(new Predicate<java.sql.Date>() { 
      private java.sql.Date previous; 

      @Override 
      public boolean test(java.sql.Date date) { 
       boolean consecutiveByDay = false; 
       if (previous != null) { 
       consecutiveByDay = 
        ChronoUnit.DAYS.between(previous.toLocalDate(), date.toLocalDate()) == 1; 
       } 

       previous = date; 
       return consecutiveByDay; 
      } 
      }); 

請注意,流實際上是沒有作出保持狀態,並瞭解其他元素的流。這就是爲什麼我們需要顯示的謂詞來跟蹤前一個元素。

+0

我確信它可能會與溪流,並確信我不想打擾。你做到了。布拉沃。 –

+1

並行化能力如何? –

+3

不是映射到'Boolean',要追加'.anyMatch(e - > e)',你可以首先使用'anyMatch',實現'Predicate '而不是'Function '。無論哪種情況,Streams都強烈建議使用有狀態函數。唯一干淨的解決方案是收集器。 – Holger

-1

你爲什麼不使用來自java.util.date 繼承before()after()功能,您可以使用排序您選擇的算法,但比較邏輯可以像

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

我希望通過使用流java 8 – pppavan

+1

' before()'會告訴你,11月1日是在12月25日之前,而不是它們是否連續。類似於'after()',只有其他方法。 –

2

溪流很適合很多用途,但我不確定這是一個。這是我去(不流):

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 
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);