2012-03-04 15 views
0

データ構造を再設計する必要がある問題が発生しました。前の日付/文字列(ハッシュ)のマップ

今は、new Info()のメンバーであるdateであるキーを使用して、時間順に多くの情報を保持し、ハッシュマップに保持しています。

hashMap.put(date.toString(), new Info(date, ...))

日付が...

2012-02-15 22:45:00.0
2012-02-15 22:50:00.0
2012-02-15 22:55:00.0
2012-02-15 23:00:00.0
間隔5分である
2012-02-25 12:10:00.0
2012-02-25 12:15:00.0

これまでのところ、キーを取得することにより、情報を得るのは簡単だったと速度が一定の時間が
hashMap.get(date.toString())

これまでのところは良い、私はそこにあるハッシュマップから日付を取得していたときであります。しかし今、情報の時系列順にギャップが存在する可能性があります。下の例では2012-02-15 22:50:00.0が見つからないので、その日付を検索するとNPEを取得します。
その場合、私はより前にに最も近い時刻を見つけなければなりません。

2012-02-15 22:45:00.0
2012-02-15 22:55:00.0
2012-02-15 23:00:00.0 ...

if (hashMap.get(date.toString()) != null) { 
    // found it 
} else { 
    return previousTime(date.toString()) 
} 

私は最も近い以前の日付を見つけるまで、私は、のLinkedHashMapとpreviousTime可能性だけiterate over the collectionを作ることができます。しかし、最悪の場合はO(n)の複雑さです。 そのような種類のタスクのためのより良いデータ構造があるか、LinkedHashMapだけを使用できますか? SortedMapはhereのように?しかし、最初のputはコストがかかり、より多くのメモリが必要になります。

答えて

5

NavigableMapTreeMapなど)のように聞こえるのは、あなたが探しているものです。実際にはStringの日付形式をキーとして使用しないでください... Dateを使用してください。

+0

ありがとうございます。私はそれを使用して 'lowerKey()'が動作し、簡単に前の日付を見つけました – Skyzer

0

しかし、最悪の場合には、このnはどのくらいでしょうか?O(n)の複雑

だろうか私はそれが万人であっても問題ではないと思います。それ以上に問題はあるかもしれませんが、スピードを心配する前にまずメモリが足りなくなるでしょう。尋ねられた日付が見つからない時点から5分ごとに逆方向反復を行うだけです。

+0

nは100kまでです。'尋ねられた日付が見つからないところから5分ごとに逆方向反復を行うだけですが、ハッシュマップで尋ねられた日付が見つからない場合はどうすればいいですか?キー/値はハッシュされており、正確な順序ではありません – Skyzer

+0

はい、しかし、あなたはそれらが5分の範囲にあることを知っています。 'get'がnullを返す間にループします。 – LeleDumbo