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
มีเมธอดดังนี้:
วิธี | คำอธิบาย |
---|---|
|
เพิ่มคู่ ( key , value ) ลงในคอลเลกชัน |
|
ส่งกลับค่าที่เกี่ยวข้องกับคีย์ |
|
ตรวจสอบว่ามีคีย์อยู่ในคอลเลกชันหรือไม่ |
|
ตรวจสอบการมีอยู่ของค่าในคอลเลกชัน |
|
ลบองค์ประกอบออกจากคอลเลกชัน |
|
ล้างคอลเลกชัน ลบองค์ประกอบทั้งหมด |
|
ส่งกลับจำนวนคู่ของคีย์-ค่าในคอลเลกชัน |
|
ส่งกลับชุดของคีย์ในคอลเลกชัน |
|
ส่งกลับชุดที่มีองค์ประกอบของคอลเลกชัน |
|
ส่งกลับชุด ( 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()
เมธอด และคุณรู้วิธีวนซ้ำชุดแล้ว:
รหัส | คำอธิบาย |
---|---|
|
วนซ้ำคีย์ของ map รับค่าที่เกี่ยวข้องกับคีย์ |
เมธอดkeySet()
ส่งคืนชุดของคีย์ คุณสามารถใช้ชุดนี้ได้สองวิธี:
สัญกรณ์กะทัดรัด | สัญกรณ์ยาว |
---|---|
|
|
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> |
---|---|
|
|