Mam dwa HashMap
zdefiniowane w ten sposób obiekty:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
Mam również trzeci HashMap
przedmiot:
HashMap<String, Integer> map3;
Jak mogę połączyć map1
i map2
razem się map3
?
Odpowiedzi:
źródło
Map
są z definicji unikalneJeśli wiesz, że nie masz zduplikowanych kluczy lub chcesz, aby wartości
map2
zastąpiły wartościmap1
dla zduplikowanych kluczy, możesz po prostu napisaćJeśli potrzebujesz większej kontroli nad sposobem łączenia wartości, możesz użyć
Map.merge
dodanej w Javie 8, która wykorzystuje dane dostarczone przez użytkownikaBiFunction
do scalenia wartości dla duplikatów kluczy.merge
działa na poszczególnych kluczach i wartościach, więc musisz użyć pętli lubMap.forEach
. Tutaj łączymy ciągi dla duplikatów kluczy:Jeśli wiesz, że nie masz zduplikowanych kluczy i chcesz je wymusić, możesz użyć funkcji scalania, która generuje
AssertionError
:Cofając się od tego konkretnego pytania, biblioteka strumieni Java 8 zapewnia
toMap
igroupingBy
Kolektory . Jeśli wielokrotnie łączysz mapy w pętli, możesz być w stanie zrestrukturyzować swoje obliczenia, aby używać strumieni, które mogą zarówno wyjaśnić kod, jak i umożliwić łatwą równoległość za pomocą strumienia równoległego i równoległego kolektora.źródło
Jednowierszowy korzystający z interfejsu API Java 8 Stream:
Jedną z zalet tej metody jest możliwość przekazania funkcji scalania, która będzie zajmować się wartościami o tym samym kluczu, na przykład:
źródło
Alternatywny jednowierszowy Java 8 do łączenia dwóch map:
To samo dotyczy odwołania do metody:
Lub idemponent dla oryginalnego rozwiązania map z trzecią mapą:
A oto sposób na połączenie dwóch map w szybko niezmienną z Guava, który wykonuje najmniej możliwe operacje kopiowania pośredniego:
Zobacz także Scal dwie mapy z Javą 8, aby zapoznać się z przypadkami, gdy wartości obecne w obu mapach muszą być połączone z funkcją mapowania.
źródło
Jeśli nie potrzebujesz zmienności dla ostatecznej mapy, jest Guava
ImmutableMap
z jegoBuilder
iputAll
metodą, która w przeciwieństwie do metody interfejsu JavyMap
, mogą być powiązane.Przykład zastosowania:
Oczywiście ta metoda może być bardziej ogólna, użyj varargs i zapętl do
putAll
Maps
argumentów itp., Ale chciałem pokazać koncepcję.Również
ImmutableMap
i jegoBuilder
posiada kilka ograniczeń (albo może być wyposażony):NullPointerException
- jeśli jakikolwiek klucz lub wartość na mapie jest pusta)IllegalArgumentException
jeśli dodano duplikaty kluczy).źródło
HashMap ma
putAll
metodę.http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
źródło
Można użyć Collection.addAll () dla innych typów, np
List
,Set
itp NaMap
, można użyćputAll
.źródło
Ogólne rozwiązanie do łączenia dwóch map, które mogą współdzielić wspólne klucze:
W miejscu:
Zwracanie nowej mapy:
źródło
Mały fragment, którego używam bardzo często do tworzenia mapy z innych map:
źródło
możesz użyć
HashMap<String, List<Integer>>
do scalenia obu map skrótów i uniknięcia utraty elementów sparowanych z tym samym kluczem.wynik:
źródło
Bardzo późno, ale pozwólcie, że podzielę się tym, co zrobiłem, gdy miałem ten sam problem.
Daje następujące dane wyjściowe
źródło
Zduplikowane elementy nie zostaną dodane (to znaczy zduplikowane klucze), ponieważ kiedy wydrukujemy hs3, otrzymamy tylko jedną wartość dla klucza 5, który będzie ostatnią wartością dodaną i będzie to szczur. ** [Zestaw ma właściwość polegającą na niedozwoleniu na duplikat klucza, ale wartości mogą być duplikowane]
źródło
Metoda 1: Umieść mapy na liście, a następnie dołącz
Metoda 2: Normalne scalenie mapy
źródło
Możesz użyć funkcji putAll dla mapy, jak wyjaśniono w poniższym kodzie
źródło
Poniżej fragment zajmuje więcej niż jedną mapę i łączy je.
Przykładowy link demonstracyjny .
źródło
możesz użyć metody addAll
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Ale zawsze istnieje problem, że - jeśli dwie mapy skrótów mają taki sam klucz - wówczas zastąpi wartość klucza z pierwszej mapy skrótu wartością klucza z drugiej mapy skrótu.
Aby być bezpieczniejszym - zmień wartości kluczy - możesz użyć przedrostka lub sufiksu na klawiszach - (inny prefiks / sufiks dla pierwszej mapy hash i inny prefiks / sufiks dla drugiej mapy hash)
źródło