このタイプのリスト/マップのデータ構造はありますか?


22

おそらく私が欲しいものには名前がありますが、私はそれを知りません。LinkedHashMapJavaのa に似たものが必要ですが、指定されたキーに値がない場合に「前の」値を返します。

つまり、整数キー(私の場合は時間単位)によって格納されたオブジェクトのリストがあります。

; key->value
10->A
15->B
20->C

したがって、キー0〜9の値を照会すると、が返されnullます。特別な部分は、何か10 <= i <= 14を照会した場合、Aを返します。または、i> = 20の場合、Cを返します。

これにデータ構造はありますか?


実装されているものがあるかどうかはわかりませんが、おそらく既存のものを拡張してこれを行うことができます。書き換えなしでパフォーマンスの目標を達成するかどうかはわかりません
Rig

1
すばらしい質問には+1。下位3桁の担当者を持つほとんどの人は、「私の宿題をしてください」タイプの質問をします。ここではそうではありません。
Tulainsコルドバ

回答:


33

NavigableMapを探しています。これはSortedMapのサブタイプであり、ソートされるマップの性質に加えていくつかの機能も利用できます。Navigableマップは「SortedMapインターフェースに取って代わることを意図している」ことに注意してください。(Java SE 6 Collections Frameworkの機能強化)。現在実装しているものはすべて実装さSortedMapれてNavigableMapおり、これは真実のままです。

特に、floorKey(K key)「指定されたキー以下の最大のキーを返すメソッド、またはそのようなキーがない場合はnullを返します。

これは、マップの特定のキーまたはサブマップを取得できる多くのメソッドの1つにすぎません。

  • 天井/床(パラメーターよりも高い/低いエントリ)
  • 降順でのキーまたはマップへのアクセス
  • ヘッド/テール(特定のキーよりも小さい/大きいエントリ)
  • 高い/低い(パラメータよりも高いまたは低い次のキー)
  • サブマップ(2つのキーが与えられ、2つのキーの間にあるマップを返します)

Javaには、NavigableMapの2つの実装、TreeMapConcurrentSkipListMapがあります。

スキップリストのアイデア/実装を見ると、このような構造とクエリで本当にうまく機能する理由がわかります。


1+素晴らしい答え。このような特定のマップがJava APIに存在するとは考えていませんでした。
Tulainsコルドバ

@ user61852私のお気に入りのデータ型はスキップリストです。1.6で実装されているのを見たとき、私はそれが提供するものすべてを調べて、それが持っていたインターフェースに気づきました。

それが、Javaがあなたが見つけることができる最高に設計された言語の1つであると私に確信させるようなものです。
Tulainsコルドバ

1
これはOPの問題に対処しているように見えますがLinkedHashMap、彼が言及したようには動作しないことに注意してください。のような挿入時間によってTreeMapConcurrentSkipListMap順序付けもされませんLinkedHashMap。むしろ、Comparatorを実装する場合、キーまたはキーの自然順序付けによって順序付けられますComparable
MikeFHay

1
非常に良い点。フロア操作は私が探していたもので、簡単に追加できるコンパレータです。そして、私の場合は、車輪を再発明する代わりにコンパレータを実装する方がはるかにうまくいきます。ありがとう。
ニック

1

探しているのは、順序付けられた操作をサポートするシンボルテーブルです。そして、あなたの場合、それはフロアオペレーションです。

シンボルテーブルのハッシュ実装は最速ですが、これらの順序付けされた操作は提供しません。

ただし、シンボルテーブルのツリー実装は行います。Javaでの例はTreeMapクラスです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.