Saya memiliki dua HashMap
objek yang didefinisikan seperti ini:
HashMap<String, Integer> map1 = new HashMap<String, Integer>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
Saya juga punya HashMap
objek ketiga :
HashMap<String, Integer> map3;
Bagaimana saya bisa bergabung map1
dan map2
bersama map3
?
Jawaban:
sumber
Map
adalah definisi unikJika Anda tahu Anda tidak memiliki kunci duplikat, atau Anda ingin nilai
map2
untuk menimpa nilai darimap1
kunci duplikat, Anda bisa menulisJika Anda membutuhkan kontrol lebih besar tentang bagaimana nilai-nilai digabungkan, Anda bisa menggunakan
Map.merge
, ditambahkan di Java 8, yang menggunakan yang disediakan penggunaBiFunction
untuk menggabungkan nilai untuk kunci duplikat.merge
beroperasi pada kunci dan nilai individual, jadi Anda harus menggunakan loop atauMap.forEach
. Di sini kami merangkai string untuk kunci duplikat:Jika Anda tahu Anda tidak memiliki kunci duplikat dan ingin menerapkannya, Anda bisa menggunakan fungsi gabungan yang melempar
AssertionError
:Mengambil langkah mundur dari pertanyaan khusus ini, perpustakaan Java 8 stream menyediakan
toMap
dangroupingBy
Kolektor . Jika Anda berulang kali menggabungkan peta dalam satu lingkaran, Anda mungkin dapat merestrukturisasi perhitungan Anda untuk menggunakan stream, yang keduanya dapat memperjelas kode Anda dan memungkinkan paralelisme mudah menggunakan aliran paralel dan kolektor bersamaan.sumber
One-liner menggunakan Java 8 Stream API:
Di antara manfaat metode ini adalah kemampuan untuk melewatkan fungsi penggabungan, yang akan menangani nilai-nilai yang memiliki kunci yang sama, misalnya:
sumber
Java 8 alternatif satu-liner untuk menggabungkan dua peta:
Sama dengan referensi metode:
Atau idemponent untuk solusi peta asli dengan peta ketiga:
Dan di sini adalah cara untuk menggabungkan dua peta menjadi satu peta cepat berubah dengan Guava yang paling tidak memungkinkan operasi penyalinan antara:
Lihat juga Menggabungkan dua peta dengan Java 8 untuk kasus-kasus ketika nilai-nilai yang ada di kedua peta perlu dikombinasikan dengan fungsi pemetaan.
sumber
Jika Anda tidak memerlukan mutabilitas untuk peta akhir Anda, ada Guava
ImmutableMap
denganBuilder
danputAll
metode yang, berbeda dengan metode antarmuka JavaMap
, dapat dirantai.Contoh penggunaan:
Tentu saja, metode ini bisa lebih generik, gunakan varargs dan loop ke
putAll
Maps
dari argumen dll, tetapi saya ingin menunjukkan konsep.Juga,
ImmutableMap
danBuilder
memiliki beberapa keterbatasan (atau mungkin fitur?):NullPointerException
- jika ada kunci atau nilai di peta adalah nol)IllegalArgumentException
jika kunci duplikat ditambahkan).sumber
HashMap memiliki
putAll
metode.http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
sumber
Anda bisa menggunakan Collection.addAll () untuk tipe lain, mis
List
.Set
, Dll. UntukMap
, Anda bisa menggunakanputAll
.sumber
Solusi umum untuk menggabungkan dua peta yang mungkin dapat berbagi kunci umum:
Di tempat:
Mengembalikan peta baru:
sumber
Cuplikan kecil yang sering saya gunakan untuk membuat peta dari peta lain:
sumber
Anda bisa menggunakan
HashMap<String, List<Integer>>
untuk menggabungkan kedua hashmaps dan menghindari kehilangan elemen yang dipasangkan dengan kunci yang sama.keluaran:
sumber
Sangat terlambat, tetapi izinkan saya berbagi apa yang saya lakukan ketika saya memiliki masalah yang sama.
Ini memberikan output berikut
sumber
Item duplikat tidak akan ditambahkan (yaitu kunci duplikat) seperti ketika kita akan mencetak hs3 kita hanya akan mendapatkan satu nilai untuk kunci 5 yang akan menjadi nilai tambah terakhir dan itu akan menjadi tikus. ** [Set memiliki properti yang tidak mengizinkan kunci duplikat tetapi nilainya dapat digandakan]
sumber
Metode 1: Masukkan peta dalam Daftar dan kemudian bergabung
Metode 2: Penggabungan Peta Normal
sumber
Anda dapat menggunakan fungsi putAll untuk Peta seperti yang dijelaskan dalam kode di bawah ini
sumber
Cuplikan di bawah ini membutuhkan lebih dari satu peta dan menggabungkannya.
Tautan contoh demo .
sumber
Anda dapat menggunakan - metode addAll
http://download.oracle.com/javase/6/docs/api/java/util/HashMap.html
Tetapi selalu ada masalah ini bahwa - jika dua peta hash Anda memiliki kunci yang sama - maka itu akan menimpa nilai kunci dari peta hash pertama dengan nilai kunci dari peta hash kedua.
Agar berada di sisi yang lebih aman - ubah nilai kunci - Anda dapat menggunakan awalan atau akhiran pada tombol - (awalan / akhiran berbeda untuk peta hash pertama dan awalan / sufiks berbeda untuk peta hash kedua)
sumber