Map<Integer, String> map = new HashMap<>();
map.put(1, "string 1");
map.put(2, "string 2");
map.put(3, "string 3");
และนี่คือวิธีรับค่าด้วยคีย์:
String string1 = map.get(1);
String string2 = map.get(2);
String string3 = map.get(3);
หากทั้งหมดที่กล่าวมาข้างต้นมีความชัดเจน เรามาตอบคำถามยอดนิยมกันต่อ!
0. วิธีวนซ้ำค่าแผนที่ทั้งหมด
การวนซ้ำค่าเป็นการดำเนินการทั่วไปที่คุณดำเนินการกับแผนที่ คู่คีย์-ค่าทั้งหมดจะถูกจัดเก็บไว้ในอินเทอร์เฟซ Map.Entry ภายใน และเพื่อให้ได้มาซึ่งคุณจะต้องเรียกใช้entrySet()
. มันจะส่งคืนชุดของคู่ที่สามารถวนซ้ำได้:
for(Map.Entry<Integer, String> entry: map.entrySet()) {
// get key
Integer key = entry.getKey();
// get value
String value = entry.getValue();
}
Или используя итератор:
Iterator<Map.Entry<Integer, String>> itr = map.entrySet().iterator();
while(itr.hasNext()) {
Map.Entry<Integer, String> entry = itr.next();
// get key
Integer key = entry.getKey();
// get value
String value = entry.getValue();
}
1. วิธีแปลงแผนที่เป็นรายการ
อินเทอร์เฟซแผนที่มี 3 วิธีที่ส่งคืนรายการองค์ประกอบ:- keySet() - ส่งคืนชุดคีย์;
- ค่า () - ส่งกลับชุดของค่า;
- entrySet() - ส่งคืนชุดของชุดคีย์-ค่า
ArrayList
คุณจะสังเกตเห็นว่ามีตัวสร้างที่มีอาร์กิวเมนต์ประเภท Collection เนื่องจาก Set เป็นลูกหลานของ Collection ผลลัพธ์ของวิธีการข้างต้นทั้งหมดจึงสามารถส่งผ่านไปยัง Constructor ของคลาสArrayList
ได้ ดังนั้นเราจะสร้างรายการใหม่และเติมค่าจากMap
:
// key list
List<Integer> keyList = new ArrayList<>(map.keySet());
// value list
List<String> valueList = new ArrayList<>(map.values());
// key-value list
List<Map.Entry<Integer, String>> entryList = new ArrayList<>(map.entrySet());
2. วิธีจัดเรียงคีย์แผนที่
การเรียงลำดับแผนที่ยังเป็นการดำเนินการที่ค่อนข้างธรรมดาในการเขียนโปรแกรม คุณสามารถทำได้หลายวิธี:-
ใส่ Map.Entry ลงในรายการและจัดเรียงโดยใช้ Comparator
ในตัวเปรียบเทียบเราจะเปรียบเทียบเฉพาะคีย์ของคู่:
List
> list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() { @Override public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) { return o1.getKey() - o2.getKey(); } }); หากคุณเข้าใจ lambdas รายการนี้สามารถย่อให้สั้นลงได้มาก:
Collections.sort(list, Comparator.comparingInt(Map.Entry::getKey));
-
ใช้
SortedMap
หรือถ้าให้เจาะจงกว่านั้นคือ การนำไปใช้งานTreeMap
ซึ่งใช้ Comparator ในตัวสร้าง ตัวเปรียบเทียบนี้จะนำไปใช้กับคีย์แผนที่ ดังนั้นคีย์จะต้องเป็นคลาสที่ใช้อินเทอร์เฟซComparable
:SortedMap<Integer, String> sortedMap = new TreeMap<>(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1 - o2; } });
และแน่นอน ทุกอย่างสามารถเขียนใหม่ได้โดยใช้ lambdas:
SortedMap<Integer, String> sortedMap = new TreeMap<>(Comparator.comparingInt(o -> o));
ไม่เหมือนกับวิธีแรก การใช้ SortedMap เราจะจัดเก็บข้อมูลในรูปแบบที่เรียงลำดับเสมอ
3. วิธีจัดเรียงค่าแผนที่
ที่นี่คุณควรใช้แนวทางที่คล้ายกับวิธีแรกสำหรับคีย์ - รับรายการค่าและจัดเรียงในรายการ:List <Map.Entry<Integer, String>> valuesList = new ArrayList(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Integer, String>>() {
@Override
public int compare(Map.Entry<Integer, String> o1, Map.Entry<Integer, String> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
และแลมบ์ดาสำหรับสิ่งนี้จะมีลักษณะดังนี้:
Collections.sort(list, Comparator.comparing(Map.Entry::getValue));
4. อะไรคือความแตกต่างระหว่าง HashMap, TreeMap และ Hashtable
ตามที่กล่าวไว้ก่อนหน้านี้ มีการใช้งานหลัก 3 ประการของอินเทอร์เฟซแผนที่ แต่ละคนมีลักษณะเฉพาะของตัวเอง:-
ลำดับขององค์ประกอบ
HashMap
และHashtable
ไม่รับประกันว่ารายการต่างๆ จะถูกจัดเก็บตามลำดับที่เพิ่มเข้ามา นอกจากนี้ ยังไม่รับประกันว่าลำดับขององค์ประกอบจะไม่เปลี่ยนแปลงเมื่อเวลาผ่านไป ในทางกลับกันTreeMap
จะรับประกันการจัดเก็บองค์ประกอบตามลำดับที่เพิ่มหรือตามตัวเปรียบเทียบที่กำหนด -
ค่าที่ถูกต้อง
HashMap
ช่วยให้คุณมีคีย์และค่าว่างHashTable
ได้ TreeMap สามารถใช้ค่า Null ได้หากตัวเปรียบเทียบอนุญาตเท่านั้น หากไม่ใช้ตัวเปรียบเทียบ (โดยการจัดเก็บคู่ตามลำดับที่เพิ่ม) จะไม่อนุญาตให้มีค่า null -
การซิงโครไนซ์ ซิงโครไนซ์ เท่านั้น
HashTable
ส่วนที่เหลือไม่ได้ หากเธรดอื่นไม่สามารถเข้าถึงแผนที่ได้ ขอแนะนำให้ใช้ HashMap แทน HashTable
แฮชแมป | แฮชเทเบิล | ทรีแมป | |
---|---|---|---|
ลำดับขององค์ประกอบ | เลขที่ | เลขที่ | ใช่ |
null เป็นค่า | ใช่ | เลขที่ | ไม่เชิง |
ความปลอดภัยของด้าย | เลขที่ | ใช่ | เลขที่ |
ความซับซ้อนของอัลกอริทึมในการค้นหาองค์ประกอบ | โอ(1) | โอ(1) | O(บันทึก n) |
โครงสร้างข้อมูลภายใต้ประทุน | ตารางแฮช | ตารางแฮช | ต้นไม้สีแดงดำ |
5. วิธีสร้างแผนที่แบบสองทิศทาง
บางครั้งจำเป็นต้องใช้โครงสร้างข้อมูลที่ทั้งคีย์และค่าจะไม่ซ้ำกัน กล่าวคือ แผนที่จะมีคู่คีย์-คีย์ โครงสร้างข้อมูลนี้ช่วยให้คุณสร้าง "มุมมอง/การค้นหาแบบกลับหัว" บนแผนที่ได้ นั่นคือ เราสามารถค้นหาคีย์ได้จากค่าของมัน โครงสร้างข้อมูลนี้เรียกว่าแผนที่แบบสองทิศทาง ซึ่งน่าเสียดายที่ JDK ไม่รองรับ แต่โชคดีที่การใช้งานสามารถพบได้ในไลบรารี Apache Common Collections หรือ Guava ที่นั่นเรียกว่า BidiMap และ BiMap ตามลำดับ การใช้งานเหล่านี้กำหนดข้อจำกัดเกี่ยวกับเอกลักษณ์ของคีย์และค่า สิ่งนี้สร้างความสัมพันธ์แบบหนึ่งต่อหนึ่ง6. วิธีสร้างแผนที่เปล่า
มีสองวิธีในการสร้างแผนที่เปล่า:-
การเริ่มต้นวัตถุปกติ:
Map<Integer, String> emptyMap = new HashMap<>();
-
การสร้างแผนที่ว่างที่ไม่เปลี่ยนรูป:
Map<Integer, String> emptyMap = Collections.emptyMap();
UnsupportedOperationException
ข้อยกเว้น ในบทความนี้ เราได้ดูคำถามที่พบบ่อยที่สุดที่คุณอาจมีเมื่อใช้อินเทอร์เฟซแผนที่
มีอะไรให้อ่านอีก: |
---|
GO TO FULL VERSION