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

การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ

ประยุกต์ใช้การเรียงลำดับกับรายการสินค้า กระดานผู้นำ และกำหนดการกิจกรรมผ่านตัวอย่างจากสถานการณ์จริง

การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. อินเทอร์เฟซ Comparable
  2. Comparator และการเรียงลำดับด้วย Lambda
  3. การเรียงลำดับหลายคีย์ด้วย thenComparing
  4. การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ
← กลับไปที่ Java Academy