TreeMap: คู่คีย์-ค่าที่เรียงลำดับ
ใช้ TreeMap รักษาลำดับการเรียง และนำทางด้วย firstKey, lastKey, floorKey และ ceilingKey
TreeMap: คู่คีย์-ค่าที่เรียงลำดับ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
TreeMap คืออะไร
TreeMap เป็นการนำแผนที่ที่เรียงลำดับไปใช้งาน โดยมีต้นไม้แดง-ดำเป็นโครงสร้างเบื้องหลัง คีย์จะถูกจัดเก็บในลำดับธรรมชาติจากน้อยไปมาก (หรือตามลำดับของตัวเปรียบเทียบแบบกำหนดเอง) การดำเนินการพื้นฐานทั้งหมดใช้เวลา O(log n)
import java.util.TreeMap;
TreeMap<String, Integer> scores = new TreeMap<>();
scores.put("Charlie", 85);
scores.put("Alice", 92);
scores.put("Bob", 78);
// Iteration is in key order: Alice, Bob, Charlie
for (var entry : scores.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}firstKey, lastKey, floorKey, ceilingKey
อินเทอร์เฟซ NavigableMap ของ TreeMap เปิดให้ใช้เมธอดสำหรับค้นหาคีย์ที่มีความสัมพันธ์กับค่าที่กำหนด:
TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "ten"); map.put(20, "twenty"); map.put(30, "thirty"); map.put(40, "forty");
System.out.println(map.firstKey()); // 10
System.out.println(map.lastKey()); // 40
System.out.println(map.floorKey(25)); // 20 (largest key ≤ 25)
System.out.println(map.ceilingKey(25)); // 30 (smallest key ≥ 25)
System.out.println(map.lowerKey(20)); // 10 (strictly less)
System.out.println(map.higherKey(20)); // 30 (strictly greater)การนำทางระหว่างรายการ
floorEntry, ceilingEntry, firstEntry และ lastEntry คืน Map.Entry ทั้งรายการ แทนที่จะคืนเฉพาะคีย์:
TreeMap<Integer, String> prices = new TreeMap<>();
prices.put(100, "Budget"); prices.put(300, "Standard"); prices.put(700, "Premium");
var entry = prices.floorEntry(350);
System.out.println(entry.getKey() + ": " + entry.getValue()); // 300: Standard
var top = prices.lastEntry();
System.out.println(top.getValue()); // PremiumsubMap, headMap, tailMap
แยกมุมมองตามช่วงออกจาก TreeMap มุมมองเหล่านี้เชื่อมโยงกับแผนที่ต้นฉบับ ดังนั้นการเปลี่ยนแปลงในฝั่งหนึ่งจะแสดงในอีกฝั่งหนึ่งด้วย
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i, "v"+i);
// Keys from 3 (inclusive) to 7 (exclusive)
System.out.println(map.subMap(3, 7)); // {3=v3, 4=v4, 5=v5, 6=v6}
// Keys strictly less than 5
System.out.println(map.headMap(5)); // {1=v1, 2=v2, 3=v3, 4=v4}
// Keys >= 7
System.out.println(map.tailMap(7)); // {7=v7, 8=v8, 9=v9, 10=v10}ขอบเขตแบบรวมและไม่รวม
ใช้รูปแบบเมธอดที่มีอาร์กิวเมนต์เพิ่มเติมเพื่อควบคุมขอบเขตอย่างละเอียด:
TreeMap<Integer, String> map = new TreeMap<>();
for (int i = 1; i <= 10; i++) map.put(i*10, "v"+i);
// From 30 (inclusive) to 60 (inclusive)
System.out.println(map.subMap(30, true, 60, true));
// {30=v3, 40=v4, 50=v5, 60=v6}ลำดับย้อนกลับ
ใช้ descendingMap() หรือ descendingKeySet() เพื่อวนซ้ำคีย์ในลำดับย้อนกลับ:
TreeMap<String, Integer> tm = new TreeMap<>();
tm.put("A", 1); tm.put("C", 3); tm.put("B", 2);
for (String key : tm.descendingKeySet()) {
System.out.print(key + " "); // C B A
}pollFirstEntry และ pollLastEntry
ลบและคืนรายการแรกหรือรายการสุดท้ายแบบเป็นอะตอมิก — มีประโยชน์สำหรับสร้างแผนที่ตามลำดับความสำคัญ:
TreeMap<Integer, String> events = new TreeMap<>();
events.put(8, "Breakfast");
events.put(12, "Lunch");
events.put(18, "Dinner");
var first = events.pollFirstEntry(); // removes 8=Breakfast
System.out.println(first.getValue() + " removed");
System.out.println(events.firstKey()); // 12กรณีใช้งาน: กระดานจัดอันดับ
กระดานจัดอันดับต้องจัดเรียงผู้เล่นตามคะแนน TreeMap จะจัดเรียงตามคีย์โดยอัตโนมัติ:
TreeMap<Integer, String> leaderboard = new TreeMap<>(Comparator.reverseOrder());
leaderboard.put(1200, "Alice");
leaderboard.put(1500, "Bob");
leaderboard.put(900, "Carol");
int rank = 1;
for (var e : leaderboard.entrySet()) {
System.out.println(rank++ + ". " + e.getValue() + " (" + e.getKey() + ")");
}
// 1. Bob (1500)
// 2. Alice (1200)
// 3. Carol (900)กรณีใช้งาน: ตัวจัดตารางเหตุการณ์
จับคู่เวลาประทับกับเหตุการณ์ — ใช้ ceilingEntry เพื่อค้นหาเหตุการณ์ถัดไปที่กำหนดเวลาไว้หลังเวลาที่ระบุ:
import java.time.LocalTime;
TreeMap<LocalTime, String> schedule = new TreeMap<>();
schedule.put(LocalTime.of(9,0), "Standup");
schedule.put(LocalTime.of(14,0), "Review");
schedule.put(LocalTime.of(17,0), "Retro");
LocalTime now = LocalTime.of(11, 30);
var next = schedule.ceilingEntry(now);
System.out.println("Next: " + next.getValue()); // Reviewประสิทธิภาพของ TreeMap เทียบกับ HashMap
การเปรียบเทียบที่สำคัญ:
- HashMap: get/put ใช้เวลาเฉลี่ย O(1); ไม่มีการจัดลำดับ
- TreeMap: get/put ใช้เวลา O(log n); จัดเรียงตามคีย์
- LinkedHashMap: ใช้เวลาเฉลี่ย O(1); จัดเรียงตามลำดับการแทรก
ใช้ TreeMap เมื่อจำเป็นต้องใช้คีย์ที่เรียงลำดับหรือการค้นหาตามช่วง HashMap ทำงานเร็วกว่าเมื่อค้นหาคีย์แบบง่าย
ความปลอดภัยต่อการทำงานหลายเธรด
TreeMap ไม่ปลอดภัยต่อการทำงานหลายเธรด สำหรับการเข้าถึงพร้อมกัน ให้ใช้ ConcurrentSkipListMap ซึ่งยังคงรักษาลำดับที่เรียงไว้ พร้อมการดำเนินการที่ใช้เวลา O(log n) และรองรับการอ่าน/เขียนพร้อมกัน
ตรวจสอบความเข้าใจ
คุณมี TreeMap<Integer, String> ที่มีคีย์ {10, 20, 30, 40} map.floorKey(25) จะคืนค่าใด
สรุป: TreeMap
ประเด็นสำคัญ:
- TreeMap รักษาคีย์ให้อยู่ในลำดับที่เรียงไว้ (จากน้อยไปมาก) ด้วยต้นไม้แดง-ดำ
- การดำเนินการทั้งหมดใช้เวลา O(log n)
- การนำทาง: firstKey, lastKey, floorKey, ceilingKey, lowerKey, higherKey
- มุมมองตามช่วง: subMap, headMap, tailMap (มุมมองที่เชื่อมโยงกับแผนที่ต้นฉบับ)
- ใช้ ConcurrentSkipListMap สำหรับแผนที่ที่เรียงลำดับและปลอดภัยต่อการทำงานหลายเธรด
คำถามที่พบบ่อย
บทเรียน “TreeMap: คู่คีย์-ค่าที่เรียงลำดับ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “TreeMap: คู่คีย์-ค่าที่เรียงลำดับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “TreeMap: คู่คีย์-ค่าที่เรียงลำดับ”
ใช้ TreeMap รักษาลำดับการเรียง และนำทางด้วย firstKey, lastKey, floorKey และ ceilingKey คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “TreeMap: คู่คีย์-ค่าที่เรียงลำดับ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- TreeMap: คู่คีย์-ค่าที่เรียงลำดับ
- แผนที่ย่อยและมุมมองช่วงค่า
- TreeSet และ NavigableSet
- การจัดลำดับแบบกำหนดเองในคอลเลกชันแบบต้นไม้