لتنفيذ الفرز ، يجب أن تكون العناصر التي يتم فرزها قابلة للمقارنة مع بعضها البعض أكثر أو أقل. بعبارة أخرى ، لتحديد قاعدة تسمح لأي كائنين بالإشارة إلى أي منهما ضمن السياق المحدد يذهب سابقًا وأيهما لاحقًا.
في جافا ، يتم تحديد هذه القواعد على مستوى الفئات التي تنتمي إليها الكائنات. على سبيل المثال ، لنأخذ فصلًا دراسيًا لوصف حساب المستخدم:
UserAccount {
currency
value
updatedTimestamp
}اعتمادًا على السياق ، يمكن مقارنة حسابات المستخدمين وفقًا لقواعد مختلفة ، على سبيل المثال:
في التطبيق ، يرى المستخدم الحسابات مرتبة حسب العملة ، ثم حسب القيمة ؛
في لوحة الإدارة ، يتم فرز جميع حسابات المستخدمين حسب تاريخ التعديل.
لتنفيذ مقارنة أكثر أو أقل في جافا ، هناك احتمالان:
يطبق UserAccount الواجهة
Comparable<UserAccount>في هذه الحالة ، يحصل كائنان على إمكانية المقارنة مع بعضهما البعض:acc1.compareTo(acc2)يتم إنشاء فئة منفصلة تقوم بتنفيذ الواجهة
Comparator<UserAccount>، ومن ثم يمكن لكائن هذه الفئة مقارنة كائنين من الفئة الأصلية مع بعضهما البعض:userAccountComparator.compare(acc1, acc2)
من الواضح ، في بعض الحالات ، لا يوجد خيار بين المقارنة والمقارنة. إذا كان لا يمكن تعديل الفئة الأصلية ، أو إذا كانت هناك حاجة لقواعد مقارنة مختلفة ، فيجب استخدام المقارنة. خلاف ذلك ، يمكنك تقنيًا استخدام المقارنة والمقارنة.
Comparable , (class's natural ordering). , (String, Date). , . , . ( BigDecimal , 4.0 4.00?). , "" . Comparable.
. , . . : . :
:
Arrays.sort(accountsList):
Arrays.sort(accountsList, accountByValueComparator)
, compareTo UserAccount, - accountByValueComparator. . .
UserAccount implements Comparable<UserAccount> {
@Override
public int compareTo(UserAccount other) { .. }
} , compareTo ? , Comparable#compareTo, Arrays.sort(). jdk, . : UserAccount Arrays.sort(), stream.sorted() .
في حالة تمرير المقارنة بشكل صريح ، فإن العثور على استخدامها أمر تافه. أنا أعتبر هذا حجة لاستخدام المقارنة. (Equals / hashCode هو مثال آخر على صعوبة العثور على الاستخدامات الضمنية ، ولكن لا يوجد بديل "Equalator" لها).
باختصار ، في معظم الحالات ، تفوق الحجج الخاصة باستخدام المقارنة الحجج الخاصة باستخدام المقارنة.