لتنظيم الكائنات من نفس النوع المخزنة في مصفوفة أو مجموعة، توصل مطورو Java إلى
واحدة من أبسط الطرق وأكثرها فعالية لفرز مصفوفة من الكائنات هي طريقة
Comparable
. تعلن طريقة واحدة فقط compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
يتم تحديد معلمات الواجهة Comparable
حسب نوع الكائن الذي تقبله كمعلمة للطريقة compareTo
. في هذه الحالة، نحذر المترجم من أنواع الكائنات التي سنقوم بمقارنتها. إذا لم يتم استيفاء شرط هوية النوع، فسوف نتلقى خطأ ClassCastException
. تقوم إحدى الطرق compareTo
في Java بمقارنة كائن الاستدعاء مع الكائن الذي تم تمريره كمعلمة وإرجاع عدد صحيح نتيجة للمقارنة:
- موجب إذا كان الكائن المستدعي أكبر من الكائن الذي تم تمريره كمعلمة؛
- سلبي إذا كان الكائن المستدعي أصغر من الكائن الذي تم تمريره كمعلمة؛
- فارغة إذا كانت الكائنات متساوية.
لماذا هناك حاجة إلى طريقة CompareTo في Java؟
غالبًا ما يتعين على مبرمج Java التعامل مع المصفوفات وقوائم الكائنات. عند التعامل مع كميات كبيرة من البيانات، غالبًا ما يكون من المناسب تخزينها في شكل منظم أو مرتب. أولا، يعمل على تسريع العمل مع المجموعة عند البحث عن المعلومات اللازمة، وثانيا، يتم إدراك البيانات المنظمة بشكل أفضل بصريا.sort()
الفئة Arrays
، ومجموعة الكائنات في شكل قائمة هي طريقة فئة مماثلة Collections
. للفرز باستخدام هذه الأساليب، منحنا مطورو Java حرية اختيار كيفية تحديد معايير الفرز: من خلال تطبيق الواجهة Comparable
في فئة الكائنات التي نريد فرزها، أو باستخدام ملحق Comparator
. في الحالة الأولى، تقبل طرق الفرز مجموعة من الكائنات على شكل مصفوفة أو قائمة:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
وفي الثانية - بالإضافة إلى تطبيق آخر للواجهة Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
يتم استخدام الواجهة Comparable
عندما نريد تعيين ترتيب طبيعي (الأكثر منطقية من وجهة نظرنا) للكائنات عند الفرز. إنها أيضًا طريقة "لربط" الخوارزمية لمقارنة كائنات هذه الفئة في مرحلة التصميم. على سبيل المثال، باستخدام تطبيق هذه الواجهة، يتم تحديد معايير الترتيب الطبيعي في فئات المجمع للأنواع البدائية الرئيسية : , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
. وهذا يعني أيضًا أن هذه الفئات لديها طريقة مطبقة يمكننا استخدامها في البرنامج إذا لزم الأمر. دعونا نلقي نظرة على مثال لمقارنة السلسلة لنرى كيف يتم تنفيذ هذه الطريقة في الفصل . Boolean
String
compareTo
String
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
إذا قمنا بتنفيذ هذا الكود في الطريقة main
فسنحصل على النتيجة التالية:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
كما ترون في المثال الموجود في الفصل الدراسي String
، تقوم الطريقة compareTo
بترتيب السلاسل أبجديًا ومعجميًا وحساسًا لحالة الأحرف. هذا هو ترتيب مقارنة السلسلة الذي يحدده مطورو الفئة String
على أنه أمر طبيعي. لفهم أبسط ما هو الترتيب المعجمي، يكفي أن نتذكر كيفية ترتيب الكلمات في قواميس اللغة. عند مقارنة الأرقام، يتم ترتيب الأشياء بترتيب تصاعدي. تم تضمين منطق المقارنة هذا في الفئات Byte
, Character
, Long
, Integer
, Shor
, Double
.Float
دعونا ننفذ المقارنة في صفنا
دعونا نلقي نظرة على مثال لكيفية بناء القدرة على مقارنة الكائنات في صفك. عند تنفيذcompareto
طريقة Java، يمكننا تحديد معيار واحد أو أكثر لترتيب الكائنات، وكذلك استخدام الأساليب compareto
من الفئات String
والفئات Integer
. على سبيل المثال، بالنسبة لكائنات الفئة، User
نقوم بالفرز حسب الاسم، وفي حالة الأسماء المتساوية، حسب العمر. سيتم ترتيب الكائنات بترتيبها الطبيعي (مع زيادة القيمة). فصل User
:
public class User implements Comparable <User>{//добавляем возможность сравнивать an objectы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
لنختبر تشغيل الطريقة compareTo
المطبقة في الفصل User
باستخدام طريقة sort
الفصل Collections
:
public static void main(String[] args) {
User user = new User("Andrey", 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User("Andrey", 24,"opr@google.com");
User user4 = new User("Igor", 16, "igor@mail.ru");
User user5 = new User("Andrey", 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
نتيجة الطريقة main
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
لذلك، دعونا نلخص. إذا كنت مؤيدًا للنظام في كل شيء وترغب في ترتيب الكائنات الخاصة بك في مصفوفة أو قائمة بدون تعليمات برمجية غير ضرورية، فاستخدم الواجهة Comparable
. إن تطبيق أسلوب المقارنة الخاص به يجعل من السهل جدًا إنشاء آلية لترتيب الكائنات بشكل طبيعي في فصلك. إذا كان عليك العمل مع مجموعات ومصفوفات كائنات الفئات القياسية الموضحة في مكتبة Java، فاستخدم التطبيقات الجاهزة compareTo
في هذه الفئات.
GO TO FULL VERSION