Saya ingin memiliki peta dengan kunci duplikat.
Saya tahu ada banyak implementasi peta (Eclipse menunjukkan kepada saya sekitar 50), jadi saya yakin pasti ada satu yang memungkinkan ini. Saya tahu mudah untuk menulis peta Anda sendiri yang melakukan ini, tetapi saya lebih suka menggunakan beberapa solusi yang ada.
Mungkin sesuatu di commons-collections atau google-collections?
java
duplicates
guava
multimap
IAdapter
sumber
sumber
Jawaban:
Anda mencari multimap, dan memang baik commons-collections maupun Guava memiliki beberapa implementasi untuk itu. Multimaps memungkinkan beberapa kunci dengan mempertahankan kumpulan nilai per kunci, misalnya Anda dapat meletakkan satu objek ke dalam peta, tetapi Anda mengambil satu koleksi.
Jika Anda dapat menggunakan Java 5, saya lebih suka Guava
Multimap
karena bersifat generik.sumber
com.google.common.collect.HashMultimap
memilikireadObject
/writeObject
metode, seperti halnya ArrayListMultimap dan Immutable {List, Set} Multimap. Saya akan menganggap contoh deserialisasi yang tidak berguna sebagai bug yang layak dilaporkan.Kami tidak perlu bergantung pada perpustakaan eksternal Koleksi Google. Anda cukup menerapkan Peta berikut:
Harap pastikan untuk menyempurnakan kode.
sumber
Outputnya adalah:
Catatan: kita perlu mengimpor file perpustakaan.
http://www.java2s.com/Code/Jar/g/Downloadgooglecollectionsjar.htm
atau https://commons.apache.org/proper/commons-collections/download_collections.cgi
sumber
Anda cukup meneruskan serangkaian nilai untuk nilai dalam HashMap biasa, sehingga mensimulasikan kunci duplikat, dan terserah Anda untuk memutuskan data apa yang akan digunakan.
Anda juga dapat menggunakan MultiMap , meskipun saya sendiri tidak menyukai ide kunci duplikat.
sumber
TreeMap<String, ArrayList<MyClass>>
memecahkan kebutuhan kunci duplikat saya.Jika Anda ingin mengulang tentang daftar pasangan kunci-nilai (seperti yang Anda tulis di komentar), maka Daftar atau array harus lebih baik. Pertama gabungkan kunci dan nilai Anda:
Ganti Class1 dan Class2 dengan jenis yang ingin Anda gunakan untuk kunci dan nilai.
Sekarang Anda dapat memasukkannya ke dalam array atau daftar dan mengulanginya:
sumber
Masalah ini dapat diatasi dengan daftar entri peta
List<Map.Entry<K,V>>
. Kami tidak perlu menggunakan pustaka eksternal atau implementasi baru dari Map. Entri peta dapat dibuat seperti ini:Map.Entry<String, Integer> entry = new AbstractMap.SimpleEntry<String, Integer>("key", 1);
sumber
sumber
Belajarlah dari kesalahan saya ... tolong jangan terapkan ini sendiri. Multimap jambu biji adalah cara yang tepat.
Peningkatan umum yang diperlukan dalam multimaps adalah melarang duplikat pasangan kunci-nilai.
Menerapkan / mengubah ini dalam implementasi Anda bisa mengganggu.
Di Jambu biji sesederhana:
sumber
Saya memiliki varian yang sedikit berbeda dari masalah ini: Ini diperlukan untuk mengaitkan dua nilai berbeda dengan kunci yang sama. Hanya mempostingnya di sini jika itu membantu orang lain, saya telah memperkenalkan HashMap sebagai nilainya:
Dalam kode di atas, key frameID dibaca dari string pertama file input di setiap baris, nilai untuk frameTypeHash dibangun dengan memisahkan baris yang tersisa dan disimpan sebagai objek String aslinya, selama periode waktu file mulai memiliki beberapa baris ( dengan nilai yang berbeda) terkait dengan kunci frameID yang sama, sehingga frameTypeHash diganti dengan baris terakhir sebagai nilainya. Saya mengganti objek String dengan objek HashMap lain sebagai bidang nilai, ini membantu dalam mempertahankan kunci tunggal untuk pemetaan nilai yang berbeda.
sumber
Tidak perlu perpustakaan mewah. Peta ditentukan oleh kunci unik, jadi jangan menekuknya, gunakan daftar. Arus sangat kuat.
Dan hanya itu. Contoh penggunaan:
sumber
sumber
java-map-duplikat-kunci
sumber
bagaimana dengan impl MultiMap seperti itu?
sumber
Bisakah Anda juga menjelaskan konteks yang Anda coba terapkan pada peta dengan kunci duplikat? Saya yakin mungkin ada solusi yang lebih baik. Peta dimaksudkan untuk menyimpan kunci unik untuk alasan yang baik. Padahal jika Anda benar-benar ingin melakukannya; Anda selalu dapat memperluas kelas tulis kelas peta kustom sederhana yang memiliki fungsi mitigasi tabrakan dan akan memungkinkan Anda menyimpan banyak entri dengan kunci yang sama.
Catatan: Anda harus mengimplementasikan fungsi mitigasi tabrakan sedemikian rupa, sehingga kunci yang bertabrakan diubah menjadi set unik "selalu". Sesuatu yang sederhana seperti, menambahkan kunci dengan kode hash objek atau sesuatu?
sumber
sekedar melengkapi, Apache Commons Collections juga memiliki MultiMap . Kelemahannya tentu saja adalah Apache Commons tidak menggunakan Generik.
sumber
Dengan sedikit retasan, Anda dapat menggunakan HashSet dengan kunci duplikat. PERINGATAN: ini sangat bergantung pada implementasi HashSet.
sumber
Jika ada kunci duplikat maka sebuah kunci mungkin sesuai dengan lebih dari satu nilai. Solusi yang jelas adalah memetakan kunci ke daftar nilai-nilai ini.
Misalnya dengan Python:
sumber
Saya menggunakan ini:
java.util.List<java.util.Map.Entry<String,Integer>> pairList= new java.util.ArrayList<>();
sumber