Comparator และการเรียงลำดับด้วย Lambda
สร้างอินสแตนซ์ Comparator ด้วยนิพจน์ lambda และเมธอดโรงงาน Comparator.comparing
Comparator และการเรียงลำดับด้วย Lambda เป็นบทเรียน Java Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Java Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
Comparator และการจัดเรียงด้วยแลมบ์ดา
Comparator<T> กำหนดลำดับจากภายนอกสำหรับวัตถุ ต่างจาก Comparable ตรงที่คุณสามารถสร้าง Comparator ได้มากเท่าที่ต้องการโดยไม่ต้องแก้ไขคลาส
การสร้าง Comparator
สร้าง Comparator ด้วยแลมบ์ดาหรือการอ้างอิงเมธอด แล้วส่งให้เมธอดจัดเรียง
import java.util.*;
record Product(String name, double price, int stock) {}
List<Product> products = new ArrayList<>(List.of(
new Product("Mouse", 29.99, 50),
new Product("Laptop", 999.00, 5),
new Product("USB Hub", 24.99, 100)
));
// Lambda comparator
products.sort((a, b) -> Double.compare(a.price(), b.price()));
System.out.println(products);
// [USB Hub, Mouse, Laptop] (by price ascending)โรงงาน Comparator.comparing
Comparator.comparing(keyExtractor) สร้าง Comparator จากฟังก์ชันดึงคีย์ ซึ่งอ่านง่ายกว่าแลมบ์ดาแบบเขียนตรง ๆ
import java.util.Comparator;
Comparator<Product> byPrice = Comparator.comparingDouble(Product::price);
Comparator<Product> byName = Comparator.comparing(Product::name);
Comparator<Product> byStock = Comparator.comparingInt(Product::stock);
products.sort(byPrice);
System.out.println(products); // sorted by price ascending
products.sort(byName);
System.out.println(products); // sorted alphabeticallyreversed()
reversed() จะกลับลำดับของ Comparator ใด ๆ
import java.util.Comparator;
Comparator<Product> mostExpensiveFirst =
Comparator.comparingDouble(Product::price).reversed();
products.sort(mostExpensiveFirst);
System.out.println(products);
// [Laptop($999.0), Mouse($29.99), USB Hub($24.99)]naturalOrder และ reverseOrder
Comparator.naturalOrder() ใช้ Comparable ของคลาส ส่วน reverseOrder() จะกลับลำดับนั้น
List<String> names = new ArrayList<>(List.of("Charlie", "Alice", "Bob"));
names.sort(Comparator.naturalOrder());
System.out.println(names); // [Alice, Bob, Charlie]
names.sort(Comparator.reverseOrder());
System.out.println(names); // [Charlie, Bob, Alice]
// Sort integers descending
List<Integer> nums = new ArrayList<>(List.of(5, 2, 8, 1, 9));
nums.sort(Comparator.reverseOrder());
System.out.println(nums); // [9, 8, 5, 2, 1]Comparator ที่ปลอดภัยต่อค่า Null
Comparator.nullsFirst() และ nullsLast() จัดการองค์ประกอบที่เป็น null โดยไม่ทำให้เกิด NPE
import java.util.*;
List<String> withNulls = new ArrayList<>(Arrays.asList("Charlie", null, "Alice", null, "Bob"));
withNulls.sort(Comparator.nullsLast(Comparator.naturalOrder()));
System.out.println(withNulls); // [Alice, Bob, Charlie, null, null]
withNulls.sort(Comparator.nullsFirst(Comparator.naturalOrder()));
System.out.println(withNulls); // [null, null, Alice, Bob, Charlie]Stream sorted() กับ Comparator
ใช้การดำเนินการระดับกลาง sorted() ของสตรีมร่วมกับ Comparator เพื่อจัดเรียงในรูปแบบเชิงฟังก์ชัน
import java.util.stream.*;
record Employee(String name, String dept, double salary) {}
List<Employee> employees = List.of(
new Employee("Alice", "Engineering", 95000),
new Employee("Bob", "Marketing", 72000),
new Employee("Charlie", "Engineering", 105000)
);
// Sort by salary descending in a stream pipeline
employees.stream()
.sorted(Comparator.comparingDouble(Employee::salary).reversed())
.forEach(e -> System.out.println(e.name() + ": $" + e.salary()));
// Charlie: $105000.0 / Alice: $95000.0 / Bob: $72000.0Comparator แบบแลมบ์ดากับการอ้างอิงเมธอด
การอ้างอิงเมธอดช่วยให้ Comparator กระชับยิ่งขึ้น เมื่อฟังก์ชันดึงคีย์เป็นเมธอดดึงค่าที่เรียบง่าย
// Lambda
Comparator<String> c1 = (a, b) -> a.length() - b.length();
// Comparator.comparing with lambda
Comparator<String> c2 = Comparator.comparing(s -> s.length());
// Comparator.comparingInt with method reference (cleanest)
Comparator<String> c3 = Comparator.comparingInt(String::length);
List<String> words = new ArrayList<>(List.of("banana", "fig", "apple", "kiwi"));
words.sort(c3);
System.out.println(words); // [fig, kiwi, apple, banana]Comparator ที่มีสถานะ
แม้โดยทั่วไป Comparator ควรไม่มีสถานะ แต่คุณสามารถส่งการกำหนดค่าผ่านพารามิเตอร์ของตัวสร้างได้
class DistanceComparator implements Comparator<String> {
private final String target;
DistanceComparator(String target) { this.target = target; }
@Override
public int compare(String a, String b) {
return Integer.compare(distance(a), distance(b));
}
private int distance(String s) { return Math.abs(s.length() - target.length()); }
}
List<String> words = new ArrayList<>(List.of("Java", "Go", "Python", "C", "Kotlin"));
words.sort(new DistanceComparator("Java"));
System.out.println(words); // closest length to "Java" firstการจัดเรียงแบบกำหนดเองสำหรับแค็ตตาล็อกสินค้า
จัดเรียงแค็ตตาล็อกสินค้าตามความพร้อมจำหน่ายก่อน จากนั้นตามราคา และตามชื่อ
import java.util.*;
record Item(String name, double price, boolean inStock) {}
List<Item> catalog = List.of(
new Item("Laptop", 999.0, true),
new Item("Case", 19.99, false),
new Item("Mouse", 29.99, true),
new Item("Monitor", 349.0, true)
);
Comparator<Item> catalogSort =
Comparator.comparing(Item::inStock).reversed() // in-stock first
.thenComparingDouble(Item::price) // then cheapest
.thenComparing(Item::name); // then alphabetical
catalog.stream().sorted(catalogSort)
.forEach(i -> System.out.printf("%s %-15s $%.2f%n",
i.inStock() ? "[Y]" : "[N]", i.name(), i.price()));Arrays.sort กับ Comparator
Arrays.sort(array, comparator) จัดเรียงอาร์เรย์ของวัตถุด้วย Comparator แบบกำหนดเอง
String[] words = {"banana", "fig", "apple", "kiwi", "cherry"};
// Sort by length, then alphabetically for same length
Arrays.sort(words,
Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
System.out.println(Arrays.toString(words));
// [fig, kiwi, apple, banana, cherry]ตรวจสอบความเข้าใจอย่างรวดเร็ว
Comparator.comparingDouble(Product::price).reversed() ให้ผลลัพธ์เป็นอะไร
สรุป: Comparator และการจัดเรียงด้วยแลมบ์ดา
ประเด็นสำคัญ:
- Comparator กำหนดลำดับจากภายนอก คุณจึงใช้ได้มากเท่าที่ต้องการ
- Comparator.comparing(keyExtractor) สร้าง Comparator จากเมธอดดึงค่า
- reversed() กลับลำดับของ Comparator ใด ๆ ส่วน naturalOrder()/reverseOrder() ใช้กับชนิดที่เป็น Comparable
- nullsFirst() และ nullsLast() จัดการองค์ประกอบที่เป็น null อย่างปลอดภัย
- ใช้ sorted(comparator) ในกระบวนการของ Stream เพื่อจัดลำดับในรูปแบบเชิงฟังก์ชัน
- สามารถส่ง Comparator ให้กับ sort(), Arrays.sort(), TreeSet และ TreeMap ได้
คำถามที่พบบ่อย
บทเรียน “Comparator และการเรียงลำดับด้วย Lambda” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “Comparator และการเรียงลำดับด้วย Lambda” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Java Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Java Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “Comparator และการเรียงลำดับด้วย Lambda”
สร้างอินสแตนซ์ Comparator ด้วยนิพจน์ lambda และเมธอดโรงงาน Comparator.comparing คุณปฏิบัติ Java Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Java Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Java Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “Comparator และการเรียงลำดับด้วย Lambda” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Java Academy นี้ได้ไหม
ได้ บทเรียน Java Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อินเทอร์เฟซ Comparable
- Comparator และการเรียงลำดับด้วย Lambda
- การเรียงลำดับหลายคีย์ด้วย thenComparing
- การเรียงลำดับอาร์เรย์และคอลเลกชันในทางปฏิบัติ