web-dev-qa-db-ja.com

Javaハッシュテーブルをソートする方法は?

いくつかのデータをJavaハッシュテーブルに挿入しました。ハッシュテーブルからデータを読み取った場合、挿入した順序と同じ順序で返されません。順序付けられたデータを取得するにはどうすればよいですか。ハッシュテーブル?

次のコードを使用して、ハッシュテーブルから値を取得します。

// Get a set of the entries
Set set = hsUpdateValues.entrySet();
// Get an iterator
Iterator i = set.iterator();
// Display elements
while (i.hasNext()) {
    Map.Entry me = (Map.Entry) i.next();            
    System.out.print(
        "Key : " + me.getKey()
        + ", Value: " + me.getValue()
    );
}
8
Tester

順序を維持するマップが必要な場合は、 LinkedHashMap を使用する必要があります。

予測可能な反復順序を使用した、マップインターフェイスのハッシュテーブルとリンクリストの実装。この実装は、すべてのエントリを介して実行される二重リンクリストを維持するという点でHashMapとは異なります。このリンクリストは、反復順序を定義します。これは通常、キーがマップに挿入された順序(挿入順序)です。キーがマップに再挿入されても、挿入順序は影響を受けないことに注意してください。 (m.put(k, v)が呼び出される直前にtrueを返すときにm.containsKey(k)が呼び出されると、キーkがマップmに再挿入されます。)

この実装は、HashMapに関連するコストの増加を招くことなく、Hashtable(およびTreeMap)によって提供される不特定の一般的に混沌とした順序からクライアントを保護します。

これは通常、HashMapではなくHashtableと比較されることに注意してください-Hashtableと同等の順序を保持する方法はわかりません。いずれにせよ、後者は最近では通常使用されていません(ArrayListが通常Vectorよりも優先して使用されるのと同じように)。

key-sortedorderではなくinsertionorderが必要だと思います。後者が必要な場合は、 TreeMap を使用してください。

22
Jon Skeet

Hashtableは並べ替えることができませんが、並べ替えられたデータを取得する方法を尋ねました。これは、HashTableから抽出されたキーのリストを並べ替え、その順序で値を取得する方法です。何かのようなもの:

List<'your_type'> tmp = Collections.list('your_hashtable'.keys());
Collections.sort(tmp);
Iterator<'your_type'> it = tmp.iterator();

while(it.hasNext()){
    'your_type' element =it.next();
    //here you can get ordered things: 'your_hashtable'.get(element);
}

良くなるよ。

7
Filippo Mazza

Hashtableには予測可能な反復順序がなく、並べ替えることができません。予測可能な反復順序のみが必要な場合は、 LinkedHashMap を使用する必要があります。 Mapを並べ替えることができるようにする場合は、 TreeMap を使用する必要があります。

7
Björn

Hashtableは、1998年にJava 1.2コレクションに置き換えられたレガシーコレクションです。VectorおよびEnumerationとともに回避することをお勧めします。 。

Hashtableの代わりに、可能な場合はHashMapを使用してください。必要に応じて、Collections.synchronizedMap(map)を使用して同期を追加できます。

Vectorの代わりに、可能な場合はArrayListを使用してください。必要に応じて、Collections.synchronizedList(map)を使用して同期を追加できます。

Enumerationの代わりに、Iteratorまたはfor-eachループを使用できます。

3
Peter Lawrey

TreeMapを使用して並べ替えます。

Map<String, String> yourMap = new HashMap<String, String>();
    yourMap.put("1", "one");
    yourMap.put("2", "two");
    yourMap.put("3", "three");

Map<String, String> sortedMap = new TreeMap<String, String>(yourMap);
3
Mohamed Saligh
0

ハッシュテーブルからデータを読み取った場合、挿入した順序と同じ順序ではありません。

あなたの質問は意味がありません。ハッシュテーブルには「順序」がなく、順序付けられていません(編集:一部の実装には順序がありますが、ハッシュテーブルでは一般的ではありません)。

エントリはどのような順序であると思いますか?

要素を特定の順序で格納する場合は、リスト(Java.util.Listのサブクラスなど)を使用する必要があります。

ところで、コードサンプルにはハッシュテーブルすら含まれていません。

0
sleske