web-dev-qa-db-ja.com

HashMapをJavaのリストに変換するにはどうすればよいですか?

Javaでは、HashMapとして返されるListの値をどのように取得しますか?

51
Spider
HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
List<String> list = new ArrayList<String>(map.values());
for (String s : list) {
    System.out.println(s);
}
87
Spider

あなたが持っていると仮定:

HashMap<Key, Value> map; // Assigned or populated somehow.

値のリストの場合:

List<Value> values = new ArrayList<Value>(map.values());

キーのリストの場合:

List<Key> keys = new ArrayList<Key>(map.keySet());

HashMapではキーと値の順序が信頼できないことに注意してください。それぞれのリストでキーと値の位置の1対1の対応を保持する必要がある場合は、 LinkedHashMap を使用します。

70
maerics

基本的に、混乱を招くため、質問と回答を混同しないでください。

次に、変換の意味を指定し、このソリューションのいずれかを選択できます

List<Integer> keyList = Collections.list(Collections.enumeration(map.keySet()));

List<String> valueList = Collections.list(Collections.enumeration(map.values()));

コレクションインターフェイスには3つのビューがあります

  • keySet
  • entrySet

Hashmapをキーと値の2つのリストに変換するために他の人が答えました。完全に正しいです

私の追加:「キーと値のペア」(通称entrySet)をリストに変換する方法。

      Map m=new HashMap();
          m.put(3, "dev2");
          m.put(4, "dev3");

      List<Entry> entryList = new ArrayList<Entry>(m.entrySet());

      for (Entry s : entryList) {
        System.out.println(s);
      }

ArrayListにはこのコンストラクターがあります。

6
VdeX

Java 8およびStream Apiを使用したソリューション:

private static <K, V>  List<V> createListFromMapEntries (Map<K, V> map){
        return map.values().stream().collect(Collectors.toList());
    }

使用法:

  public static void main (String[] args)
    {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "one");
        map.put(2, "two");
        map.put(3, "three");

        List<String> result = createListFromMapEntries(map);
        result.forEach(System.out :: println);
    }
5
RichardK

リスト内で同じ順序を維持する場合は、次のように言います。マップは次のようになります。

map.put(1, "msg1")
map.put(2, "msg2")
map.put(3, "msg3")

あなたのリストは次のようになりたい

["msg1", "msg2", "msg3"]   // same order as the map

マップを反復処理する必要があります。

// sort your map based on key, otherwise you will get IndexOutofBoundException
Map<String, String> treeMap = new TreeMap<String, String>(map)

List<String> list = new List<String>();
for (treeMap.Entry<Integer, String> entry : treeMap.entrySet()) {
    list.add(entry.getKey(), entry.getValue());
}  
1
Shengjie

HashMapを反復処理するだけの場合、リストは不要です。

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values()) {
    System.out.println(s);
}

もちろん、反復中にマップを構造的に変更する(つまり、既存のキーの値を変更するだけではない)場合は、「copy to ArrayList」メソッドを使用することをお勧めします。そうしないと、ConcurrentModificationExceptionが発生します。または、配列としてエクスポートします。

HashMap<Integer, String> map = new HashMap<Integer, String>();
map.put (1, "Mark");
map.put (2, "Tarryn");
for (String s : map.values().toArray(new String[]{})) {
    System.out.println(s);
}
1
Paŭlo Ebermann