2012-05-02 3 views
1

タイムスタンプを持つ要素のArrayListがあります。ストリームのシーケンスを選択する

この配列の要素があれば、与えられた要素の前後の特定の時間を含むすべての要素を選択したいと思います。

問題は、このタイムスタンプが60,000ミリ秒に達した後、再びゼロから開始することです。

タイムスタンプ59 999の要素の前後に、すべての要素が発生するようにするには、1000ミリ秒と言うと、これを行う方法がわかりません。

モジュラス演算を見てきましたが、動作させることができないようです。

+4

あなたがそうしようとしている何遠い?それが失敗した最も簡単なテストケースは何ですか? –

+0

リスト内の要素のタイプは何ですか?どのように「起こった」時間を決定しますか? –

+0

要素にはタイムスタンプ(0〜60000の整数)があり、それらはArrayListに慢性的に追加されます。 – IanS

答えて

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 +ターゲットとターゲットの間になります)

0

List(要素を繰り返せない場合)の代わりにSortedSetを使用します。

作成Comparatorあなたの要素のタイムスタンプフィールドに基づいて、その後、別のを参照してlowerfloorceilingまたはhigherの要素を取得するために、ソートセットのNavigableSet機能を使用します(これは、すでに彼らの自然な順序ではない場合)素子。

あなたが繰り返し要素を持っている、とあなたはdefinetively Listを使用する必要がある場合は、私が最初に私Comparatorと私は私の参照のタイムスタンプよりも高い/低い最初の要素を探してリストを反復処理するでしょう使用してCollections.sortListをソートします。 List.sublistという方法を使用して、条件を満たすすべての要素をリストの前に抽出します。

DateCalendarには、特定のタイムスタンプがリフレクション時間の前後であるかどうかを判断するのに役立つ前後のメソッドがあります。前後のミリ秒数を知りたければ、タイムスタンプのミリ秒数を他のタイムスタンプから減算するだけです。

関連する問題