私は、キーと値の関連を持つが、ハッシュを使わないでJavaのクラスを探しています。これが私が現在やっていることです:
Hashtable
に追加します。Hashtable.entrySet()
のイテレータを入手してください。Map.Entry
を取得してください。Module
型(カスタムクラス)のオブジェクトを作成します。これに関する問題は、値を元に戻す順序を制御できないため、(順序をハードコーディングしないと)指定された順序で値を表示できないことです。
これにはArrayList
またはVector
を使用しますが、後のコードでは特定のKeyのModule
オブジェクトを取得する必要があります。これはArrayList
またはVector
ではできません。
誰もがこれを行うフリー/オープンソースのJavaクラス、またはいつ追加されたかに基づいてHashtable
から値を取得する方法を知っていますか?
ありがとうございます。
LinkedHashMap
または TreeMap
をお勧めします。 LinkedHashMap
は挿入された順にキーを保持しますが、TreeMap
は要素のComparator
または自然なComparable
の順序でソートされたままです。
要素をソートしておく必要がないので、ほとんどの場合、LinkedHashMap
は高速になります。 Javadocによると、TreeMap
はcontainsKey
、get
、put
、およびremove
に対してO(log n)
のパフォーマンスを持ち、LinkedHashMap
はそれぞれのO(1)
です。
特定のソート順ではなく、予測可能なソート順のみを期待するAPIの場合は、これら2つのクラスが実装するインタフェースを使用することを検討してください。 NavigableMap
または SortedMap
。これにより、特定の実装をAPIにリークさせずに、後でそれらの特定のクラスまたはまったく異なる実装に切り替えることができます。
不変マップがあなたのニーズに合うなら、グーグルによる guava というライブラリがあります( guava questions もご覧ください)。
Guava は ImmutableMap を提供し、信頼できるユーザー指定の反復順序を持ちます。この ImmutableMap はcontainsKeyのためにO(1)の性能を持っています。明らかにputとremoveはサポートされていません。
ImmutableMap オブジェクトは、洗練された静的便利メソッド of() および copyOf() または Builder オブジェクトを使用して構築されます。
LinkedHashMapは、マップのkeySet()、entrySet()、またはvalues()を反復処理したときに、マップに挿入された順序で要素を返します。
Map<String, String> map = new LinkedHashMap<String, String>();
map.put("id", "1");
map.put("name", "rohan");
map.put("age", "26");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " = " + entry.getValue());
}
これにより、要素はマップに配置された順序で印刷されます。
id = 1
name = rohan
age = 26
Map
(高速検索用)とList
(注文用)を管理できますが、LinkedHashMap
が最も単純な場合があります。 SortedMap
を試すこともできます。 TreeMap
、これは任意の順序を指定できます。
あなたは私の Linked Tree Map の実装を試すことができます。
それがオープンソースであるかどうかはわかりませんが、ちょっとグーグルした後、 このArrayListを使用したMapの実装 を見つけました。それは1.5より前のJavaのように思われるので、あなたはそれを一般化したいかもしれません、それは簡単であるべきです。この実装にはO(N)アクセスがありますが、JPanelに何百ものウィジェットを追加しないのであれば、これは問題にならないはずです。
Mapの主な挿入順序にはLinkedHashMapを使用できます。
Java LinkedHashMapクラスに関する重要な点は次のとおりです。
LinkedHashMapはキーに基づく値を含みます3.それは1つのnullキーと複数のnull値を持つことができます。 4.挿入順序を維持する代わりにHashMapと同じ
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
ただし、ユーザー定義オブジェクトまたは基本データ型のキーを使用してマップ内で値を並べ替える場合は、TreeMapを使用します。詳細については、 を参照してください。このリンク