根据时间差异从集合创建集合

时间:2017-05-27 18:38:21

标签: java date collections

假设我有一个Logs的集合,我想根据日期范围创建不同的集合。例如,如果集合有4个项目。

logs[0].dateCreated = 12:00
logs[1].dateCreated = 12:10
logs[2].dateCreated = 12:50
logs[3].dateCreated = 12:60

我想要一个Set中的0-1项,然后在一个Set中放2-3。标准在彼此的30秒内。我的伪代码理念是:

logs.forEach(item -> { 
  // if on first item, just put it in the first collection
  // store this item as the initial time diff
  // if the next item is within 30 seconds, add to same colletion
  // otherwise, add  item to new collection, this item now becomes the time diff
  // rinse and repeat.
});

想知道是否有更好/更有效的方式。

1 个答案:

答案 0 :(得分:0)

首先,如果您真的只跟踪一个时间,那么请使用LocalTime类来获取数组/集合中的对象。

List<LocalTime> logTimes = new ArrayList<>();
logTimes.add( LocalTime.parse( "12:00" ) ) ;
logTimes.add( LocalTime.parse( "12:10" ) ) ;
logTimes.add( LocalTime.parse( "12:50" ) ) ;
logTimes.add( LocalTime.parse( "13:00" ) ) ;  // No such thing as `12:60`.

你似乎把时间与时间混在一起。如果你想要开始时间,然后是超过半分钟的跨度集合,你应该分别跟踪它们。

你的意思是30分钟而不是30秒?

你真的是指Set而不是List吗? Set消除了重复。如果确实如此,只需在此示例代码中将List替换为Set,将new HashSet替换为new ArrayList

LocalTime start = logTimes.get( 0 ); // Get first item. Uses annoying zero-based index counting.
LocalTime previous = start ;
List<LocalTime> sublistTimes = logTimes.subList( 1 , logTimes.size() ) ;  // A view over the original list, not actually separate.
List<Duration> spans = new ArrayList<>();
Duration limit = Duration.ofMinutes( 30 );
for( LocalTime t : sublistTimes ) {
    Duration d = Duration.between( previous , t ) ;
    if( d.compareTo( limit ) > 0 ) {  // If over the limit…
        System.out.println( "From " + previous + " to " + t + " = " + d ) ;
        spans.add( d ) ; // Remember the delta from previous time-of-day to this time-of-day because it is over our threshold.
    }
    previous = t ;  // Setup the next loop.
}

String results = "Start: " + start + " Deltas over limit of " + limit + ": " + spans ;
System.out.println( results ) ;

请参阅此code run live at IdeOne.com

  

从12:10到12:50 = PT40M

     

开始时间:12:00

     

超过PT30M的限制:[PT40M]