1. Satu set pasangan nilai kunci.

Satu set pasangan nilai kunci

Di Jawa, satu lagi koleksi menarik (secara umum) ialah Map. Kadangkala struktur data ini juga dipanggil kamus.

Ia serupa dengan Setkoleksi, tetapi ia menyimpan satu set "pasangan" elemen dan bukannya satu set elemen, Setiap pasangan dalam a Mapterdiri daripada dua elemen: "kunci" dan "nilai".

Katakan anda mahu program anda menyimpan nama pekerja dan gaji mereka, atau nama rakan sekerja anda dan umur mereka. Kemudian anda memerlukan jadual seperti ini:

Nama Umur
Elon 21
Jeff 22
Bil 48
Warren ?

Setiap baris mengandungi beberapa nilai. Kami akan merujuk nama sebagai kunci pasangan , dan umur sebagai nilai pasangan .

Seluruh set pasangan ini ialah peta kami ( Map).

Kunci sepasang boleh menjadi apa-apa kecuali null. Kekunci mestilah unik: satu peta tidak boleh mengandungi dua kekunci yang sama.


2. HashMapkelas

Kelas HashMapadalah jenis Mapkoleksi yang paling popular. Di satu pihak, ia sangat serupa dengan HashSet dan mempunyai semua kaedahnya. Sebaliknya, ia seperti senarai ( ArrayList) yang boleh menggunakan perkataan (atau apa-apa sahaja) sebagai indeksnya.

Anda boleh membuat HashMapmenggunakan pernyataan seperti ini:

HashMap<KeyType, ValueType> name = new HashMap<KeyType, ValueType>();

Di manakah KeyTypejenis kunci dalam pasangan yang disimpan, dan ValueTypeialah jenis nilai dalam pasangan yang disimpan dalam HashMapkoleksi.

Kelas HashMapmempunyai kaedah seperti ini:

Kaedah Penerangan
void put(KeyType key, ValueType value)
Menambah pasangan ( key, value) pada koleksi
ValueType get(KeyType key)
Mengembalikan nilai yang dikaitkan dengan kunci.
boolean containsKey(KeyType key)
Menyemak sama ada kunci wujud dalam koleksi
boolean containsValue(ValueType value)
Menyemak kewujudan nilai dalam koleksi
ValueType remove(KeyType key)
Mengalih keluar elemen daripada koleksi
void clear()
Membersihkan koleksi, mengalih keluar semua elemen
int size()
Mengembalikan bilangan pasangan nilai kunci dalam koleksi
Set<KeyType> keySet()
Mengembalikan set kunci dalam koleksi
Collection<ValueType> values()
Mengembalikan set yang mengandungi elemen koleksi
Set<Map.Entry<KeyType, ValueType>> entrySet()
Mengembalikan set ( Set) semua pasangan ( Map.Entry) dalam koleksi.

Menambah elemen pada aHashMap

Elemen ditambah pada peta sebagai pasangan menggunakan put()kaedah. Kunci diluluskan sebagai hujah pertama, dan nilai diluluskan sebagai yang kedua.

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Apabila menambah pasangan nilai kunci, jika kunci sudah wujud dalam koleksi, maka nilai lama digantikan dengan nilai baharu.

Tingkah laku ini membuat HashMaptatasusunan seperti atau senarai yang indeksnya ialah perkataan ( String) dan bukannya nombor.

Penting:

Hampir semua jenis boleh menjadi KeyType atau ValueType. Terdapat beberapa keperluan tambahan kecil untuk KeyType, dan anda akan mempelajari tentangnya apabila anda mengkaji koleksi dengan lebih terperinci dalam pencarian Java Collections.



3. Subset a HashMap: set kekunci

Katakan kita hanya mahu memaparkan semua entri dalam a HashMappada skrin. Bagaimana kita melakukan ini? Untuk melakukan ini, kita perlu tahu bagaimana untuk melalui semua entri dalam HashMap. Ini boleh dilakukan dalam beberapa cara.

Cara paling mudah ialah melingkari kekunci

HashMapentri tidak dinomborkan secara berurutan, jadi gelung dengan pembilang tidak akan berfungsi di sini. Tetapi kita boleh mendapatkan satu set kunci menggunakan keySet()kaedah itu, dan anda sudah tahu cara untuk mengulangi satu set:

Kod Penerangan
HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}






Gelung pada kekunci map

Dapatkan nilai yang dikaitkan dengan kunci

Kaedah ini keySet()mengembalikan satu set kunci. Anda boleh menggunakan set ini dalam dua cara:

Notasi padat Notasi panjang
for (String key: map.keySet())
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}
Set<String> keys = map.keySet();

for (String key: keys)
{
   Integer value = map.get(key);
   System.out.println(key + " --> " + value);
}


4. Menggulung pada pasangan nilai kunci

Terdapat juga cara yang lebih rumit: anda boleh mengubah a Mapmenjadi set pasangan nilai kunci , dan kemudian gelungkan elemen set itu, seperti yang telah kita pelajari.

Koleksi ini HashMapmempunyai kelas pembantu yang menyimpan pasangan nilai kunci. Ia kelihatan lebih kurang seperti ini:

class Entry<KeyType, ValueType>
{
   private KeyType key;
   private ValueType value;

   public KeyType getKey()
   {
      return this.key;
   }

   public ValueType getValue()
   {
      return this.value;
   }
}

Hasil daripada memanggil entrySet()kaedah pada objek akan menjadi :HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

Set<Entry<KeyType, ValueType>> name = map.entrySet();

Di sini kita mempunyai Setkelas generik dengan parameter jenis, yang seterusnya ialah jenis generik ( Entry) dengan dua parameter jenis.

Sangat mudah bagi pemula untuk keliru tentang perkara ini. Tetapi sebaik sahaja anda memikirkannya, anda boleh menulis kod seperti:

HashMap<String, Integer> map = new HashMap<String, Integer>();
map.put("Elon", 21);
map.put("Jeff", 22);
map.put("Bill", 48);
map.put("Warren", null);

Set<Map.Entry<String, Integer>> entries = map.entrySet();
for(Map.Entry<String, Integer> pair: entries)
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Yang berkata, kod ini boleh dipermudahkan sedikit:

Mula-mula, anda boleh melangkau membuat pembolehubah berasingan untuk entriesdan sebaliknya memanggil entrySet()kaedah terus di dalam forgelung:

for(Map.Entry<String, Integer> pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Kedua, anda boleh menggunakan varoperator yang diperkenalkan baru-baru ini untuk membuat kesimpulan secara automatik jenis pasangan nilai kunci :

for(var pair: map.entrySet())
{
   String key = pair.getKey();
   Integer value = pair.getValue();
   System.out.println(key + " --> " + value);
}

Tidak teruk, eh?



5. Perbandingan ArrayListdanHashMap

A HashMapsangat menyerupai ArrayListyang membolehkan rentetan (atau jenis lain) digunakan sebagai indeks (kunci).

Jika anda menggunakan Integeruntuk kekunci dalam HashMap, maka ia menjadi lebih serupa dengan ArrayList. Mari bandingkan:

Kod dengan ArrayList<String> Kod dengan HashMap<Integer, String>
ArrayList<String> list = new ArrayList<String>();

list.add("Greetings");
list.add("Hello");

String s = list.get(0);
list.set(0, s + "!");

for (String item: list)
{
   System.out.println(item);
}
HashMap<Integer, String> map = new HashMap<Integer, String>();

map.put(0, "Greetings");
map.put(1, "Hello");

String s = map.get(0);
map.put(0, s + "!");

for (String item: map.values())
{
   System.out.println(item);
}