برای سازماندهی اشیا از همان نوع ذخیره شده در یک آرایه یا مجموعه، توسعه دهندگان جاوا با
یکی از سادهترین و مؤثرترین راهها برای مرتبسازی آرایهای از اشیاء، متد
Comparable
. فقط یک روش را اعلام می کند compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
یک اینترفیس Comparable
بر اساس نوع شیئی که به عنوان پارامتر متد می پذیرد پارامتر بندی می شود compareTo
. در این صورت به کامپایلر هشدار می دهیم که قرار است چه نوع اشیایی را با هم مقایسه کنیم. اگر شرط هویت نوع برآورده نشود، یک خطا دریافت خواهیم کرد ClassCastException
. یک متد compareTo
در جاوا شیء فراخوان را با شیء ارسال شده به عنوان پارامتر مقایسه می کند و در نتیجه مقایسه یک عدد صحیح را برمی گرداند:
- اگر شیء فراخوان بزرگتر از شیء ارسال شده به عنوان پارامتر باشد مثبت است.
- اگر شیء فراخوان کوچکتر از شیء ارسال شده به عنوان پارامتر باشد منفی است.
- اگر اشیاء برابر باشند، تهی است.
چرا متد compareTo در جاوا مورد نیاز است؟
یک برنامه نویس جاوا اغلب مجبور است با آرایه ها و لیستی از اشیا سر و کار داشته باشد. هنگام کار با مقادیر زیاد داده، اغلب راحت است که آنها را به شکل سازمان یافته یا مرتب شده ذخیره کنید. اولاً هنگام جستجوی اطلاعات لازم کار با مجموعه را سرعت می بخشد و ثانیاً داده های سازمان یافته از نظر بصری بهتر درک می شوند.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
. این همچنین به این معنی است که این کلاس ها یک متد پیاده سازی شده دارند که در صورت لزوم می توانیم از آن در برنامه استفاده کنیم. بیایید به مثالی از مقایسه رشته ها نگاه کنیم تا ببینیم این متد چگونه در کلاس پیاده سازی می شود . 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
متد جاوا، میتوانیم یک یا چند معیار را برای مرتب کردن اشیا مشخص کنیم و همچنین از متدهایی 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
در این کلاس ها استفاده کنید.
GO TO FULL VERSION