Jawa Hashmap: Bagaimana untuk mendapatkan kunci dari nilai?
Jika saya memiliki nilai "anu"
, dan HashMap<String> ftw
untuk yang ftw.containsValue("anu")
mengembalikan true
, bagaimana saya bisa mendapatkan tombol yang sesuai? Apakah saya harus loop melalui hashmap? Apa cara terbaik untuk melakukan itu?
425
34
Jika anda struktur data yang telah banyak-ke-satu pemetaan antara kunci dan nilai-nilai anda harus iterate atas entri dan mengambil semua kunci yang cocok:
Dalam kasus satu-ke-satu hubungan, anda dapat kembali pertama dicocokkan kunci:
Di Jawa 8:
Juga, untuk Jambu pengguna, BiMap mungkin berguna. Misalnya:
Jika anda memilih untuk menggunakan Commons Koleksi perpustakaan bukan standar Koleksi Java API, anda dapat mencapai hal ini dengan mudah.
The BidiMap antarmuka dalam Koleksi perpustakaan adalah bi-directional peta, yang memungkinkan anda untuk memetakan kunci untuk nilai (seperti peta normal), dan juga untuk memetakan nilai untuk kunci, sehingga memungkinkan anda untuk melakukan pencarian di kedua arah. Mendapatkan kunci untuk nilai ini didukung oleh getKey() metode.
Ada peringatan meskipun, bidi maps tidak dapat memiliki beberapa nilai dipetakan ke kunci, dan karenanya kecuali data set 1:1 pemetaan antara kunci dan nilai-nilai, anda tidak dapat menggunakan bidimaps.
Update
Jika anda ingin bergantung pada Koleksi Java API, anda akan memiliki untuk memastikan hubungan 1:1 antara kunci dan nilai-nilai pada saat memasukkan nilai ke dalam peta. Ini lebih mudah dikatakan daripada dilakukan.
Setelah anda dapat memastikan bahwa, gunakan entrySet() metode untuk mendapatkan set entri (pemetaan) di Peta. Setelah anda telah memperoleh himpunan yang jenis Peta.Entri, iterate melalui entri, membandingkan nilai yang disimpan terhadap yang diharapkan, dan mendapatkan tombol.
Update #2
Dukungan untuk bidi peta dengan obat generik dapat ditemukan di Google Jambu dan refactored Commons-Koleksi perpustakaan (yang terakhir ini tidak Apache proyek). Terima kasih untuk Esko untuk menunjuk hilang generik dukungan di Apache Commons Koleksi. Menggunakan koleksi dengan obat generik membuat lebih maintainable kode.
Beberapa info tambahan... Mungkin berguna untuk anda
Metode di atas mungkin tidak akan baik jika anda hashmap adalah benar-benar besar. Jika anda hashmap mengandung kunci yang unik untuk menawarkan nilai yang unik untuk pemetaan, anda dapat mempertahankan satu lagi hashmap yang berisi pemetaan dari Nilai Key.
Yang anda harus mempertahankan dua hashmaps
Dalam hal ini anda dapat menggunakan kedua hashmap untuk mendapatkan kunci.
Saya pikir pilihan anda
entrySet()
dan untuk menemukan kunci yang sesuai dengan nilai. Ini adalah yang paling lambat metode, karena memerlukan iterasi melalui seluruh koleksi, sementara dua lainnya metode don't membutuhkan itu.Anda bisa menyisipkan kedua kunci,nilai pasangan dan terbalik ke dalam peta struktur
Menggunakan peta.mendapatkan("nilai") kemudian akan kembali "theKey".
It's cepat dan kotor cara yang saya've dibuat konstan maps, yang hanya akan bekerja untuk beberapa pilih dataset:
Menghias peta dengan implementasi sendiri
Untuk menemukan semua tombol yang memetakan nilai tersebut, iterate melalui semua pasangan dalam hashmap, menggunakan
peta.entrySet()
.Tidak ada jawaban jelas, karena beberapa tombol yang dapat peta untuk nilai yang sama. Jika anda adalah menegakkan unik-ness dengan kode anda sendiri, solusi terbaik adalah untuk menciptakan sebuah kelas yang menggunakan dua Hashmaps untuk melacak pemetaan di kedua arah.
Jika anda membangun peta dalam kode anda sendiri, cobalah menempatkan kunci dan nilai di peta bersama-sama:
Kemudian ketika anda memiliki nilai, anda juga memiliki kunci.
Saya pikir ini adalah solusi terbaik, asli alamat: Java2s
Penggunaan yang mudah: jika anda menempatkan semua data di hasMap dan anda memiliki item = "Mobil", sehingga anda yang mencari kunci dalam hashMap. itu adalah solusi yang baik.
Menggunakan Java 8:
Kedengarannya seperti cara terbaik bagi anda untuk iterate atas entri menggunakan
peta.entrySet()
sejakpeta.containsValue()
mungkin hal ini pula.I'm takut anda'll hanya untuk iterate peta anda. Singkat saya bisa datang dengan:
Untuk pengembangan Android menargetkan API < 19, Vitalii Fedorenko satu-ke-satu hubungan solusi doesn't bekerja karena
benda-Benda.sama dengan
isn't dilaksanakan. Berikut ini's sederhana alternatif:Anda dapat menggunakan berikut:
Di java8
Ya, anda memiliki untuk loop melalui hashmap, kecuali jika anda menerapkan sesuatu di sepanjang baris dari apa berbagai jawaban sarankan. Daripada mengutak-atik entrySet, I'a hanya mendapatkan keySet(), iterate atas yang mengatur, dan menjaga (pertama) kunci yang akan anda mencocokkan nilai. Jika anda membutuhkan semua tombol yang sesuai dengan nilai tersebut, jelas anda harus melakukan semuanya.
Sebagai Jonas menunjukkan, ini mungkin sudah menjadi apa containsValue metode lakukan, sehingga anda mungkin hanya melewati tes itu semua bersama-sama, dan hanya melakukan iterasi setiap saat (atau mungkin compiler sudah akan menghilangkan redundansi, siapa yang tahu).
Juga, relatif terhadap jawaban yang lain, jika anda reverse peta terlihat seperti
anda dapat bergerak dengan bebas-kunci unik->nilai pemetaan, jika anda membutuhkan kemampuan (menguraikan mereka ke samping). Yang akan menggabungkan baik menjadi salah satu solusi yang menyarankan orang-orang di sini menggunakan dua peta.
Anda bisa mendapatkan kunci dengan menggunakan nilai-nilai menggunakan kode berikut..