كلاهما يحدد كيفية ترتيب الكائنات، لكن بطرق مختلفة: Comparable يحدد ترتيب الفئة الطبيعي (يتم تنفيذه من قبل الفئة نفسها)، بينما Comparator يحدد ترتيب خارجي بديل (كائن منفصل). يعتمد الاختيار على ما إذا كان الترتيب متأصلاً أم ظرفياً.
كلاهما يحدد كيفية ترتيب الكائنات، لكن بطرق مختلفة: Comparable يحدد ترتيب الفئة الطبيعي (يتم تنفيذه من قبل الفئة نفسها)، بينما Comparator يحدد ترتيب خارجي بديل (كائن منفصل). يعتمد الاختيار على ما إذا كان الترتيب متأصلاً أم ظرفياً.
public class Person implements Comparable<Person> {
private String name;
private int age;
@Override
public int compareTo(Person other) { // defines THE natural order
return Integer.compare(this.age, other.age); // by age
}
// return: negative if this < other, 0 if equal, positive if this > other
}
List<Person> people = ...;
Collections.sort(people); // uses compareTo — sorts by age (the natural order)
Comparable يعيش داخل الفئة عبر compareTo()، مما يحدد ترتيبها الافتراضي الوحيد. يتم استخدامه تلقائياً بواسطة Collections.sort و TreeSet و TreeMap وغيرها.
// define orderings OUTSIDE the class — as many as you need
Comparator<Person> byName = (a, b) -> a.getName().compareTo(b.getName());
Comparator<Person> byAge = Comparator.comparingInt(Person::getAge);
people.sort(byName); // sort by name
people.sort(byAge.reversed()); // by age, descending
Comparator هو كائن منفصل، يسمح لك بتحديد ترتيبات متعددة مختلفة للفئة ذاتها دون تعديلها.
Comparator<Person> comp = Comparator
.comparing(Person::getLastName) // primary: last name
.thenComparing(Person::getFirstName) // tie-break: first name
.thenComparingInt(Person::getAge) // then: age
.reversed(); // reverse the whole thing
people.sort(comp);
طرق comparing/thenComparing ذات أسلوب المُنشئ تجعل الفرز المعقد متعدد الحقول موجزاً وقابلاً للقراءة.
Comparable → the class has ONE obvious natural order (numbers by value, strings
alphabetically, dates chronologically); you own the class
Comparator → you need MULTIPLE orderings, situational/custom ordering, OR you
can't modify the class (e.g. sorting a third-party type differently)
ترتيب الكائنات احتياج مستمر — فرز القوائم، استخدام TreeSet/TreeMap، العثور على الحد الأدنى/الأقصى.
فهم التمييز بين Comparable و Comparator يسمح لك باختيار بشكل صحيح: Comparable لترتيب الفئة الوحيد المتأصل (مدمج، يُستخدم بشكل افتراضي)، Comparator لمرونة الترتيبات المتعددة أو الخارجية (فرز البيانات ذاتها حسب حقول مختلفة، أو ترتيب الأنواع التي لا تتحكم فيها).
واجهة Comparator السلسة الحديثة (comparing/thenComparing/reversed) تجعل الفرز متعدد المستويات أنيقاً.
إتقان كليهما — ومتى يناسب كل منهما — ضروري للعمل مع هياكل البيانات المُرتبة وهو موضوع عملي ومقابلة متكرر في Java.
مكتبة من أسئلة مقابلات تقنية المعلومات مع إجابات مفصّلة — من المبتدئ إلى المتقدم.
تبرع