1. ชุดของคู่คีย์-ค่า

ชุดของคู่คีย์-ค่า

ใน Java คอลเล็กชันอื่นที่น่าสนใจ (พูดกว้างๆ) คือMap. บางครั้งโครงสร้างข้อมูลนี้เรียกอีกอย่างว่าพจนานุกรม

คล้ายกับSetคอลเลกชัน แต่จัดเก็บชุดของ "คู่" ขององค์ประกอบมากกว่าชุดขององค์ประกอบ แต่ละคู่ใน a Mapประกอบด้วยสององค์ประกอบ: "คีย์" และ "ค่า"

สมมติว่าคุณต้องการให้โปรแกรมจัดเก็บชื่อพนักงานและเงินเดือน หรือชื่อเพื่อนร่วมงานและอายุของพนักงาน จากนั้นคุณจะต้องมีตารางดังนี้:

ชื่อ อายุ
อีลอน 21
เจฟฟ์ 22
ใบแจ้งหนี้ 48
วอร์เรน ?

แต่ละแถวมีค่าสองสามค่า เราจะอ้างถึงชื่อเป็นคีย์ ของคู่ และอายุเป็นค่า ของ คู่

ทั้งชุดของคู่นี้คือแผนที่ ของเรา ( Map)

คีย์ของคู่สามารถเป็นอะไรก็ได้nullยกเว้น คีย์ต้องไม่ซ้ำกัน: หนึ่งแผนที่ไม่สามารถมีคีย์ที่เหมือนกันสองคีย์ได้


2. HashMapชั้นเรียน

ชั้น เป็น คอลเลกชันHashMapที่ได้รับความนิยมมากที่สุด Mapในอีกด้านหนึ่ง มันคล้ายกับ HashSet และมีวิธีการทั้งหมด ในทางกลับกัน มันเหมือนกับรายการ ( ArrayList) ที่สามารถใช้คำ (หรืออย่างอื่น) เป็นดัชนีได้

คุณสามารถสร้างHashMapโดยใช้คำสั่งดังนี้:

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

KeyTypeประเภทของคีย์ในคู่ที่จัดเก็บอยู่ที่ไหน และ ValueTypeเป็นประเภทของค่าในคู่ที่จัดเก็บไว้ในHashMapคอลเลกชัน

คลาสHashMapมีเมธอดดังนี้:

วิธี คำอธิบาย
void put(KeyType key, ValueType value)
เพิ่มคู่ ( key, value) ลงในคอลเลกชัน
ValueType get(KeyType key)
ส่งกลับค่าที่เกี่ยวข้องกับคีย์
boolean containsKey(KeyType key)
ตรวจสอบว่ามีคีย์อยู่ในคอลเลกชันหรือไม่
boolean containsValue(ValueType value)
ตรวจสอบการมีอยู่ของค่าในคอลเลกชัน
ValueType remove(KeyType key)
ลบองค์ประกอบออกจากคอลเลกชัน
void clear()
ล้างคอลเลกชัน ลบองค์ประกอบทั้งหมด
int size()
ส่งกลับจำนวนคู่ของคีย์-ค่าในคอลเลกชัน
Set<KeyType> keySet()
ส่งกลับชุดของคีย์ในคอลเลกชัน
Collection<ValueType> values()
ส่งกลับชุดที่มีองค์ประกอบของคอลเลกชัน
Set<Map.Entry<KeyType, ValueType>> entrySet()
ส่งกลับชุด ( Set) ของทุกคู่ ( Map.Entry) ในคอลเลกชัน

การเพิ่มองค์ประกอบให้กับ aHashMap

องค์ประกอบจะถูกเพิ่มลงในแผนที่เป็นคู่โดยใช้put()เมธอด คีย์ถูกส่งผ่านเป็นอาร์กิวเมนต์แรก และค่าจะถูกส่งเป็นอาร์กิวเมนต์ที่สอง

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

เมื่อเพิ่มคู่คีย์-ค่า หากมีคีย์อยู่แล้วในคอลเล็กชัน ค่าเก่าจะถูกแทนที่ด้วยค่าใหม่

ลักษณะการทำงานนี้ทำให้HashMapเหมือนอาร์เรย์หรือรายการที่มีดัชนีเป็นคำ ( String) แทนที่จะเป็นตัวเลข

สำคัญ:

เกือบทุกประเภทสามารถเป็น KeyType หรือ ValueType ได้ มีข้อกำหนดเพิ่มเติมเล็กน้อยสำหรับ KeyType และคุณจะได้เรียนรู้เกี่ยวกับข้อกำหนดเหล่านี้เมื่อคุณศึกษาคอลเลกชันโดยละเอียดยิ่งขึ้นในภารกิจ Java Collections



3. ส่วนย่อยของ a HashMap: ชุดของคีย์

สมมติว่าเราต้องการแสดงรายการทั้งหมดใน a HashMapบนหน้าจอ เราจะทำเช่นนี้ได้อย่างไร? ในการทำเช่นนี้ เราจำเป็นต้องรู้วิธีผ่านรายการทั้งหมดในไฟล์HashMap. สามารถทำได้หลายวิธี

วิธีที่ง่ายที่สุดคือการคล้องกุญแจ

HashMapรายการไม่ได้เรียงเลขตามลำดับ ดังนั้นการวนซ้ำด้วยตัวนับจะไม่ทำงานที่นี่ แต่เราสามารถรับชุดของคีย์โดยใช้keySet()เมธอด และคุณรู้วิธีวนซ้ำชุดแล้ว:

รหัส คำอธิบาย
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);
}






วนซ้ำคีย์ของmap

รับค่าที่เกี่ยวข้องกับคีย์

เมธอดkeySet()ส่งคืนชุดของคีย์ คุณสามารถใช้ชุดนี้ได้สองวิธี:

สัญกรณ์กะทัดรัด สัญกรณ์ยาว
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. การวนซ้ำคู่คีย์-ค่า

นอกจากนี้ยังมีวิธีที่ซับซ้อนกว่านั้น: คุณสามารถแปลง a Mapเป็นชุดของคู่คีย์-ค่าแล้ววนซ้ำองค์ประกอบของชุดดังที่เราได้เรียนรู้ไปแล้ว

คอHashMapลเลกชันมีคลาสตัวช่วยที่เก็บคู่คีย์-ค่า มีลักษณะประมาณนี้:

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

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

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

ผลลัพธ์ของการเรียกใช้entrySet()เมธอดบนวัตถุจะเป็น:HashMap<KeyType, ValueType>Set<Entry<KeyType, ValueType>>

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

ที่นี่เรามีSetคลาสทั่วไปที่มีพารามิเตอร์ประเภท ซึ่งจะเป็นประเภททั่วไป ( Entry) ที่มีพารามิเตอร์สองประเภท

มันง่ายมากสำหรับผู้เริ่มต้นที่จะสับสนเกี่ยวกับเรื่องนี้ แต่เมื่อคุณเข้าใจแล้ว คุณสามารถเขียนโค้ดได้ดังนี้:

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);
}

ที่กล่าวว่ารหัสนี้สามารถทำให้ง่ายขึ้นเล็กน้อย:

ขั้นแรก คุณสามารถข้ามการสร้างตัวแปรแยกต่างหากสำหรับentriesและเรียกใช้entrySet()เมธอดโดยตรงภายในforลูปแทน:

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

ประการที่สอง คุณสามารถใช้varโอเปอเรเตอร์ที่เพิ่งเปิดตัวเพื่อสรุปประเภทของคู่คีย์-ค่า โดยอัตโนมัติ :

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

ไม่เลวใช่มั้ย



5. การเปรียบเทียบArrayListและHashMap

คล้ายHashMapกับArrayListที่ช่วยให้สตริง (หรือประเภทอื่น ๆ ) ใช้เป็นดัชนี (คีย์)

หากคุณใช้Integerสำหรับปุ่มใน a HashMapมันจะยิ่งคล้ายกับไฟล์ArrayList. ลองเปรียบเทียบ:

รหัสด้วย ArrayList<String> รหัสที่มี 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);
}