データ構造がある場合
Stock
{
String Symbol;
LinkedHashMap<Date,Double> DateForPrice;
}
LinkedHashMap では、リスト全体を走査しなくても特定の日付の株価を取得できることがわかっています。
ただし、特定の日付から始まる DateForPrice の LinkedHashMap を繰り返し処理したい場合、リスト全体を走査せずにそれを行う方法はありますか?
データ構造がある場合
Stock
{
String Symbol;
LinkedHashMap<Date,Double> DateForPrice;
}
LinkedHashMap では、リスト全体を走査しなくても特定の日付の株価を取得できることがわかっています。
ただし、特定の日付から始まる DateForPrice の LinkedHashMap を繰り返し処理したい場合、リスト全体を走査せずにそれを行う方法はありますか?
LinkedHashMap
マップのデータの順序付けられたビューの途中で反復を開始する方法を提供しません。あなたのユースケースが実際にいくつかの後のすべての日付Date d
が必要であり、それらを繰り返すと仮定すると、おそらくマップを として保存する必要がありますTreeMap
。ここでの重要な違いは、LinkedHashMap
の順序が挿入順序であるということです。ここで想定される使用例は、自然なキー順序が必要な場合です。TreeMap
s は、そのようなビューを維持し、マップの内容をマップのキーでソートします。
TreeMap
には、キーに基づいてマップのスライスを作成できるという追加の利点があるため、 を呼び出しtailMap(K k)
て、 の後に発生するすべてのキーを含むマップを返すことができますk
。この場合、tailMap
開始点で呼び出すことができますd
。
例えば:
TreeMap<Date, Double> dateForPrice;
// load up dateForPrice
Date start = // the point to start your iteration
for(Entry<Date, Double> entry : dateForPrice.tailMap(start).entrySet()){
// loop code
}
tailMap
メソッドは を返しますがSortedMap
、これは反復可能ではありません。しかし、のサブインターフェースである returnentrySet
メソッドがあります。Set
Iterable
便利なことに、データを に保存し続けたい場合は、現在のインスタンスで をLinkedHashMap
ロードするだけですTreeMap
(もちろん、パフォーマンスのトレードオフがあります)。
TreeMap<Date, Double> dateSortedDateForPrice = new TreeMap<Date, Double>(dateForPrice);
代わりに使用することをお勧めしますTreeMap
-日付でソートされtailMap
、必要な部分を取得するために使用できます