web-dev-qa-db-ja.com

Mapを実装し、挿入順序を守るJavaクラス?

私は、キーと値の関連を持つが、ハッシュを使わないでJavaのクラスを探しています。これが私が現在やっていることです:

  1. 値をHashtableに追加します。
  2. Hashtable.entrySet()のイテレータを入手してください。
  3. すべての値を繰り返します。
    1. イテレータのMap.Entryを取得してください。
    2. 値に基づいてModule型(カスタムクラス)のオブジェクトを作成します。
    3. クラスをJPanelに追加します。
  4. パネルを表示する.

これに関する問題は、値を元に戻す順序を制御できないため、(順序をハードコーディングしないと)指定された順序で値を表示できないことです。

これにはArrayListまたはVectorを使用しますが、後のコードでは特定のKeyのModuleオブジェクトを取得する必要があります。これはArrayListまたはVectorではできません。

誰もがこれを行うフリー/オープンソースのJavaクラス、またはいつ追加されたかに基づいてHashtableから値を取得する方法を知っていますか?

ありがとうございます。

411
Shane

LinkedHashMap または TreeMap をお勧めします。 LinkedHashMapは挿入された順にキーを保持しますが、TreeMapは要素のComparatorまたは自然なComparableの順序でソートされたままです。

要素をソートしておく必要がないので、ほとんどの場合、LinkedHashMapは高速になります。 Javadocによると、TreeMapcontainsKeygetput、およびremoveに対してO(log n)のパフォーマンスを持ち、LinkedHashMapはそれぞれのO(1)です。

特定のソート順ではなく、予測可能なソート順のみを期待するAPIの場合は、これら2つのクラスが実装するインタフェースを使用することを検討してください。 NavigableMap または SortedMap 。これにより、特定の実装をAPIにリークさせずに、後でそれらの特定のクラスまたはまったく異なる実装に切り替えることができます。

655
Michael Myers

不変マップがあなたのニーズに合うなら、グーグルによる guava というライブラリがあります( guava questions もご覧ください)。

GuavaImmutableMap を提供し、信頼できるユーザー指定の反復順序を持ちます。この ImmutableMap はcontainsKeyのためにO(1)の性能を持っています。明らかにputとremoveはサポートされていません。

ImmutableMap オブジェクトは、洗練された静的便利メソッド of() および copyOf() または Builder オブジェクトを使用して構築されます。

15
jvdneste

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 
15
Praveen Kishor

Map(高速検索用)とList(注文用)を管理できますが、LinkedHashMapが最も単純な場合があります。 SortedMapを試すこともできます。 TreeMap、これは任意の順序を指定できます。

6
Peter Lawrey

あなたは私の Linked Tree Map の実装を試すことができます。

1
Lawrence Dol

それがオープンソースであるかどうかはわかりませんが、ちょっとグーグルした後、 このArrayListを使用したMapの実装 を見つけました。それは1.5より前のJavaのように思われるので、あなたはそれを一般化したいかもしれません、それは簡単であるべきです。この実装にはO(N)アクセスがありますが、JPanelに何百ものウィジェットを追加しないのであれば、これは問題にならないはずです。

1
jpalecek

私が前もって知られていることの自然な順序を維持する必要があるときはいつでも、私は EnumMap を使います

キーは列挙型になりますので、任意の順序で挿入できますが、反復すると列挙型の順序(自然順序)で反復されます。

また、EnumMapを使用するときは衝突が発生しないようにしてください。

私は本当にenumMapを使うことがきれいに読めるコードになることを見つける。これが の例です

1
j2emanue

Mapの主な挿入順序にはLinkedHashMapを使用できます。

Java LinkedHashMapクラスに関する重要な点は次のとおりです。

  1. それはユニークな要素のみを含みます。
  2. LinkedHashMapはキーに基づく値を含みます3.それは1つのnullキーと複数のnull値を持つことができます。 4.挿入順序を維持する代わりにHashMapと同じ

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> 
    

ただし、ユーザー定義オブジェクトまたは基本データ型のキーを使用してマップ内で値を並べ替える場合は、TreeMapを使用します。詳細については、 を参照してください。このリンク

0
Pankaj Goyal