我有一个带有时间戳的元素的ArrayList。
给定这个数组的元素,我想选择在给定元素之前和之后徘徊一定时间的所有元素。
问题是这个时间戳达到60 000 milisec然后从零开始。
所以,如果我想让所有元素发生,比如说时间戳为59 999的元素之前和之后的1000 milisec,我不知道该怎么做。
我一直在研究模数运算,但我似乎无法使其发挥作用。
答案 0 :(得分:0)
我的建议是使用SortedSet
代替List
(如果元素不能重复)。
根据元素的时间戳字段创建Comparator
(如果这不是它们的自然顺序),然后使用排序集的NavigableSet
功能来检索lower
,floor
,ceiling
或higher
元素参考另一个元素。
如果您有重复的元素,并且您需要使用List
,我首先会使用List
对Collections.sort
Comparator
进行排序,我会迭代在列表中寻找低于/高于我的参考时间戳的第一个元素。使用方法List.sublist
,我将提取符合条件的列表前面的所有元素。
Date
和Calendar
都有前后命名的方法可以帮助您确定给定的时间戳是在某个参考时间之前还是之后。如果你想知道你之前或之后多少毫秒,你只需从另一个时间戳中减去一个时间戳的毫秒数。
答案 1 :(得分:0)
试试这个:
List<Integer> timestamps;
int target = 59999; // matches are from 58999 to 999 (wrapped around)
for (Integer timestamp : timestamps) {
if (Math.abs(timestamp + 60000 - target) <= 1000 || Math.abs(timestamp - target) <= 1000) {
// this timestamp is a match
}
}
此代码只需检查两次 - 每次一次用于翻转和非翻转。
我已经测试了它并且它也适用于“滚动” - 即当目标小于1000时(因此范围将介于59000 +目标和目标之间)