การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ
ประยุกต์ใช้การเรียงลำดับกับรายการสินค้า กระดานผู้นำ และกำหนดการกิจกรรมผ่านตัวอย่างจากสถานการณ์จริง
การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
การเรียงลำดับในทางปฏิบัติ
บทเรียนนี้นำเทคนิคการเรียงลำดับไปใช้กับสถานการณ์ที่ใกล้เคียงการใช้งานจริง ได้แก่ แค็ตตาล็อกสินค้า กระดานจัดอันดับ การจัดตารางกิจกรรม และการจัดอันดับผลการค้นหา
Arrays.sort สำหรับอาร์เรย์ชนิดพื้นฐาน
Arrays.sort() สำหรับอาร์เรย์ชนิดพื้นฐานใช้การเรียงแบบควิกซอร์ตสองแกน — เร็วมาก โดยมีค่าเฉลี่ย O(n log n)
int[] scores = {45, 90, 78, 62, 88, 33};
Arrays.sort(scores);
System.out.println(Arrays.toString(scores)); // [33, 45, 62, 78, 88, 90]
// Sort a range only
int[] data = {9, 3, 7, 1, 5};
Arrays.sort(data, 1, 4); // sort indices 1-3 only
System.out.println(Arrays.toString(data)); // [9, 1, 3, 7, 5]Arrays.sort สำหรับอาร์เรย์อ็อบเจ็กต์
สำหรับอาร์เรย์อ็อบเจ็กต์ Arrays.sort() ใช้ TimSort ซึ่งมีความเสถียร คุณสามารถส่งตัวเปรียบเทียบเพื่อกำหนดลำดับแบบกำหนดเองได้
String[] names = {"Charlie", "Alice", "Bob", "Diana"};
Arrays.sort(names);
System.out.println(Arrays.toString(names)); // [Alice, Bob, Charlie, Diana]
// Custom order: by length, then alphabetically
Arrays.sort(names, Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(names)); // [Bob, Alice, Diana, Charlie]Collections.sort และ List.sort
ทั้งสองวิธีเรียงลำดับ List ในโครงสร้างเดิมโดยตรง โดยทั่วไปควรใช้ List.sort() ซึ่งเป็นวิธีที่ทันสมัยกว่า
List<Integer> nums = new ArrayList<>(List.of(5, 2, 8, 1, 9, 3));
// Old way
Collections.sort(nums);
System.out.println(nums); // [1, 2, 3, 5, 8, 9]
// Modern way (same result)
nums.sort(Comparator.naturalOrder());
nums.sort(null); // null means natural order
// Descending
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 8, 5, 3, 2, 1]Stream.sorted() สำหรับรูปแบบเชิงฟังก์ชัน
ใช้ stream().sorted() เมื่อกำลังสร้างกระบวนการประมวลผล — วิธีนี้สร้างสตรีมใหม่ที่เรียงลำดับแล้วโดยไม่แก้ไขแหล่งข้อมูล
List<String> cities = List.of("Tokyo", "London", "New York", "Paris", "Sydney");
// Sorted stream — source list unchanged
List<String> sorted = cities.stream()
.sorted(Comparator.comparingInt(String::length).thenComparing(Comparator.naturalOrder()))
.collect(Collectors.toList());
System.out.println(sorted);
// [Paris, Tokyo, London, Sydney, New York]การเรียงลำดับแผนที่ตามค่า
คำถามสัมภาษณ์งานที่พบบ่อย: เรียงลำดับแผนที่ตามค่าของแผนที่โดยใช้ stream และตัวเปรียบเทียบ
import java.util.*;
import java.util.stream.*;
Map<String, Integer> scores = Map.of(
"Alice", 95, "Bob", 87, "Charlie", 92, "Diana", 87
);
Map<String, Integer> sorted = scores.entrySet().stream()
.sorted(Map.Entry.<String, Integer>comparingByValue(Comparator.reverseOrder())
.thenComparing(Map.Entry.comparingByKey()))
.collect(Collectors.toLinkedHashMap(
Map.Entry::getKey, Map.Entry::getValue,
(v1, v2) -> v1, LinkedHashMap::new));
sorted.forEach((k, v) -> System.out.println(k + ": " + v));
// Alice: 95 / Charlie: 92 / Bob: 87 / Diana: 87การเรียงลำดับด้วย Collator ตามภูมิภาคภาษา
สำหรับการเรียงลำดับข้อความที่คำนึงถึงภาษา ให้ใช้ java.text.Collator แทน String.compareTo เพราะรองรับเครื่องหมายกำกับเสียง ตัวพิมพ์เล็กตัวพิมพ์ใหญ่ และลำดับเฉพาะของแต่ละภูมิภาคภาษา
import java.text.*;
import java.util.*;
List<String> names = new ArrayList<>(List.of("éclair", "apple", "Über", "banana"));
Collator collator = Collator.getInstance(Locale.GERMAN);
names.sort(collator);
System.out.println(names); // locale-aware sortการเรียงลำดับอ็อบเจ็กต์ด้วยเกณฑ์หลายข้อ
การเรียงลำดับสินค้าในระบบพาณิชย์อิเล็กทรอนิกส์: สินค้าที่มีอยู่ในคลังก่อน ตามด้วยราคาลด ตามด้วยคะแนน แล้วจึงตามด้วยชื่อ
record Product(String name, double price, double salePrice, double rating, boolean inStock) {}
Comparator<Product> bestFirst = Comparator
.comparing(Product::inStock).reversed() // in-stock first
.thenComparingDouble(Product::salePrice) // cheapest sale price
.thenComparingDouble(Product::rating).reversed() // highest rated
.thenComparing(Product::name); // alphabetical tiebreakการเรียงลำดับกิจกรรมตามวันที่และเวลา
การเรียงตารางกิจกรรมตามลำดับเวลาโดยใช้ชนิดข้อมูลจาก java.time ซึ่งรองรับการเปรียบเทียบ
import java.time.*;
import java.util.*;
record Event(String title, LocalDate date, LocalTime time) {}
List<Event> schedule = new ArrayList<>(List.of(
new Event("Workshop", LocalDate.of(2024,7,15), LocalTime.of(9, 0)),
new Event("Keynote", LocalDate.of(2024,7,14), LocalTime.of(10, 30)),
new Event("Lunch Talk",LocalDate.of(2024,7,15), LocalTime.of(12, 0)),
new Event("Hackathon", LocalDate.of(2024,7,14), LocalTime.of(9, 0))
));
schedule.sort(Comparator.comparing(Event::date).thenComparing(Event::time));
schedule.forEach(e -> System.out.println(e.date() + " " + e.time() + " " + e.title()));องค์ประกอบอันดับต้น ๆ ด้วยการเรียงลำดับ
การค้นหาองค์ประกอบอันดับต้น ๆ อย่างมีประสิทธิภาพ: เรียงจากมากไปน้อยแล้วเลือก N รายการแรก หรือใช้ PriorityQueue สำหรับชุดข้อมูลขนาดใหญ่
List<Integer> values = List.of(42, 17, 88, 5, 73, 56, 91, 33);
// Simple approach: sort descending, take first 3
List<Integer> top3 = values.stream()
.sorted(Comparator.reverseOrder())
.limit(3)
.collect(Collectors.toList());
System.out.println(top3); // [91, 88, 73]
// For very large datasets: PriorityQueue min-heap approach is O(n log k)
import java.util.PriorityQueue;
PriorityQueue<Integer> heap = new PriorityQueue<>(3);
for (int v : values) {
heap.offer(v);
if (heap.size() > 3) heap.poll();
}
System.out.println(new TreeSet<>(heap).descendingSet()); // [73, 88, 91]การกำจัดข้อมูลซ้ำด้วยการเรียงลำดับ
หลังการเรียงลำดับ รายการซ้ำจะอยู่ติดกัน จึงสามารถตรวจจับได้ในเวลา O(n)
int[] arr = {3, 1, 4, 1, 5, 9, 2, 6, 5};
Arrays.sort(arr); // sort first
// Remove duplicates in O(n) after sorting
int[] unique = Arrays.stream(arr).distinct().toArray();
System.out.println(Arrays.toString(unique)); // [1, 2, 3, 4, 5, 6, 9]ประสิทธิภาพ: การเลือกวิธีเรียงลำดับ
การเลือกแนวทางการเรียงลำดับที่เหมาะสม:
- อาร์เรย์ชนิดพื้นฐาน: Arrays.sort() — เร็วที่สุด เป็นการเรียงแบบควิกซอร์ตในตำแหน่งเดิม
- อาร์เรย์หรือรายการอ็อบเจ็กต์ที่รองรับการเปรียบเทียบ: Collections.sort() หรือ List.sort(null)
- ลำดับหลายแบบ: เชื่อมตัวเปรียบเทียบด้วย thenComparing
- องค์ประกอบอันดับต้น ๆ จากสตรีมขนาดใหญ่: PriorityQueue หรือ Stream.sorted().limit(N)
ตรวจสอบความเข้าใจอย่างรวดเร็ว
Java ใช้อัลกอริทึมการเรียงลำดับใดสำหรับอาร์เรย์อ็อบเจ็กต์ใน Arrays.sort()
สรุป: การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ
ประเด็นสำคัญ:
- Arrays.sort() สำหรับชนิดพื้นฐานใช้การเรียงแบบควิกซอร์ตสองแกน ส่วนอ็อบเจ็กต์ใช้ TimSort ซึ่งมีความเสถียร
- List.sort(ตัวเปรียบเทียบ) และ Collections.sort() ต่างก็ใช้ TimSort ที่มีความเสถียร
- stream().sorted() สร้างสตรีมใหม่ที่เรียงลำดับแล้วโดยไม่แก้ไขแหล่งข้อมูล
- การเรียงแผนที่ตามค่า: entrySet().stream().sorted(Entry.comparingByValue())
- ใช้ Collator สำหรับการเรียงลำดับข้อความที่คำนึงถึงภูมิภาคภาษา
- สำหรับองค์ประกอบอันดับต้น ๆ จากข้อมูลขนาดใหญ่ PriorityQueue ที่มีความจุ k มีประสิทธิภาพมากกว่าการเรียงข้อมูลทั้งหมด
คำถามที่พบบ่อย
บทเรียน “การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ”
ประยุกต์ใช้การเรียงลำดับกับรายการสินค้า กระดานผู้นำ และกำหนดการกิจกรรมผ่านตัวอย่างจากสถานการณ์จริง คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อินเทอร์เฟซ Comparable
- Comparator และการเรียงลำดับด้วย Lambda
- การเรียงลำดับหลายคีย์ด้วย thenComparing
- การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ