Dapatkan Kunci Nilai dari Peta Java

1. Pengenalan

Dalam tutorial ringkas ini, kita akan menunjukkan tiga pendekatan yang berbeza untuk mengambil kunci dari peta untuk nilai tertentu. Kami juga akan membincangkan positif dan negatif dari pelbagai penyelesaian.

Untuk mengetahui lebih lanjut mengenai antara muka Peta , anda boleh membaca artikel ini.

2. Pendekatan Iteratif

The Peta muka Collections Java menawarkan satu kaedah yang dipanggil entrySet () . Ia mengembalikan semua entri atau pasangan nilai-kunci peta dalam Set .

Ideanya adalah untuk melakukan iterasi pada set entri ini dan mengembalikan kunci yang nilainya sepadan 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, ada kemungkinan beberapa kunci menunjukkan nilai yang sama.

Dalam kes itu, jika terdapat nilai yang sepadan, kami menambahkan kunci ke Set dan meneruskan gelung. Pada akhirnya, kami mengembalikan Set yang mengandungi 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; }

Walaupun ini adalah pelaksanaan yang sangat lurus, ia membandingkan semua entri walaupun semua pertandingan dijumpai setelah beberapa kali lelaran.

3. Pendekatan Berfungsi

Dengan pengenalan Lambda Expressions di Java 8, kita dapat melakukannya dengan cara yang lebih fleksibel dan mudah dibaca. Kami menukar set kemasukan ke Aliran dan menyediakan lambda untuk menyaring hanya entri dengan nilai yang diberikan.

Kemudian kami menggunakan kaedah peta untuk mengembalikan Aliran kunci dari entri yang disaring:

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

Kelebihan mengembalikan aliran adalah dapat memenuhi pelbagai keperluan pelanggan. Kod panggilan mungkin hanya memerlukan satu kekunci atau semua kekunci yang menunjukkan nilai yang diberikan. Oleh kerana penilaian aliran menjadi malas, pelanggan dapat mengawal jumlah lelaran berdasarkan keperluannya.

Selain itu, pelanggan boleh menukar aliran ke koleksi apa pun menggunakan pengumpul 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

Idea di atas tidak akan sangat berguna jika kita perlu memanggil fungsi dengan kerap untuk peta tertentu . Ia tidak perlu berulang kali menetapkan kuncinya berulang kali.

Dalam senario ini, mengekalkan peta nilai lain pada kunci akan lebih masuk akal kerana akan memerlukan masa yang berterusan untuk mengambil kunci nilai.

The Commons Koleksi perpustakaan oleh Apache menyediakan dengan apa-dua arah Peta dipanggil BidiMap . Ia mempunyai kaedah bernama getKey () untuk mengambil kunci untuk nilai tertentu:

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

Walau bagaimanapun, BidiMap memaksakan hubungan 1: 1 antara kunci dan nilainya . Sekiranya kita cuba meletakkan pasangan nilai-kunci yang nilainya sudah ada di Peta, ia akan menghilangkan entri lama. Dengan kata lain, ia mengemas kini kunci terhadap nilai.

Ia juga memerlukan memori yang lebih banyak untuk menyimpan peta terbalik.

Maklumat lebih lanjut mengenai cara menggunakan BidiMap terdapat dalam tutorial ini.

5. Menggunakan Jambu Batu Google

Kami mungkin menggunakan Peta dua arah lain yang disebut BiMap yang terdapat di Jambu yang dikembangkan oleh Google. Kelas ini menyediakan kaedah bernama invers () 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 membenarkan beberapa kunci merujuk kepada nilai yang sama . Jika kita cuba untuk membuat apa-apa usaha, ia melemparkan java.lang.IllegalArgumentException .

Tidak perlu dikatakan, BiMap juga menggunakan sejumlah besar memori kerana menyimpan peta terbalik di dalamnya. Sekiranya anda berminat untuk mengetahui lebih lanjut mengenai BiMap , anda boleh melihat tutorial ini.

6. Kesimpulannya

Dalam artikel ringkas ini, kami telah membincangkan beberapa kaedah untuk mendapatkan kunci Peta yang diberi nilainya. Setiap pendekatan mempunyai kebaikan dan keburukannya sendiri. Kita harus selalu mempertimbangkan kes penggunaan dan memilih yang paling sesuai berdasarkan keadaan.

Kod sumber lengkap untuk tutorial di atas boleh didapati di GitHub.