อินเทอร์เฟซ Comparable
ใน Java เป็นพื้นฐานสำหรับการสร้างลำดับตามธรรมชาติระหว่างอ็อบเจ็กต์ของคลาส เมื่อคลาส implements Comparable
หมายความว่าอินสแตนซ์ของคลาสสามารถเรียงลำดับโดยสัมพันธ์กันได้ การเรียงลำดับนี้เรียกว่า การเรียงลำดับตามธรรมชาติ ของคลาส และเมธอด compareTo
ภายในอินเทอร์เฟซนี้กำหนดตรรกะเฉพาะสำหรับการเปรียบเทียบ กลไกนี้มีความสำคัญอย่างยิ่งสำหรับการใช้ประโยชน์จากความสามารถในการเรียงลำดับในตัวของ Java และการใช้คอลเลกชันที่เรียงลำดับ
รายการและอาร์เรย์ที่ประกอบด้วยอ็อบเจ็กต์ที่ implements Comparable
สามารถเรียงลำดับได้อย่างง่ายดายโดยใช้ Collections.sort
และ Arrays.sort
ตามลำดับ นอกจากนี้ อ็อบเจ็กต์เหล่านี้สามารถใช้เป็นคีย์ใน SortedMap
หรือองค์ประกอบใน SortedSet
โดยไม่ต้องใช้ Comparator
ภายนอก ดังนั้น เมธอด compareTo
จึงเป็นศูนย์กลางในการเปิดใช้งานฟังก์ชันการทำงานเหล่านี้โดยการจัดเตรียมวิธีมาตรฐานในการกำหนดลำดับของอ็อบเจ็กต์
สิ่งสำคัญของการเรียงลำดับตามธรรมชาติคือความสอดคล้องกับเมธอด equals
การเรียงลำดับตามธรรมชาติของคลาสจะถือว่า สอดคล้องกับ equals ก็ต่อเมื่อ e1.compareTo(e2) == 0
ให้ผลลัพธ์แบบบูลีนเหมือนกับ e1.equals(e2)
สำหรับอินสแตนซ์ e1
และ e2
ใดๆ ของคลาสนั้น สิ่งสำคัญคือต้องทราบว่า null
ไม่ใช่อินสแตนซ์ของคลาสใดๆ และการเรียกใช้ compareTo(null)
ควรส่งผลให้เกิด NullPointerException
แม้ว่า equals(null)
จะส่งคืน false
ก็ตาม
แม้จะไม่บังคับอย่างเคร่งครัด แต่ขอแนะนำอย่างยิ่งให้การเรียงลำดับตามธรรมชาติสอดคล้องกับ equals เหตุผลเบื้องหลังคำแนะนำนี้อยู่ที่พฤติกรรมของเซตที่เรียงลำดับและแผนที่ที่เรียงลำดับเมื่อใช้กับองค์ประกอบหรือคีย์ที่มีการเรียงลำดับตามธรรมชาติไม่สอดคล้องกับ equals โดยเฉพาะเมื่อไม่มีตัวเปรียบเทียบที่ชัดเจน ในสถานการณ์เช่นนี้ คอลเลกชันที่เรียงลำดับเหล่านี้อาจแสดงพฤติกรรม “แปลก” และอาจละเมิดสัญญาทั่วไปที่กำหนดไว้สำหรับเซตและแผนที่ ซึ่งอิงตามเมธอด equals
ลองพิจารณาตัวอย่าง: หากคุณเพิ่มคีย์สองคีย์ a
และ b
ลงในเซตที่เรียงลำดับโดยไม่มีตัวเปรียบเทียบที่ชัดเจน โดยที่ !a.equals(b)
เป็นจริง แต่ a.compareTo(b) == 0
การดำเนินการเพิ่มครั้งที่สองจะส่งคืน false
ดังนั้น ขนาดของเซตที่เรียงลำดับจะไม่เพิ่มขึ้น เนื่องจากจากมุมมองของเซตที่เรียงลำดับ a
และ b
จะถือว่าเทียบเท่ากันเนื่องจากเมธอด compareTo
ระบุว่าเหมือนกันในแง่ของการเรียงลำดับ
โชคดีที่คลาส Java หลักส่วนใหญ่ที่ implements Comparable
มีการเรียงลำดับตามธรรมชาติที่สอดคล้องกับ equals ข้อยกเว้นที่น่าสังเกตคือ java.math.BigDecimal
การเรียงลำดับตามธรรมชาติสำหรับ BigDecimal
จะพิจารณาอ็อบเจ็กต์ที่มีค่าเท่ากันแต่มีความแม่นยำต่างกัน (เช่น 4.0 และ 4.00) ว่าเท่ากันในแง่ของการเรียงลำดับ แม้ว่าความแม่นยำจะต่างกันก็ตาม
จากมุมมองทางคณิตศาสตร์ ความสัมพันธ์ ที่กำหนดการเรียงลำดับตามธรรมชาติสำหรับคลาส C จะแสดงเป็น:
{(x, y) such that x.compareTo(y) <= 0}.
ผลหาร สำหรับลำดับรวมนี้กำหนดเป็น:
{(x, y) such that x.compareTo(y) == 0}.
สัญญาของ compareTo
บอกเป็นนัยว่าผลหารนี้เป็น ความสัมพันธ์เทียบเท่า บนคลาส C และการเรียงลำดับตามธรรมชาติจะสร้าง ลำดับรวม บน C เมื่อเราบอกว่าการเรียงลำดับตามธรรมชาติของคลาส สอดคล้องกับ equals หมายความว่าผลหารที่ได้จากการเรียงลำดับตามธรรมชาติสอดคล้องกับความสัมพันธ์เทียบเท่าที่กำหนดโดยเมธอด equals(Object)
ของคลาส:
{(x, y) such that x.equals(y)}.
อินเทอร์เฟซ Comparable
เป็นส่วนสำคัญของ Java Collections Framework โดยให้กลไกพื้นฐานสำหรับการเรียงลำดับอ็อบเจ็กต์และเปิดใช้งานการใช้คอลเลกชันที่เรียงลำดับและอัลกอริทึมการเรียงลำดับอย่างมีประสิทธิภาพภายในระบบนิเวศ Java