web-dev-qa-db-ja.com

Set <Map.Entry <K、V >>をHashMap <K、V>に変換します

コードのある時点で、Set<Map.Entry<K, V>>地図から。次に、同じマップフォームを再作成したいので、HashSet<Map.Entry<K, V>>に戻るHashMap<K, V>。 Javaこれを行うためのネイティブ呼び出しがありますか、またはセット要素をループして手動でマップを構築する必要がありますか?

25
Joeblackdev

JavaにHashSetHashMapを直接変換するための組み込みAPIはありません。マップ内のEntry fillを使用してセットを反復処理する必要があります。

1つのアプローチ:

Map<Integer, String> map = new HashMap<Integer, String>();
    //fill in map
    Set<Entry<Integer, String>> set = map.entrySet();

    Map<Integer, String> mapFromSet = new HashMap<Integer, String>();
    for(Entry<Integer, String> entry : set)
    {
        mapFromSet.put(entry.getKey(), entry.getValue());
    }

ここでの目的は何ですか?Setを変更すると、Map.entrySetによって返されるセットとしてMapにも反映されますが、Mapによってバックアップされます。以下のjavadocを参照してください。

Set <Entry <Integer、String >> Java.util.Map.entrySet()

このマップに含まれるマッピングのSetビューを返します。セットはマップに連動しているため、マップへの変更はセットに反映され、その逆も同様です。セットの反復の進行中にマップが変更された場合(反復子自体の削除操作、または反復子によって返されたマップエントリのsetValue操作を除く)、反復の結果は未定義です。このセットは、Iterator.remove、Set.remove、removeAll、retainAll、clearの各オペレーションを介して、マップから対応するマッピングを削除する要素の削除をサポートしています。 addまたはaddAll操作はサポートしていません。

21
harsh

Collectors.toMapを含むよりシンプルなJava-8ソリューション:

Map<Integer, String> mapFromSet = set.stream()
    .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

重複キーが検出されると、IllegalStateExceptionがスローされます。

40
Tagir Valeev

グアバ19では、 ImmutableMap.copyOf(Iterable<Map.Entry<K,V>>) を使用できます

5
Neil

かなり短いJava 8ソリューション。重複キーに対処できます。

    Map<Integer, String> map = new HashMap<>();
    //fill in map
    Set<Map.Entry<Integer, String>> set = map.entrySet();
    Map<Integer, String> mapFromSet = set.stream().collect(Collectors.toMap(Entry::getKey,
      Entry::getValue,
      (a,b)->b));

編集: shmosel に感謝します。

5
mikeyreilly

これらは、一般的なライブラリのtoMapユーティリティですが、残念ながら、Setを直接サポートするものはないため、最初に Set#toArray() を実行する必要があります。 (私は省略しました Guava for Neil's answer これは間違いなく最高です)

コモンズラング ArrayUtils.toMap

Map<Object, Object> map = ArrayUtils.toMap(entrySet.toArray());

// to recover the type...
@SuppressWarnings("unchecked")
Map<K, V> typedMap = (Map<K, V>)(Map<?, ?>)map;

コモンズコレクション ' MapUtils.putAll

Map<K, V> map = MapUtils.putAll(new HashMap<K, V>(), entrySet.toArray());

Java 9の Map.ofEntries

 // convert to array and recover the type...
 @SuppressWarnings("unchecked")
 Map<K, V> map = Map.ofEntries(entrySet.toArray(new Map.Entry[0]));

 // You need to copy again if you want a mutable one
 Map<K, V> hashmap = new HashMap<>(map);
4
snipsnipsnip

In Java 8と正しいコンバイナ

Map<Integer, String> map = new HashMap<>();
//fill in map
Set<Map.Entry<Integer, String>> set = map.entrySet();

Map<Integer, String> mapFromSet =set.stream().collect(HashMap::new,(t, u) -> t.put(u.getKey(), u.getValue()), 
(Map mapToReturn, Map otherMap) ->
    {
        otherMap.entrySet().forEach((Map.Entry entry) -> {
            mapToReturn.put(entry.getKey(),entry.getValue());
        });
        return mapToReturn;}););
0
Joe