0Pricing
Java Academy · บทเรียน

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()); // Premium

subMap, 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. TreeMap: คู่คีย์-ค่าที่เรียงลำดับ
  2. แผนที่ย่อยและมุมมองช่วงค่า
  3. TreeSet และ NavigableSet
  4. การจัดลำดับแบบกำหนดเองในคอลเลกชันแบบต้นไม้
← กลับไปที่ Java Academy