it-swarm.com.de

Konvertieren Sie Set <Map.Entry <K, V >> in HashMap <K, V>

An einem Punkt in meinem Code habe ich einen Set<Map.Entry<K, V>> aus einer Karte erstellt. Jetzt möchte ich dasselbe Kartenformular neu erstellen, also den HashSet<Map.Entry<K, V>> wieder in einen HashMap<K, V> konvertieren. Verfügt Java über einen systemeigenen Aufruf, oder muss ich die gesetzten Elemente durchlaufen und die Map manuell aufbauen?

21
Joeblackdev

In Java gibt es keine integrierte API für die direkte Konvertierung zwischen HashSet und HashMap. Sie müssen das Set durchlaufen und mit Entry die Karte ausfüllen.

ein Ansatz:

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());
    }

Was ist der Zweck hier? Wenn Sie Änderungen an Set vornehmen, wird dies auch in Map wiedergegeben, da der von Map.entrySet zurückgegebene Satz eine Sicherung durch Map ist. Siehe javadoc unten:

Set <Eintrag <Ganzzahl, String >> Java.util.Map.entrySet ()

Gibt eine Set-Ansicht der in dieser Map enthaltenen Zuordnungen zurück. Die Menge ist von der Karte gesichert werden, so werden Änderungen an der Karte in der Gruppe reflektiert, und und umgekehrt. Wenn die Map geändert wird, während eine Iteration über die Gruppe .__ ist. in progress (außer durch den eigenen Remove-Vorgang des Iterators oder durch den setValue-Vorgang für einen vom Iterator zurückgegebenen Map-Eintrag) sind die Ergebnisse der Iteration undefiniert. Das Set unterstützt Elemententfernung, wodurch die entsprechende Zuordnung von der Karte entfernt wird, über den Iterator.remove, Set.remove, removeAll, keepAll und clear Operationen. Die Operationen add oder addAll werden nicht unterstützt.

19
harsh

Einfachere Java-8-Lösung mit Collectors.toMap:

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

Eine IllegalStateException wird ausgelöst, wenn ein doppelter Schlüssel gefunden wird.

35
Tagir Valeev

Ab Guava 19 können Sie ImmutableMap.copyOf(Iterable<Map.Entry<K,V>>) verwenden.

5
Neil

Ziemlich kurze Java 8-Lösung. Kann mit doppelten Schlüsseln zurechtkommen.

    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));

Edit: Danke an shmosel , der dafür mehr Anerkennung verdient als ich

5
mikeyreilly

Dies sind einige toMap-Hilfsprogramme in gängigen Bibliotheken, aber leider unterstützt keiner von ihnen Set direkt. Daher müssen Sie zuerst Set#toArray() ausführen. (Ich habe weggelassen Guave für Neils Antwort das ist wohl das Beste)

Commons Langs 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;

Commons Collections ' MapUtils.putAll

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

Java 9 Map.ofEinträge

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

 Map<K, V> map = Map.ofEntries(array);

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

In Java 8 mit dem richtigen Combiner

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