タイムスタンプ付きの要素のArrayListがあります。
この配列の要素が与えられた場合、その与えられた要素の前後の特定の時間に発生するすべての要素を選択したいと思います。
問題は、このタイムスタンプが60 000ミリ秒になり、ゼロから再開することです。
したがって、すべての要素を発生させたい場合、たとえばタイムスタンプ59 999の要素の前後に1000ミリ秒とすると、これを行う方法がわかりません。
モジュラス演算を見てきましたが、うまくいかないようです。
私の提案は、 (要素を繰り返すことができない場合)のSortedSet
代わりに使用することです。List
要素のタイムスタンプフィールドに基づいて作成しComparator
(これがまだ自然な順序でない場合)、並べ替えられたセットの機能を使用して、別の要素を参照して、、、または要素を取得NavigableSet
します。lower
floor
ceiling
higher
要素を繰り返しており、明確にを使用する必要がある場合はList
、最初にmyList
を使用して並べ替え、リストを繰り返し処理して、参照タイムスタンプよりも低い/高い最初の要素を探します。そして、この方法を使用して、基準を満たすリストの前にあるすべての要素を抽出します。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
}
}
このコードは、ロールオーバーと非ロールオーバーをそれぞれ1回ずつ、2回チェックするだけです。
私はそれをテストしました、そしてそれは「ロールアンダー」でも機能します-つまり、ターゲットが1000未満の場合(したがって、範囲は59000 +ターゲットとターゲットの間になります)