ทั้ง Comparable และ Comparator เป็นอินเทอร์เฟซที่ใช้สำหรับจัดเรียง (sort) องค์ประกอบในคอลเลกชัน Comparator อยู่ในแพ็กเกจ java.util ส่วน Comparable อยู่ใน java.lang Comparator จัดเรียงโดยใช้อ็อบเจ็กต์สองตัวที่ส่งให้ ในขณะที่ Comparable เปรียบเทียบ "this" กับอ็อบเจ็กต์เดียวที่ส่งให้
ตารางเปรียบเทียบรายละเอียด
| ลำดับ | หัวข้อ | Comparable | Comparator |
|---|---|---|---|
| 1 | เมธอด | มีเมธอด compareTo(Object o) |
มีเมธอด compare(Object o1, Object o2) |
| 2 | การใช้งานจัดเรียง | ใช้ Collections.sort(List) สำหรับอ็อบเจ็กต์แบบ Comparable |
ใช้ Collections.sort(List, Comparator) สำหรับอ็อบเจ็กต์แบบ Comparator |
| 3 | ลำดับการจัดเรียง | ให้ลำดับจัดเรียงเดียว (single sorting sequence) | ให้หลายลำดับจัดเรียงได้ (multiple sorting sequences) |
| 4 | แพ็กเกจ | java.lang package | java.util package |
ตัวอย่าง Comparable
public class Laptop implements Comparable<Laptop> {
String name;
int ram;
int price;
public Laptop(String name, int ram, int price) {
this.name = name;
this.ram = ram;
this.price = price;
}
@Override
public int compareTo(Laptop o) {
if (this.ram > o.getRam())
return 1;
else
return -1;
}
// getters/setters...
}
// การใช้งาน
List<Laptop> laptopList = new ArrayList<>();
laptopList.add(new Laptop("HCL", 16, 800));
laptopList.add(new Laptop("Apple", 8, 100));
laptopList.add(new Laptop("Dell", 4, 600));
Collections.sort(laptopList); // เรียงตาม RAM
ผลลัพธ์
4
8
16
ตัวอย่าง Comparator
import java.util.*;
public class LaptopComparator implements Comparator<Laptop> {
@Override
public int compare(Laptop o1, Laptop o2) {
if (o1.getRam() < o2.getRam()) return -1;
else if (o1.getRam() > o2.getRam()) return 1;
else return 0;
}
}
// การใช้งาน
List<Laptop> laptopList = new ArrayList<>();
// เพิ่มข้อมูล...
Comparator<Laptop> com = (o1, o2) -> o1.getName().compareTo(o2.getName());
Collections.sort(laptopList, com); // เรียงตามชื่อ
ผลลัพธ์
Apple
Dell
HCL
สรุป
Comparable ใช้สำหรับ "natural ordering" ของคลาส (จัดเรียงได้เพียงแบบเดียว) ส่วน Comparator ใช้เมื่อต้องการจัดเรียงหลายแบบ หรือไม่สามารถแก้ไขคลาสต้นฉบับได้ (เช่น คลาสจากไลบรารีภายนอก) สามารถสร้าง Comparator หลายตัวสำหรับคลาสเดียวกันได้