Dapatkan Kunci untuk Nilai dari Peta Java

1. Perkenalan

Dalam tutorial singkat ini, kami akan mendemonstrasikan tiga pendekatan berbeda untuk mengambil kunci dari peta untuk nilai tertentu. Kami juga akan membahas sisi positif dan negatif dari berbagai solusi.

Untuk mempelajari lebih lanjut tentang antarmuka Peta , Anda dapat melihat artikel ini.

2. Pendekatan Iteratif

The Peta antarmuka Java Collections menawarkan sebuah metode yang disebut entrySet () . Ini mengembalikan semua entri atau pasangan nilai-kunci dari peta dalam satu Set .

Idenya adalah untuk mengulangi set entri ini dan mengembalikan kunci yang nilainya cocok dengan nilai yang diberikan:

public  K getKey(Map map, V value) { for (Entry entry : map.entrySet()) { if (entry.getValue().equals(value)) { return entry.getKey(); } } return null; }

Namun, mungkin ada kemungkinan beberapa kunci mengarah ke nilai yang sama.

Dalam hal ini, jika nilai yang cocok ditemukan, kami menambahkan kunci ke Set dan melanjutkan pengulangan. Pada akhirnya, kami mengembalikan Set yang berisi semua kunci yang diinginkan:

public  Set getKeys(Map map, V value) { Set keys = new HashSet(); for (Entry entry : map.entrySet()) { if (entry.getValue().equals(value)) { keys.add(entry.getKey()); } } return keys; }

Meskipun ini adalah implementasi yang sangat mudah, ini membandingkan semua entri bahkan jika semua kecocokan ditemukan setelah beberapa iterasi.

3. Pendekatan Fungsional

Dengan diperkenalkannya Lambda Expressions di Java 8, kita dapat melakukannya dengan cara yang lebih fleksibel dan mudah dibaca. Kami mengubah set entri menjadi Stream dan menyediakan lambda untuk memfilter hanya entri tersebut dengan nilai yang diberikan.

Kemudian kami menggunakan metode peta untuk mengembalikan Stream kunci dari entri yang difilter:

public  Stream keys(Map map, V value) { return map .entrySet() .stream() .filter(entry -> value.equals(entry.getValue())) .map(Map.Entry::getKey); }

Keuntungan mengembalikan aliran adalah dapat memenuhi berbagai kebutuhan klien. Kode panggilan mungkin hanya memerlukan satu kunci atau semua kunci yang menunjuk ke nilai yang diberikan. Karena evaluasi aliran lambat, klien dapat mengontrol jumlah iterasi berdasarkan persyaratannya.

Selain itu, klien dapat mengonversi aliran ke koleksi apa pun menggunakan kolektor yang sesuai:

Stream keyStream1 = keys(capitalCountryMap, "South Africa"); String capital = keyStream1.findFirst().get(); Stream keyStream2 = keys(capitalCountryMap, "South Africa"); Set capitals = keyStream2.collect(Collectors.toSet());

4. Menggunakan Koleksi Apache Commons

Ide di atas tidak akan terlalu membantu jika kita perlu sering memanggil fungsi untuk peta tertentu . Ini tidak perlu akan mengulangi set kuncinya lagi dan lagi.

Dalam skenario ini, mempertahankan peta nilai lain ke kunci akan lebih masuk akal karena akan membutuhkan waktu yang konstan untuk mengambil kunci untuk suatu nilai.

The Commons Koleksi perpustakaan dengan Apache menyediakan dengan seperti bi-directional Peta disebut BidiMap . Ini memiliki metode bernama getKey () untuk mengambil kunci untuk nilai yang diberikan:

BidiMap capitalCountryMap = new DualHashBidiMap(); capitalCountryMap.put("Berlin", "Germany"); capitalCountryMap.put("Cape Town", "South Africa"); String capitalOfGermany = capitalCountryMap.getKey("Germany");

Namun, BidiMap memberlakukan hubungan 1: 1 antara kunci dan nilainya . Jika kita mencoba untuk menempatkan pasangan nilai-kunci yang nilainya sudah ada di Peta, ini menghapus entri lama. Dengan kata lain, itu memperbarui kunci terhadap nilainya.

Juga, itu membutuhkan jumlah memori yang lebih besar untuk menyimpan peta terbalik.

Detail lebih lanjut tentang cara menggunakan BidiMap ada di tutorial ini.

5. Menggunakan Google Guava

Kami dapat menggunakan Peta dua arah lain yang disebut BiMap yang ditemukan di Guava yang dikembangkan oleh Google. Kelas ini menyediakan metode bernama inverse () untuk mendapatkan Peta kunci-nilai atau Peta terbalik untuk mengambil kunci berdasarkan nilai yang diberikan:

HashBiMap capitalCountryMap = HashBiMap.create(); capitalCountryMap.put("Berlin", "Germany"); capitalCountryMap.put("Cape Town", "South Africa"); String capitalOfGermany = capitalCountryMap.inverse().get("Germany");

Seperti BidiMap , BiMap juga tidak mengizinkan banyak kunci yang mengacu pada nilai yang sama . Jika kita mencoba melakukan upaya seperti itu, java.lang.IllegalArgumentException akan dilontarkan .

Tak perlu dikatakan, BiMap juga menggunakan sejumlah besar memori karena harus menyimpan peta terbalik di dalamnya. Jika Anda tertarik untuk mengetahui lebih banyak tentang BiMap , Anda dapat melihat tutorial ini.

6. Kesimpulan

Dalam artikel singkat ini, kita telah membahas beberapa metode untuk mengambil kunci Map yang diberi nilai. Setiap pendekatan memiliki pro dan kontra. Kita harus selalu mempertimbangkan kasus penggunaan dan memilih yang paling sesuai berdasarkan situasinya.

Kode sumber lengkap untuk tutorial di atas tersedia di GitHub.