JavaRush /مدونة جافا /Random-AR /طريقة المقارنة

طريقة المقارنة

نشرت في المجموعة
لتنظيم الكائنات من نفس النوع المخزنة في مصفوفة أو مجموعة، توصل مطورو Java إلى Comparable. تعلن طريقة واحدة فقط compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
طريقة المقارنة - 1يتم تحديد معلمات الواجهة Comparableحسب نوع الكائن الذي تقبله كمعلمة للطريقة compareTo. في هذه الحالة، نحذر المترجم من أنواع الكائنات التي سنقوم بمقارنتها. إذا لم يتم استيفاء شرط هوية النوع، فسوف نتلقى خطأ ClassCastException. تقوم إحدى الطرق compareToفي Java بمقارنة كائن الاستدعاء مع الكائن الذي تم تمريره كمعلمة وإرجاع عدد صحيح نتيجة للمقارنة:
  • موجب إذا كان الكائن المستدعي أكبر من الكائن الذي تم تمريره كمعلمة؛
  • سلبي إذا كان الكائن المستدعي أصغر من الكائن الذي تم تمريره كمعلمة؛
  • فارغة إذا كانت الكائنات متساوية.
إن كتابة منطق مقارنة الكائنات هو الاهتمام الوحيد لمطور الفئة ويتم تحديده من خلال النتائج المطلوبة للطلب.

لماذا هناك حاجة إلى طريقة CompareTo في Java؟

غالبًا ما يتعين على مبرمج Java التعامل مع المصفوفات وقوائم الكائنات. عند التعامل مع كميات كبيرة من البيانات، غالبًا ما يكون من المناسب تخزينها في شكل منظم أو مرتب. أولا، يعمل على تسريع العمل مع المجموعة عند البحث عن المعلومات اللازمة، وثانيا، يتم إدراك البيانات المنظمة بشكل أفضل بصريا.
طريقة المقارنة - 2
واحدة من أبسط الطرق وأكثرها فعالية لفرز مصفوفة من الكائنات هي طريقة 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. وهذا يعني أيضًا أن هذه الفئات لديها طريقة مطبقة يمكننا استخدامها في البرنامج إذا لزم الأمر. دعونا نلقي نظرة على مثال لمقارنة السلسلة لنرى كيف يتم تنفيذ هذه الطريقة في الفصل . BooleanStringcompareToString
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في هذه الفئات.
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION