JavaRush /وبلاگ جاوا /Random-FA /روش مقایسه با

روش مقایسه با

در گروه منتشر شد
برای سازماندهی اشیا از همان نوع ذخیره شده در یک آرایه یا مجموعه، توسعه دهندگان جاوا با Comparable. فقط یک روش را اعلام می کند compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
روش مقایسه با - 1یک اینترفیس Comparableبر اساس نوع شیئی که به عنوان پارامتر متد می پذیرد پارامتر بندی می شود compareTo. در این صورت به کامپایلر هشدار می دهیم که قرار است چه نوع اشیایی را با هم مقایسه کنیم. اگر شرط هویت نوع برآورده نشود، یک خطا دریافت خواهیم کرد ClassCastException. یک متد compareToدر جاوا شیء فراخوان را با شیء ارسال شده به عنوان پارامتر مقایسه می کند و در نتیجه مقایسه یک عدد صحیح را برمی گرداند:
  • اگر شیء فراخوان بزرگتر از شیء ارسال شده به عنوان پارامتر باشد مثبت است.
  • اگر شیء فراخوان کوچکتر از شیء ارسال شده به عنوان پارامتر باشد منفی است.
  • اگر اشیاء برابر باشند، تهی است.
نوشتن منطق مقایسه شی تنها دغدغه توسعه‌دهنده کلاس است و بر اساس نتایج دلخواه سفارش تعیین می‌شود.

چرا متد compareTo در جاوا مورد نیاز است؟

یک برنامه نویس جاوا اغلب مجبور است با آرایه ها و لیستی از اشیا سر و کار داشته باشد. هنگام کار با مقادیر زیاد داده، اغلب راحت است که آنها را به شکل سازمان یافته یا مرتب شده ذخیره کنید. اولاً هنگام جستجوی اطلاعات لازم کار با مجموعه را سرعت می بخشد و ثانیاً داده های سازمان یافته از نظر بصری بهتر درک می شوند.
روش مقایسه با - 2
یکی از ساده‌ترین و مؤثرترین راه‌ها برای مرتب‌سازی آرایه‌ای از اشیاء، متد sort()کلاس است Arraysو مجموعه‌ای از اشیاء در قالب یک لیست، یک متد کلاس مشابه است Collections. برای مرتب‌سازی با استفاده از این روش‌ها، توسعه‌دهندگان جاوا به ما این آزادی را دادند که نحوه تعیین معیارهای مرتب‌سازی را انتخاب کنیم: با پیاده‌سازی رابط 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زمانی استفاده می شود که بخواهیم در هنگام مرتب سازی یک ترتیب طبیعی (منطقی ترین از دیدگاه ما) اشیا را تنظیم کنیم. همچنین راهی برای "سیم سخت" الگوریتم برای مقایسه اشیاء این کلاس در مرحله طراحی است. به عنوان مثال، با استفاده از پیاده سازی این رابط، معیارهای نظم طبیعی در کلاس های wrapper انواع اولیه اصلی تعریف می شود: , , 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متد جاوا، می‌توانیم یک یا چند معیار را برای مرتب کردن اشیا مشخص کنیم و همچنین از متدهایی 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. پیاده سازی متد compareTo ساخت مکانیزمی برای مرتب کردن طبیعی اشیاء در کلاس شما را بسیار آسان می کند. اگر باید با مجموعه ها و آرایه های اشیاء کلاس های استاندارد که در کتابخانه جاوا توضیح داده شده اند کار کنید، از پیاده سازی های آماده compareToدر این کلاس ها استفاده کنید.
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION