タイムスタンプを持つ要素のArrayListがあります。ストリームのシーケンスを選択する
この配列の要素があれば、与えられた要素の前後の特定の時間を含むすべての要素を選択したいと思います。
問題は、このタイムスタンプが60,000ミリ秒に達した後、再びゼロから開始することです。
タイムスタンプ59 999の要素の前後に、すべての要素が発生するようにするには、1000ミリ秒と言うと、これを行う方法がわかりません。
モジュラス演算を見てきましたが、動作させることができないようです。
タイムスタンプを持つ要素のArrayListがあります。ストリームのシーケンスを選択する
この配列の要素があれば、与えられた要素の前後の特定の時間を含むすべての要素を選択したいと思います。
問題は、このタイムスタンプが60,000ミリ秒に達した後、再びゼロから開始することです。
タイムスタンプ59 999の要素の前後に、すべての要素が発生するようにするには、1000ミリ秒と言うと、これを行う方法がわかりません。
モジュラス演算を見てきましたが、動作させることができないようです。
これを試してみてください:
は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 +ターゲットとターゲットの間になります)
List
(要素を繰り返せない場合)の代わりにSortedSet
を使用します。
作成Comparator
あなたの要素のタイムスタンプフィールドに基づいて、その後、別のを参照してlower
、floor
、ceiling
またはhigher
の要素を取得するために、ソートセットのNavigableSet
機能を使用します(これは、すでに彼らの自然な順序ではない場合)素子。
あなたが繰り返し要素を持っている、とあなたはdefinetively List
を使用する必要がある場合は、私が最初に私Comparator
と私は私の参照のタイムスタンプよりも高い/低い最初の要素を探してリストを反復処理するでしょう使用してCollections.sort
でList
をソートします。 List.sublist
という方法を使用して、条件を満たすすべての要素をリストの前に抽出します。
Date
とCalendar
には、特定のタイムスタンプがリフレクション時間の前後であるかどうかを判断するのに役立つ前後のメソッドがあります。前後のミリ秒数を知りたければ、タイムスタンプのミリ秒数を他のタイムスタンプから減算するだけです。
あなたがそうしようとしている何遠い?それが失敗した最も簡単なテストケースは何ですか? –
リスト内の要素のタイプは何ですか?どのように「起こった」時間を決定しますか? –
要素にはタイムスタンプ(0〜60000の整数)があり、それらはArrayListに慢性的に追加されます。 – IanS