TreeSet และ NavigableSet
จัดเก็บองค์ประกอบที่ไม่ซ้ำและเรียงลำดับ พร้อมใช้ floor, ceiling, higher และ lower เพื่อค้นหาค่าที่ใกล้เคียง
TreeSet และ NavigableSet เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
TreeSet คืออะไร
TreeSet เป็นเซตที่เรียงลำดับ โดยมีต้นไม้แดง-ดำเป็นโครงสร้างเบื้องหลัง จัดเก็บสมาชิกที่ไม่ซ้ำกันในลำดับธรรมชาติจากน้อยไปมาก (หรือตามตัวเปรียบเทียบที่กำหนด) การดำเนินการทั้งหมดใช้เวลา O(log n)
import java.util.TreeSet;
TreeSet<String> names = new TreeSet<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");
names.add("Alice"); // duplicate ignored
for (String s : names) System.out.print(s + " ");
// Alice Bob Charlieเมธอดของ NavigableSet: floor, ceiling, lower, higher
TreeSet นำ NavigableSet ไปใช้ จึงมีเมธอดสำหรับนำทางเพื่อค้นหาสมาชิกที่ใกล้เคียงที่สุด:
TreeSet<Integer> set = new TreeSet<>();
for (int i = 10; i <= 50; i += 10) set.add(i);
// {10, 20, 30, 40, 50}
System.out.println(set.floor(25)); // 20 (greatest ≤ 25)
System.out.println(set.ceiling(25)); // 30 (smallest ≥ 25)
System.out.println(set.lower(30)); // 20 (strictly less)
System.out.println(set.higher(30)); // 40 (strictly greater)first, last, pollFirst, pollLast
เข้าถึงหรือลบสมาชิกที่อยู่ตรงขอบเขต:
TreeSet<String> ts = new TreeSet<>(Set.of("cherry","apple","banana","date"));
System.out.println(ts.first()); // apple
System.out.println(ts.last()); // date
System.out.println(ts.pollFirst()); // apple (removed)
System.out.println(ts.pollLast()); // date (removed)
System.out.println(ts); // [banana, cherry]headSet, tailSet, subSet
แยกมุมมองของเซตย่อยที่เรียงลำดับแล้ว:
TreeSet<Integer> set = new TreeSet<>(Set.of(1,2,3,4,5,6,7,8,9,10));
System.out.println(set.headSet(5)); // [1, 2, 3, 4]
System.out.println(set.tailSet(7)); // [7, 8, 9, 10]
System.out.println(set.subSet(3, 7)); // [3, 4, 5, 6]
// Inclusive upper bound:
System.out.println(set.subSet(3, true, 7, true)); // [3,4,5,6,7]การวนซ้ำแบบย้อนกลับ
ใช้ descendingIterator() หรือ descendingSet() สำหรับลำดับย้อนกลับ:
TreeSet<Integer> ts = new TreeSet<>(Set.of(1,3,5,7,9));
// Descending iterator
var it = ts.descendingIterator();
while (it.hasNext()) System.out.print(it.next() + " ");
// 9 7 5 3 1การจัดลำดับแบบกำหนดเองด้วย Comparator
ส่ง Comparator เพื่อเรียงลำดับที่ไม่ใช่ลำดับธรรมชาติ — ตัวอย่างเช่น เรียงสตริงที่ยาวที่สุดก่อน:
TreeSet<String> byLength = new TreeSet<>(
Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder())
);
byLength.add("Hi");
byLength.add("Hello");
byLength.add("Hey");
byLength.add("Java");
for (String s : byLength) System.out.print(s + " ");
// Hi Hey Java Helloกรณีใช้งาน: ชื่อผู้ใช้ที่ไม่ซ้ำและเรียงลำดับ
จัดเก็บชื่อผู้ใช้ใน TreeSet เพื่อกำจัดรายการซ้ำโดยอัตโนมัติและรักษาลำดับตัวอักษร:
TreeSet<String> users = new TreeSet<>();
users.add("alice");
users.add("bob");
users.add("alice"); // ignored
users.add("carol");
System.out.println(users.first()); // alice
System.out.println(users); // [alice, bob, carol]กรณีใช้งาน: การนับตามช่วง
นับสมาชิกในช่วงด้วย subSet:
TreeSet<Integer> scores = new TreeSet<>();
for (int s : new int[]{45,62,78,55,90,88,34,71}) scores.add(s);
// Scores between 60 and 89 (inclusive)
int count = scores.subSet(60, true, 89, true).size();
System.out.println("Students in B range: " + count); // 3 (62, 78, 88... wait: 62,78,71,88=4)
// Actually: 62,71,78,88 = 4TreeSet เทียบกับ HashSet และ LinkedHashSet
เลือกตามความต้องการ:
- HashSet: การดำเนินการใช้เวลา O(1) ไม่มีการจัดลำดับ
- LinkedHashSet: การดำเนินการใช้เวลา O(1) จัดลำดับตามการแทรก
- TreeSet: การดำเนินการใช้เวลา O(log n) มีลำดับที่เรียงไว้ และมีเมธอดสำหรับนำทาง
TreeSet ต้องการให้สมาชิกนำ Comparable ไปใช้ หรือมี Comparator
สมาชิกค่าว่าง
TreeSet จะ NOT อนุญาตให้มีสมาชิกค่าว่างเมื่อใช้ลำดับธรรมชาติ — จะเกิด NullPointerException เนื่องจากไม่สามารถเปรียบเทียบค่าว่างได้ อย่างไรก็ตาม ตัวเปรียบเทียบแบบกำหนดเองที่จัดการค่าว่างไว้อย่างชัดเจนสามารถใช้งานได้
TreeSet<String> ts = new TreeSet<>();
try {
ts.add(null); // throws NullPointerException
} catch (NullPointerException e) {
System.out.println("Cannot add null: " + e);
}ความปลอดภัยต่อการทำงานหลายเธรด
TreeSet ไม่ปลอดภัยต่อการทำงานหลายเธรด ให้ทำการซิงโครไนซ์จากภายนอกด้วย Collections.synchronizedSortedSet() หรือใช้ ConcurrentSkipListSet ซึ่งทั้งเรียงลำดับและปลอดภัยต่อการทำงานหลายเธรด
ตรวจสอบความเข้าใจ
TreeSet<Integer> มี {10, 20, 30, 40, 50} set.ceiling(35) จะคืนค่าใด
สรุป: TreeSet และ NavigableSet
ประเด็นสำคัญ:
- TreeSet จัดเก็บสมาชิกที่ไม่ซ้ำและเรียงลำดับแล้ว (O(log n))
- นำ NavigableSet ไปใช้: floor, ceiling, lower, higher, first, last
- headSet, tailSet และ subSet คืนมุมมองตามช่วงที่เชื่อมโยงกับข้อมูลต้นทาง
- ใช้ descendingSet()/descendingIterator() สำหรับลำดับย้อนกลับ
- ไม่ปลอดภัยต่อการทำงานหลายเธรด — ใช้ ConcurrentSkipListSet สำหรับการทำงานพร้อมกัน
คำถามที่พบบ่อย
บทเรียน “TreeSet และ NavigableSet” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “TreeSet และ NavigableSet” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “TreeSet และ NavigableSet”
จัดเก็บองค์ประกอบที่ไม่ซ้ำและเรียงลำดับ พร้อมใช้ floor, ceiling, higher และ lower เพื่อค้นหาค่าที่ใกล้เคียง คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “TreeSet และ NavigableSet” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- TreeMap: คู่คีย์-ค่าที่เรียงลำดับ
- แผนที่ย่อยและมุมมองช่วงค่า
- TreeSet และ NavigableSet
- การจัดลำดับแบบกำหนดเองในคอลเลกชันแบบต้นไม้