ฉันได้เห็นการเรียนซึ่งใช้ทั้งเทียบเคียงและเปรียบเทียบ สิ่งนี้หมายความว่า? ทำไมฉันถึงต้องใช้อันเดียวกัน?
ฉันได้เห็นการเรียนซึ่งใช้ทั้งเทียบเคียงและเปรียบเทียบ สิ่งนี้หมายความว่า? ทำไมฉันถึงต้องใช้อันเดียวกัน?
คำตอบ:
ข้อความด้านล่างมาจาก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
ไว้สำหรับกรณีทั่วไป เช่นString
s โดยกรณีค่าเริ่มต้นเมื่อเรียงลำดับ แต่ยังคงเรียกว่าComparator
CASE_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 สามารถใช้เป็นกุญแจในแผนที่เรียงหรือองค์ประกอบในชุดเรียงตัวอย่างโดยไม่ต้องระบุใด ๆTreeSet
Comparator
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