1. Gambaran keseluruhan
Peta adalah salah satu struktur data yang paling umum di Java, dan String adalah salah satu jenis yang paling umum untuk kunci peta. Secara lalai, peta seperti ini mempunyai kunci peka huruf besar kecil.
Dalam tutorial ringkas ini, kita akan meneroka pelbagai penerapan Peta yang menerima semua variasi kes String sebagai kunci yang sama .
2. Lihat Peta dengan Lebih Dekat dengan Kekunci Tidak Sensitif Kes
Mari kita kaji masalah yang cuba kita selesaikan dengan lebih terperinci.
Katakan kita mempunyai Peta dengan satu entri:

Mari tambahkan entri seterusnya:
map.put("ABC", 2);
Apabila bekerja dengan Peta dengan kunci peka huruf besar kecil, kami akan mempunyai dua entri:

Tetapi apabila bekerja dengan Peta dengan kunci tidak peka huruf besar kecil, kandungannya adalah:

Dalam contoh seterusnya, kami akan menyelidiki pelaksanaan peka huruf besar-kecil dari beberapa implementasi Peta yang popular : TreeMap , HashMap , dan LinkedHashMap .
3. Peta Pokok
TreeMap adalah implementasi NavigableMap , yang bermaksud bahawa ia selalu menyusun entri setelah memasukkan, berdasarkan Comparator tertentu . Juga, TreeMap menggunakan Comparator untuk mencari jika kunci yang dimasukkan adalah salinan atau yang baru.
Oleh itu, jika kami menyediakan String Comparator yang tidak peka huruf besar-kecil , kami akan mendapat TreeMap yang tidak peka huruf besar kecil .
Nasib baik, String sudah menyediakan Perbandingan statik ini :
public static final Comparator CASE_INSENSITIVE_ORDER
yang boleh kami sediakan dalam pembina:
Map treeMap = new TreeMap(String.CASE_INSENSITIVE_ORDER); treeMap.put("abc", 1); treeMap.put("ABC", 2);
Dan sekarang, ketika kita menjalankan ujian, kita dapat melihat bahawa ukuran Peta adalah satu:
assertEquals(1, treeMap.size());
dan nilainya dikemas kini kepada 2:
assertEquals(2, treeMap.get("aBc").intValue()); assertEquals(2, treeMap.get("ABc").intValue());
Sekarang mari kita hapus entri, menggunakan String yang sama , tetapi dengan kes lain:
treeMap.remove("aBC"); assertEquals(0, treeMap.size());
Kita harus ingat bahawa fungsi seperti meletakkan dan mendapatkan kos rata-rata O (log n) untuk TreeMap berbanding dengan HashMap yang menyediakan penyisipan dan pencarian O (1).
Perlu juga diperhatikan bahawa TreeMap tidak membenarkan kunci kosong .
4. Peta KesInsensitif Apache
Apache's Commons-Collections adalah perpustakaan Java yang sangat popular, menyediakan sebilangan besar kelas berguna dengan CaseInsensitiveMap di antaranya.
CaseInsensitiveMap adalah Peta berdasarkan hash , yang menukar kunci menjadi huruf kecil sebelum ditambahkan atau diambil. Tidak seperti TreeMap , CaseInsensitiveMap membolehkanmemasukkan kunci kosong .
Pertama, kita perlu menambahkan kebergantungan commons-collections4 :
org.apache.commons commons-collections4 4.4
Sekarang, kita dapat menggunakan CaseInsensitiveMap dan menambahkan dua entri:
Map commonsHashMap = new CaseInsensitiveMap(); commonsHashMap.put("abc", 1); commonsHashMap.put("ABC", 2);
Semasa kami mengujinya, kami menjangkakan hasil yang sama seperti yang kami lihat sebelumnya:
assertEquals(1, commonsHashMap.size()); assertEquals(2, commonsHashMap.get("aBc").intValue()); assertEquals(2, commonsHashMap.get("ABc").intValue()); commonsHashMap.remove("aBC"); assertEquals(0, commonsHashMap.size());
5. Peta LinkedCaseInsensitive Spring
Spring Core adalah modul Spring Framework yang juga menyediakan kelas utiliti, termasuk LinkedCaseInsensitiveMap .
LinkedCaseInsensitiveMap membungkus LinkedHashMap , yang merupakan Peta berdasarkan jadual hash dan senarai terpaut. Tidak seperti LinkedHashMap , ia tidak membenarkan memasukkan kunci kosong . LinkedCaseInsensitiveMap mengekalkan susunan asal serta casing kekunci asal sambil membenarkan fungsi panggilan seperti mendapatkan dan mengeluarkan dengan mana-mana kes.
Pertama, mari tambah pergantungan teras musim bunga :
org.springframework spring-core 5.2.5.RELEASE
Sekarang, kita boleh menginisialisasi LinkedCaseInsensitiveMap baru :
Map linkedHashMap = new LinkedCaseInsensitiveMap(); linkedHashMap.put("abc", 1); linkedHashMap.put("ABC", 2);
tambah ujiannya:
assertEquals(1, linkedHashMap.size()); assertEquals(2, linkedHashMap.get("aBc").intValue()); assertEquals(2, linkedHashMap.get("ABc").intValue()); linkedHashMap.remove("aBC"); assertEquals(0, linkedHashMap.size());
6. Kesimpulannya
Dalam tutorial ini, kami telah melihat cara yang berbeza untuk membuat Peta Java dengan kunci tidak peka huruf besar dan menggunakan kelas yang berbeza untuk memperolehnya.
Seperti biasa, kodnya tersedia di GitHub.