我有一个带有时间戳的元素的 ArrayList。
给定这个数组的一个元素,我想选择在给定元素之前和之后发生特定时间的所有元素。
问题是这个时间戳变成了 60 000 毫秒,然后又从零开始。
因此,如果我想让所有元素发生,比如时间戳为 59 999 的元素之前和之后 1000 毫秒,我不知道该怎么做。
我一直在研究模数运算,但似乎无法使其工作。
我的建议是使用 aSortedSet
而不是 a List
(如果元素不能重复)。
根据元素的时间戳字段创建一个Comparator
(如果这还不是它们的自然顺序),然后使用NavigableSet
排序集的特征来检索参考另一个元素的 、lower
或元素。floor
ceiling
higher
如果您有重复的元素,并且您明确需要使用 a List
,我将首先使用 my对List
with进行排序,然后我将遍历列表以查找低于/高于我的参考时间戳的第一个元素。并使用该方法,我将提取列表前面满足条件的所有元素。Collections.sort
Comparator
List.sublist
两者Date
和Calendar
具有在其之前和之后命名的方法可以帮助您确定给定时间戳是在某个参考时间之前还是之后。如果您想知道之前或之后多少毫秒,只需从另一个时间戳中减去一个时间戳的毫秒数。
尝试这个:
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 + 目标和目标之间)