ฉันได้เห็นการเรียนซึ่งใช้ทั้งเทียบเคียงและเปรียบเทียบ สิ่งนี้หมายความว่า? ทำไมฉันถึงต้องใช้อันเดียวกัน?
ฉันได้เห็นการเรียนซึ่งใช้ทั้งเทียบเคียงและเปรียบเทียบ สิ่งนี้หมายความว่า? ทำไมฉันถึงต้องใช้อันเดียวกัน?
คำตอบ:
ข้อความด้านล่างมาจากComparator vs Comparable
เทียบเคียง
วัตถุที่เปรียบเทียบนั้นสามารถเปรียบเทียบตัวเองกับวัตถุอื่นได้ คลาสเองต้องใช้java.lang.Comparableอินเตอร์เฟสเพื่อให้สามารถเปรียบเทียบอินสแตนซ์ของมันได้
เปรียบเทียบ
วัตถุตัวเปรียบเทียบสามารถเปรียบเทียบวัตถุสองชนิดที่แตกต่างกันได้ คลาสไม่ได้ทำการเปรียบเทียบอินสแตนซ์ของมัน แต่เป็นอินสแตนซ์ของคลาสอื่น คลาสตัวเปรียบเทียบนี้ต้องใช้java.util.Comparatorอินเตอร์เฟส
การนำไปใช้Comparableหมายถึง " ฉันสามารถเปรียบเทียบตัวเองกับวัตถุอื่น " ซึ่งโดยทั่วไปจะมีประโยชน์เมื่อมีการเปรียบเทียบค่าเริ่มต้นตามธรรมชาติ
การนำไปใช้Comparatorหมายถึง " ฉันสามารถเปรียบเทียบวัตถุสองชิ้นอื่น ๆ ได้ " ซึ่งโดยทั่วไปจะเป็นประโยชน์เมื่อมีหลายวิธีในการเปรียบเทียบสองอินสแตนซ์ของประเภท - เช่นคุณสามารถเปรียบเทียบบุคคลตามอายุชื่อ ฯลฯ
Personใช้งานComparableเพราะคุณไม่สามารถเปลี่ยนวิธีการเปรียบเทียบคนสองคน
                    Personนิติบุคคลที่ตัวเองเช่น 2) ตัวเปรียบเทียบเช่นPersonAgeComparatorซึ่งสามารถเปรียบเทียบเอนทิตีที่แตกต่างกันสองรายการและตัดสินใจว่าควรจะเรียงลำดับใดเป็นอันดับแรก 3) รหัสการเรียงลำดับซึ่งใช้การรวบรวมเอนทิตีและตัวเปรียบเทียบและเรียงลำดับการรวบรวมนั้นโดยใช้ตัวเปรียบเทียบเพื่อกำหนดลำดับ
                    Comparable ให้คลาสใช้การเปรียบเทียบของตัวเอง:
โดยการเปรียบเทียบ Comparator เป็นการเปรียบเทียบภายนอก:
ทั้งในการใช้งานคุณยังสามารถเลือกสิ่งที่คุณต้องการที่จะเปรียบเทียบ ด้วยยาชื่อสามัญคุณสามารถประกาศได้และตรวจสอบได้ในเวลารวบรวม สิ่งนี้ช่วยเพิ่มความปลอดภัย แต่ก็เป็นความท้าทายในการกำหนดค่าที่เหมาะสม
ตามแนวทางฉันมักจะใช้คลาสทั่วไปหรืออินเตอร์เฟสที่วัตถุนั้นสามารถนำมาเปรียบเทียบได้ในทุกกรณีการใช้งานที่ฉันนึกภาพ ... ไม่ได้นิยามที่แม่นยำมาก ๆ ! :-(
Comparable<Object>ช่วยให้คุณสามารถใช้มันในทุกรหัสในเวลาคอมไพล์ (ซึ่งดีถ้าจำเป็นหรือไม่ดีถ้าไม่ใช่และคุณสูญเสียข้อผิดพลาดในการคอมไพล์เวลา) การติดตั้งใช้งานของคุณต้องรับมือกับวัตถุและใช้งานได้ตามต้องการ แต่ก็มีประสิทธิภาพComparable<Itself> เข้มงวดมากในทางตรงกันข้ามตลกเมื่อคุณคลาสย่อยตัวเองเป็นคลาสย่อยคลาสย่อยจะต้องสามารถเปรียบเทียบและมีประสิทธิภาพเกี่ยวกับมัน (หรือมันจะทำลายหลักการ Liskov และให้ข้อผิดพลาดรันไทม์)
java.lang.Comparable
ในการใช้Comparableส่วนต่อประสานคลาสจะต้องใช้วิธีการเดียวcompareTo()
int a.compareTo(b)
คุณต้องแก้ไขคลาสที่มีอินสแตนซ์ที่คุณต้องการเรียงลำดับ เพื่อให้สามารถสร้างลำดับการเรียงลำดับได้หนึ่งคลาสต่อหนึ่งคลาส
java.util.Comparator
ในการใช้ส่วนต่อประสาน Comparator คลาสจะต้องใช้วิธีการเดียว compare()
int compare (a,b)
Comparable ใช้สำหรับจัดเตรียมการสั่งซื้อเริ่มต้นบนวัตถุข้อมูลตัวอย่างเช่นถ้าวัตถุข้อมูลมีลำดับธรรมชาติ
Comparatorหมายถึงการสั่งซื้อของตัวเองสำหรับการใช้งานที่เฉพาะเจาะจง
Comparableมักเป็นที่ต้องการ แต่บางครั้งคลาสก็ใช้งานอยู่Comparableแต่คุณต้องการเรียงลำดับในคุณสมบัติอื่น Comparatorแล้วคุณจะบังคับให้ใช้
บางคลาสจัดเตรียมComparatorsไว้สำหรับกรณีทั่วไป เช่นStrings โดยกรณีค่าเริ่มต้นเมื่อเรียงลำดับ แต่ยังคงเรียกว่าComparatorCASE_INSENSITIVE_ORDER
นี่คือความแตกต่างเล็กน้อยระหว่าง Comparator และ Comparable ที่ฉันพบบนเว็บ:
หากคุณเห็นความแตกต่างเชิงตรรกะระหว่างสองสิ่งนี้คือ Comparator ใน Java จะเปรียบเทียบวัตถุสองอย่างที่มีให้กับเขาในขณะที่ส่วนต่อประสานที่เปรียบเทียบได้จะเปรียบเทียบการอ้างอิง "นี่" กับวัตถุที่ระบุ
เปรียบได้ใน Java ใช้ในการดำเนินการสั่งซื้อวัตถุตามธรรมชาติ ใน Java API String คลาส Date และ wrapper ใช้อินเตอร์เฟสที่เปรียบเทียบได้
ถ้าคลาสใดใช้อินเตอร์เฟสที่สามารถเปรียบเทียบได้ใน Java ดังนั้นการรวบรวมของวัตถุนั้น List หรือ Array สามารถเรียงลำดับโดยอัตโนมัติโดยใช้ Collections.sort () หรือ Array.sort () วิธีการและวัตถุจะถูกเรียงตามลำดับธรรมชาติที่กำหนดโดยวิธี CompareTo
วัตถุที่ใช้ Comparable ใน Java สามารถใช้เป็นกุญแจในแผนที่เรียงหรือองค์ประกอบในชุดเรียงเช่น TreeSet โดยไม่ต้องระบุ Comparator ใด ๆ
ไซต์: วิธีใช้เครื่องมือเปรียบเทียบและเปรียบเทียบได้ใน Java ด้วยตัวอย่าง
อ่านเพิ่มเติม: จะใช้ Comparator และ Comparable ใน Java ได้อย่างไร ด้วยตัวอย่าง
Comparableสำหรับวัตถุที่มีการจัดเรียงแบบเป็นธรรมชาติ วัตถุเองรู้วิธีการสั่งซื้อ 
Comparatorสำหรับวัตถุที่ไม่มีลำดับตามธรรมชาติหรือเมื่อคุณต้องการใช้ลำดับที่แตกต่างกัน
ความแตกต่างระหว่าง Comparator และ Interfaceable
Comparable ใช้เพื่อเปรียบเทียบตัวเองโดยใช้กับวัตถุอื่น
Comparator ใช้ในการเปรียบเทียบสองประเภทข้อมูลเป็นวัตถุ
หากคุณเห็นความแตกต่างทางตรรกะระหว่างสองสิ่งนี้อยู่Comparatorใน Java เปรียบเทียบสองวัตถุที่จัดเตรียมให้เขาในขณะที่Comparableส่วนต่อประสานจะเปรียบเทียบการอ้างอิง "นี้" กับวัตถุที่ระบุ
Comparableในจาวาถูกนำมาใช้เพื่อดำเนินการตามลำดับของวัตถุ ใน Java API String คลาส Date และ wrapper ใช้Comparableอินเตอร์เฟส
หากคลาสใดใช้Comparableอินเตอร์เฟสใน Java ดังนั้นการรวบรวมของวัตถุนั้นListหรือArrayสามารถเรียงลำดับโดยอัตโนมัติโดยใช้Collections.sort()หรือArray.sort()วิธีการและวัตถุจะถูกจัดเรียงตามลำดับธรรมชาติที่กำหนดโดยcompareToวิธีการ
วัตถุที่ใช้Comparableใน Java สามารถใช้เป็นกุญแจในแผนที่เรียงหรือองค์ประกอบในชุดเรียงตัวอย่างโดยไม่ต้องระบุใด ๆTreeSetComparator
lib คำอธิบายประกอบของฉันสำหรับการใช้ Comparable และ Comparator:
public class Person implements Comparable<Person> {         
    private String firstName;  
    private String lastName;         
    private int age;         
    private char gentle;         
    @Override         
    @CompaProperties({ @CompaProperty(property = "lastName"),              
        @CompaProperty(property = "age",  order = Order.DSC) })           
    public int compareTo(Person person) {                 
        return Compamatic.doComparasion(this, person);         
    }  
} คลิกลิงก์เพื่อดูตัวอย่างเพิ่มเติม compamatic