2016-04-21 16 views
5

günü ve başından sonuna datetime aralıkları birleştirme benim girdi verileriertesi gün İşte

olduğunu
case class DateRange(sd:DateTime,ed:DateTime) 

val sd1 = DateTime.parse("2016-04-04T20:00:00.000Z") 
val ed1 = DateTime.parse("2016-04-04T23:59:59.999Z") 

val sd2 = DateTime.parse("2016-04-05T00:00:00.000Z") 
val ed2 = DateTime.parse("2016-04-05T05:00:00.000Z") 

val sd3 = DateTime.parse("2016-04-05T20:00:00.000Z") 
val ed3 = DateTime.parse("2016-04-05T23:59:59.999Z") 

val sd4 = DateTime.parse("2016-04-06T00:00:00.000Z") 
val ed4 = DateTime.parse("2016-04-06T05:00:00.000Z") 

val sd5 = DateTime.parse("2016-04-07T10:00:00.000Z") 
val ed5 = DateTime.parse("2016-04-07T15:00:00.000Z") 

val drList = List(DateRange(sd1,ed1),DateRange(sd2,ed2),DateRange(sd3,ed3),DateRange(sd4,ed4),DateRange(sd5,ed5)) 

aradığım İstenen çıkış İşte

val res = List(DateRange(sd1,ed2),DateRange(sd3,ed4),DateRange(sd5,ed5)) 

ed1, ed3 olduğu Günün sonu ve sd1, sd3, ilgili tarihler için günün başlangıcıdır. Yukarıda istenen çıktıda görebildiğimiz gibi bu tür aralıkları birleştirmek istiyorum.

Ben birleştirme sonucunu nasıl elde bu

val result = drList.partition(x => x.sd.isEqual(x.sd.withTimeAtStartOfDay()) || x.ed.isEqual(x.ed.withTime(LocalTime.parse("23:59:59"))))) 

Ama böyle bölünmesini çalıştı. Şimdiden teşekkürler.

cevap

2

Sen sonuç almak için zip kullanabilirsiniz:

İşte
val res = if(drList.size < 2) 
      { 
       drList 
      } 
      else 
      { 
       drList zip drList.drop(1) map { 
       case (prevRes, nexRes) => 
       if (prevRes.ed.plusMillis(1) == nexRes.sd) prevRes.copy(ed = nexRes.ed) 
       else DateRange(sd1, sd1) 
      } 
      res.filter(x => x.sd != x.ed) 
      } 

sd1 başka kısmında sahip ve en sonunda onu filtreleyerek için herhangi datetime olduğunu.