Massiv yoki kollektsiyada saqlangan bir xil turdagi ob'ektlarni tartibga solish uchun Java dasturchilari
Ob'ektlar massivini saralashning eng oddiy va samarali usullaridan biri bu
Comparable
. U faqat bitta usulni e'lon qiladi compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Interfeys, Comparable
u usulga parametr sifatida qabul qilgan ob'ekt turiga qarab parametrlanadi compareTo
. Bunday holda, biz kompilyatorni qaysi turdagi ob'ektlarni solishtirmoqchi ekanligimiz haqida ogohlantiramiz. Agar tur identifikatori sharti bajarilmasa, biz xato qilamiz ClassCastException
. Java'dagi usul compareTo
chaqiruvchi ob'ektni parametr sifatida berilgan ob'ekt bilan taqqoslaydi va taqqoslash natijasida butun sonni qaytaradi:
- agar chaqiruvchi ob'ekt parametr sifatida berilgan ob'ektdan katta bo'lsa ijobiy;
- agar chaqiruvchi ob'ekt parametr sifatida berilgan ob'ektdan kichik bo'lsa salbiy;
- ob'ektlar teng bo'lsa null.
Nima uchun Java'da compareTo usuli kerak?
Java dasturchisi ko'pincha massivlar va ob'ektlar ro'yxati bilan shug'ullanishi kerak. Katta hajmdagi ma'lumotlar bilan ishlashda ularni tartiblangan yoki tartiblangan shaklda saqlash qulay. Birinchidan, kerakli ma'lumotlarni qidirishda to'plam bilan ishlashni tezlashtiradi, ikkinchidan, tashkil etilgan ma'lumotlar vizual ravishda yaxshiroq qabul qilinadi.sort()
sinf usuli Arrays
, ro'yxat ko'rinishidagi ob'ektlar to'plami esa shunga o'xshash sinf usulidir Collections
. Ushbu usullardan foydalangan holda saralash uchun Java dasturchilari bizga tartiblash mezonlarini qanday belgilashni tanlash erkinligini berdilar: interfeysni biz Comparable
saralashni xohlagan ob'ektlar sinfida amalga oshirish yoki Comparator
. Birinchi holda, saralash usullari ob'ektlar to'plamini massiv yoki ro'yxat shaklida qabul qiladi:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
va ikkinchisida - ortiqcha interfeysning yana bir amalga oshirilishi Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Interfeys Comparable
biz saralashda ob'ektlarning tabiiy (bizning nuqtai nazarimizdan eng mantiqiy) tartibini o'rnatmoqchi bo'lganimizda ishlatiladi. Bu, shuningdek, dizayn bosqichida ushbu sinf ob'ektlarini taqqoslash algoritmini "qattiq simli" qilish usulidir. Masalan, ushbu interfeysni amalga oshirishdan foydalanib, asosiy ibtidoiy turlarning o'rash sinflarida tabiiy tartiblash mezonlari aniqlanadi : , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
. Bu shuni anglatadiki, bu sinflarda kerak bo'lganda dasturda foydalanishimiz mumkin bo'lgan amalga oshirilgan usul mavjud. Ushbu usul sinfda qanday qo'llanilishini ko'rish uchun satrlarni taqqoslash misolini ko'rib chiqaylik . 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);
}
}
Agar biz ushbu kodni usulida bajarsak main
, biz quyidagi natijaga erishamiz:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Sinfdagi misolda ko'rib turganingizdek String
, usul compareTo
satrlarni alifbo, leksikografik va katta-kichik harflarga qarab tartibga soladi. Sinf ishlab chiquvchilari tomonidan String
tabiiy deb belgilangan qatorlarni taqqoslashning mana shu tartibi. Leksikografik tartib nima ekanligini soddaroq tushunish uchun til lug'atlarida so'zlarning qanday joylashishini eslab qolish kifoya. Raqamlarni taqqoslashda ob'ektlar o'sish tartibida tartibga solinadi. Bu taqqoslash mantig'i , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , Byte
, , Character
, , Long
, , , , Integer
, , , , , , , , , , , , Shor
, , , Double
, , sinflar ichiga kiritilgan Float
.
Keling, sinfimizda taqqoslashni amalga oshiramiz
Keling, sinfingizdagi ob'ektlarni solishtirish qobiliyatini qanday yaratishingiz mumkinligi haqidagi misolni ko'rib chiqaylik. Java usulini amalga oshirishdacompareto
biz ob'ektlarni buyurtma qilish uchun bir yoki bir nechta mezonlarni belgilashimiz mumkin, shuningdek, va compareto
sinflaridan usullardan foydalanishimiz mumkin . Masalan, sinf ob'ektlari uchun biz nomlar bo'yicha, nomlar teng bo'lsa, yosh bo'yicha tartiblashni o'rnatamiz. Ob'ektlar tabiiy tartibda joylashtiriladi (qiymat ortishi bilan). Sinf : 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 + '\'' +
'}';
}
Sinf usuli yordamida compareTo
sinfda amalga oshirilgan usulning ishlashini sinab ko'raylik : 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);
}
}
}
}
Usulning natijasi 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'}
Shunday qilib, keling, xulosa qilaylik. Agar siz hamma narsada tartib tarafdori bo'lsangiz va ob'ektlaringizni massiv yoki ro'yxatda keraksiz kodsiz tartibga solishni istasangiz, interfeysdan foydalaning Comparable
. Uning compareTo usulini amalga oshirish sizning sinfingizdagi ob'ektlarni tabiiy tartiblash mexanizmini yaratishni juda oson qiladi. Agar siz Java kutubxonasida tasvirlangan standart sinf ob'ektlari to'plamlari va massivlari bilan ishlashingiz kerak bo'lsa, compareTo
ushbu sinflarda tayyor ilovalardan foydalaning.
GO TO FULL VERSION