20

いくつかの作業を行うためにマップに変換するリストがあります。その後、マップを再度リストに変換しますが、今回は順序がランダムです。2 番目のリストに同じ最初の順序を保持する必要があります。

明らかな理由は、HashMap が順序を維持しないことです。しかし、それができるように何かをする必要があります。Map の実装を変更できません。どうすれば変更できますか?

与えられたコードを考えてみましょう:

import java.util.*;
public class Dummy {

public static void main(String[] args) {
    System.out.println("Hello world !");
    List<String> list = new ArrayList<String>();
    list.add("A");list.add("B");list.add("C");
    list.add("D");list.add("E");list.add("F");

    Map<String,String> map = new HashMap<String, String>();

    for(int i=0;i<list.size();i=i+2)
        map.put(list.get(i),list.get(i+1));

    // Use map here to do some work

    List<String> l= new ArrayList<String>();
    for (Map.Entry e : map.entrySet()) {
        l.add((String) e.getKey());
        l.add((String) e.getValue());
    }
  }
}

例-最初に、リスト要素を印刷すると、印刷されました

A B C D E F 

今、の要素を印刷するとList l、印刷されました

E F A B C D
4

7 に答える 7

45

HashMapそれ自体は挿入順序を維持しませんが、維持するLinkedHashMapので、代わりにそれを使用してください。

文書化されているように... HashMap

このクラスは、マップの順序を保証しません。特に、順序が長期的に一定であることを保証するものではありません。

そしてLinkedHashMap

Map インターフェイスのハッシュ テーブルとリンク リストの実装で、反復順序が予測可能です。この実装が HashMap と異なる点は、そのすべてのエントリを実行する二重リンク リストを維持することです。この連結リストは反復順序を定義します。これは通常、キーがマップに挿入された順序 (挿入順序) です。

于 2013-10-03T16:45:02.583 に答える
7

順序を維持するには、HashMap の代わりにLinkedHashMapを使用します。

Map<String,String> map = new LinkedHashMap<String, String>();
于 2013-10-03T16:46:17.663 に答える
2

Map実装を(LinkedHashMapたとえば)変更できないのはなぜですか?

論理的な順序がある場合は、リストをカスタムで並べ替えることができますComparator

于 2013-10-03T16:45:29.470 に答える
1

HashMap挿入の順序を保持しません

Map インターフェースのハッシュテーブルベースの実装。この実装は、すべてのオプションのマップ操作を提供し、null 値と null キーを許可します。(HashMap クラスは Hashtable とほぼ同じですが、同期されず、null を許可する点が異なります。) このクラスは、マップの順序に関して保証しません。特に、順序が長期的に一定であることを保証するものではありません。

キーの順序を保持する場合に使用LinkedHashMapします

于 2013-10-03T16:45:10.543 に答える
0

Map本当に別の実装に切り替えることができない場合(LinkedHashMapは、まさにあなたが望むものです)、他の唯一の可能性は、オリジナルを保持し、List,それを使用して新しいものを作成することListですMap.

public <T> List<T> listFromMapInOrder(final Map<T, T> map, final List<T> order) {
    List<T> result = new ArrayList<T>();
    for (T key : order) {
        if (map.containsKey(key)) {
            result.add(key);
            result.add(map.get(key));
        }
    }
    return result;
}

しかし、切り替えが可能になるまでコードをリファクタリングします。LinkedHashMap.

于 2013-10-03T17:09:15.477 に答える