3

期間(開始、終了)によって定義され、複雑な計算結果を保持するこの期間のカウンターとなるデータ構造のセットを格納する必要があります。データ構造の簡略化された定義は次のとおりです。

public class CounterBag {
    private Period period;   // collection key
    private Counter counter;
    // accessors
    // ...
}

これPeriodは次のように単純です。

public class Period {
    public DateTime start;
    public DateTime end;
    // accessors
    // ...
}

CounterBagによって定義されたオブジェクトを保持するコレクションが必要Periodsです。コレクションは、による効率的なルックアップ(ここにキャッチがあります!)を提供する必要がありますlong timeInMillis。したがって、上書きしHashMapたくないので、実際にはオプションではありません(両方が必要です)。コレクションは(終了日で)並べ替える必要があります。sは柔軟な期間であり、ルックアップを実行する部分にはわかりません。equalshashcodeCounterBagPeriodPeriod

Java標準APIまたはいくつかのオープンソースライブラリに、それを解決するのに役立つすぐに使えるコレクションがあるのだろうか?日付による効率的なルックアップの実装を可能にする、ある種のソートされたセットまたはソートされたマップ。日付によるルックアップは、日付が範囲内にあるaCounterBagを返しPeriodます。

あなたの提案に感謝します。

4

5 に答える 5

0

ピリオドが重ならない場合は、を使用することをお勧めしTreeMap<Period, CounterBag>ます。ミリ秒単位で指定された時間を取得する必要がある場合CounterBagは、次を使用できます。

// Initialize map
Map<Period, CounterBag> map = new TreeMap<Period, CounterBag>();
map.put(...);

// Prepare "query"
long timeInMillis = ...;
Period fakePeriod = new Period(new Date(timeInMillis), new Date(timeInMillis));

// Get bag for given time.
CounterBag bag = map.get(fakePeriod);

この場合、Period実装するComparableか、独自のコンパレータをツリーに渡す必要があります。2つの期間の比較では、重複する場合は0を返す必要があります(この場合、実際の期間に、開始時間と終了時間が等しい偽の期間が含まれている場合timeInMillis)。

于 2012-05-13T14:02:49.063 に答える
0

TreeMapをSortedコレクションとして使用できます(これによりルックアップが効率的になります)

月経に一定の間隔がある場合(これは最も単純な形式です)、そのようなコレクションは必要ありません。間隔ごとにカウンターを作成できます。例:int[]

于 2012-05-13T13:42:01.283 に答える
0

@Peter Lawreyの回答を拡張し、CounterBagのカスタムコンパレータでTreeMapを使用します。

このコンパレータは、範囲内にあるCounterBagが返されることを保証します。

ルックアップの効率は、コンパレータの実装によって異なります。

于 2012-05-13T13:59:54.620 に答える
0

私は提案しTreeMap<Long, CounterBag>ます。NavigableMapインターフェイスを使用してアクセスします。

NavigableMap<Long, CounterBag> map = new TreeMap<Long, CounterBag>();
map.put(bag.period.end.toMillis(), bag); // Get end DateTime as a Long


long lookupLong = 10000L; // or whatever

/*
 * Retrieves the greatest Bag whose Period's end is
 * less than or equal to the Long
 */
CounterBag newBag = map.floorEntry(lookupLong).getValue();
于 2012-05-13T15:29:45.710 に答える
0

十分な期間が与えられれば、潜在的に任意の開始時間が適格になる可能性があるため、特に重複が許可されている場合(複数の結果が得られる場合)、開始時間でソートされた単純なArrayListが効率的なアプローチになります。開始時刻>要求されたtimeInMillisである最初のレコードまでのみ反復します。

于 2012-05-13T16:31:24.930 に答える