假设我有一个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.
});
想知道是否有更好/更有效的方式。
答案 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]