Javaでマップをリストに変換する方法は?


671

a Map<key,value>をa に変換する最良の方法は何List<value>ですか?すべての値を反復処理してリストに挿入するか、何か見落としているのですか?


1
マップをリストに変換する必要がある場合、これは良いモデルではないと思います。この状況が発生しないような方法でコードを書く必要があります。
バグの発生

回答:


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

仮定:

Map<Key,Value> map;

7
ありがとう!私はからのキャストと仮定したCollectionList働くだろうが。
asgs

1
それが機能しない理由は、values()によって返されるコレクションが基になるMapに依存しているためだと思います。代わりにコピーコンストラクター呼び出しを行うことで、ストレージを割り当て、そのストレージに値をコピーして、接続を切断します...
Sheldon R.

4
LinkedHashMapがある場合、注文は同じままになりますか?

1
@ user2022068はい、順序はLinkedHashMapで保持する必要があります。
SusanW 2016

1
@SheldonR。はい-コレクションはで返されるkeySet()values()、一般的に基本的な構造(の設定またはコレクションビュー与えるシムオブジェクトでkeySet()返さないdupesを強調しないように設定します)。の場合values()、返されるオブジェクトであるList場合がありますが、多くの場合はそうではありません。実際のリストを作成すると、リンクが壊れ、元のマップに依存しなくなります。ただし、一部のAPIはリストを必要とするため、必要なのはリストだけです-優れたAPIが必要とする最も抽象的なインターフェイスのみを必要とするというルールの強化...
SusanW

137

ここでの問題は、Map2つの値(キーと値)があるのに対して、List1つの値(要素)しかないことです。

したがって、実行できる最善の方法Listは、キーまたは値のいずれかを取得することです。(キー/値ペアを保持するラッパーを作成しない限り)。

私たちがいるとしましょうMap

Map<String, String> m = new HashMap<String, String>();
m.put("Hello", "World");
m.put("Apple", "3.14");
m.put("Another", "Element");

メソッドとして返されたキーからList新しいキーを作成することにより、キーを取得できます。ArrayListSetMap.keySet

List<String> list = new ArrayList<String>(m.keySet());

メソッドとして返された値からList新しい値を作成して、値を取得できます。ArrayListCollectionMap.values

List<String> list = new ArrayList<String>(m.values());

Listキーを取得した結果:

林檎
別の
こんにちは

List値を取得した結果:

3.14
素子
世界

3
これらのメソッドによって返される値の順序は定義されておらずHashMap、同様の並べ替えられていないMap実装では、事実上ランダムであることに注意してください。
Joachim Sauer

1
はい、それはLinkedHashMapまたはそのようなものであることを知っている必要があります。元の質問の問題は、質問が誤っているということです。つまり、編集が必要です。問題は、マップをリストに変換することではなく、マップの値をリストとして取得する方法です。メソッドの値はコレクションを提供しますが、リストは提供しません。したがって、きちんとした小さなトリックが必要です。
demongolem

@ M0lesが言うことをあなたの答えに追加できると思います:どういうわけか、SortedMapを「経由する」必要があります。具体的なSortedMap実装(TreeMapなど)から開始するか、入力マップをSortedMapに挿入してからリストに変換します
Ignacio Rubio

41

Java 8 Streams APIの使用。

List<Value> values = map.values().stream().collect(Collectors.toList());

8
私は受け入れられた、コンストラクタベースの答えを好みます。ストリームは、コードを簡略化するためのものです。
アーロン

1
@Aaronはい、Mapから値のリストを取得するタスクの場合、コンストラクターは単純なようです。ただし、Streamsをコードベースで広範囲に使用している場合は、一貫性を保つことをお勧めします。
Matej Kormuth 2017

1
これを使用すると、大量のデータをフェッチしているとエラーが発生します。スレッドがjava.util.stream.ReduceOps $ 3.makeSink(Unknown Source)でループしています。スレッドが無限にループする場合、CPU消費が急上昇し始めます。ループスレッドのスタックトレースを以下に示します。調べてください
Ganesh Giri

24

map.entrySet()Map.Entryキーと値の両方を含むオブジェクトのコレクションを提供します。次に、これを好きなコレクションオブジェクトに変換できますnew ArrayList(map.entrySet())


23

何のリスト?

仮定すると、mapあなたのインスタンスでありますMap

  • map.values()Collectionマップのすべての値を含むを返します。
  • map.keySet()Setマップのすべてのキーを含むを返します。

14

に含まれる値Mapをa に変換したいと思いますlistか?最も簡単なのはvalues()Mapインターフェースのメソッドを呼び出すことです。これは、Collectionに含まれる値オブジェクトのを返しますMap

これCollectionMapオブジェクトによってサポートされており、オブジェクトへの変更Mapはここに反映されることに注意してください。したがって、Mapオブジェクトにバインドされていない別のコピーが必要ListArrayList場合はCollection、以下のように値を渡すなど、新しいオブジェクトを作成するだけです。

ArrayList<String> list = new ArrayList<String>(map.values());

6

あなたはこのようにそれを行うことができます

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

1
OPは、List <value>に変換する方法について尋ねます。回答を提供するときは、提案されたソリューションに適切な説明を含めることをお勧めします。この質問は回答済みです。
HaveNoDisplayName 2014年

5

結果の値がList<Value>入力のキー順であることを確認したい場合Map<Key, Value>SortedMap何らかの方法で「経由」する必要があります。

具体的な実装(など)で開始するか、入力をに変換してからに変換します。例えば:SortedMapTreeMapMapSortedMapList

Map<Key,Value> map;
List<Value> list = new ArrayList<Value>( new TreeMap<Key Value>( map ));

それ以外の場合は、Map実装が提供するネイティブの順序を取得します。これは、通常、自然なキーの順序以外のものになる可能性があります(試してみるHashtableConcurrentHashMap、さまざまな場合)。


5
    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("java", 20);
    map.put("C++", 45);

    Set <Entry<String, Integer>> set = map.entrySet();

    List<Entry<String, Integer>> list = new ArrayList<Entry<String, Integer>>(set);

リストにキーと値のペアを含めることができます。リストを反復処理することにより、Map.Entryを使用してキーと値を取得することもできます。


4
// you can use this
List<Value> list = new ArrayList<Value>(map.values());

// or you may use 
List<Value> list = new ArrayList<Value>();
for (Map.Entry<String, String> entry : map.entrySet())
{
list.add(entry.getValue());    
}

1
"Map<String , String > map = new HapshMap<String , String>;
 map.add("one","java");
 map.add("two" ,"spring");
 Set<Entry<String,String>> set =  map.entrySet();
 List<Entry<String , String>> list = new ArrayList<Entry<String , String>>    (set);
 for(Entry<String , String> entry : list ) {
   System.out.println(entry.getKey());
   System.out.println(entry.getValue());
 } "

1

次に、マップから値を取得するための一般的なメソッドを示します。

public static <T> List<T> ValueListFromMap(HashMap<String, T> map) {
    List<T> thingList = new ArrayList<>();

    for (Map.Entry<String, T> entry : map.entrySet()) {
        thingList.add(entry.getValue());
    }

    return thingList;
}

1
HashMap<Integer, List<String>> map = new HashMap<>(); 
List<String> list = new ArrayList<String>();
list.add("Java");
list.add("Primefaces");
list.add("JSF");
map.put(1,list);
if(map != null){
    return new ArrayList<String>((Collection<? extends String>) map.values());
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.