3

Javaでは、時間範囲をキーとして保存する方法はありますHashmapか? 私は1つ持っておりHashMap、時間の範囲を保存しています。例:
0 ~ 50 の範囲をキーとして入力し、そのキーに対して他のオブジェクトを値として保存します。ここで 10 と言うと、そのキーに対応する値を取得できるはずです。
0 ~ 50 の任意の値がそのオブジェクトを取得する必要があります。

Map map = new HashMap();
map.put(0-50,"some object")
map.put(51-100,"some other object")

今私が言うとき、map.get(10)それは「何らかのオブジェクト」を取得できるはずです。これを行う方法を提案してください。

4

4 に答える 4

4

マップは使用せず、代わりにR-Treeを使用します。R ツリーは、空間データにインデックスを付けるために作成されるツリー構造です。長方形を格納します。ポイント(座標)が他のジオメトリ内にあるかどうかをテストするためによく使用されます。これらのジオメトリは四角形で近似され、ツリーに格納されます。

長方形 (またはそれに関する情報) を保存するには、左下隅と右上隅の座標のみを保存する必要があります。あなたの場合、これは期間の下限と上限になります。座標のすべての y 値が 0 であるかのように考えることができます。次に、時間値でツリーをクエリできます。

そしてもちろん、各リーフ(タイムスパン/長方形)で値を保存します

Google で簡単に検索すると、r-tree javaいくつかの有望な結果が得られました。独自の R ツリーを実装するのは簡単ではありませんが、挿入/削除時にツリーを再配置するという原則を理解していれば、それほど複雑ではありません。1 次元の場合は、さらに単純になる可能性があります。

于 2012-05-24T05:56:34.653 に答える
2

前提条件: 重複しない範囲。

範囲の開始点と終了点を TreeSet に格納できます。開始点と終了点は、それぞれ開始時刻と終了時刻、およびオブジェクト (への参照) を格納するオブジェクトです。オブジェクトが時間順に並べられるように、比較関数を定義する必要があります。

TreeSetのfloor()またはceiling()関数を使用してオブジェクトを取得できます。

端点であっても、範囲が重ならないように注意してください (例: 3-6 と 6-10)。

これにより、範囲の挿入とクエリの複雑さがログに記録されます。

于 2012-05-24T05:59:26.027 に答える
1

これが重複していない等距離の範囲、つまり範囲が 50 で分割されている場合、次のように最大数のハッシュを維持することでこの問題を解決できます。

50 - 「あるオブジェクト」、100 - 「他のオブジェクト」など。

入力が 10 の場合、50 の即値倍数を導出し、そのキーの値を取得します。

すぐに50の倍数に到達できます

  1. 入力でモードを取る入力90、つまり90%50 = 40の場合
  2. ステップ 1 の結果の diff を 50 で計算します。つまり、50 - 40 = 10 です。
  3. ステップ 2 の結果を入力に追加、つまり 90 + 10 = 100
于 2012-05-24T05:56:23.827 に答える
0

範囲を単一のキーにマップする必要があります。たとえば、min と max の間の任意の値に対してキー 1 を返す rangemanager オブジェクトのようなものを使用しないでください。または、for ループを使用して 1 から 50 までのすべてのキーの値として someobject を配置することもできますが、これは私の目には無駄です。

于 2012-05-24T05:42:08.793 に答える