Massivdə və ya kolleksiyada saxlanılan eyni tipli obyektləri təşkil etmək üçün Java tərtibatçıları
Obyektlər massivinin çeşidlənməsinin ən sadə və effektiv üsullarından biri
Comparable
. Yalnız bir metodu elan edir compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
İnterfeys Comparable
metodun parametri kimi qəbul etdiyi obyektin növü ilə parametrləşdirilir compareTo
. Bu halda biz kompilyatora hansı tip obyektləri müqayisə edəcəyimizi xəbərdar edirik. Əgər növün identifikasiyası şərti yerinə yetirilmirsə, xəta alacağıq ClassCastException
. Java-da metod compareTo
çağıran obyekti parametr kimi ötürülən obyektlə müqayisə edir və müqayisə nəticəsində tam ədədi qaytarır:
- çağıran obyekt parametr kimi verilən obyektdən böyükdürsə müsbət;
- çağıran obyekt parametr kimi ötürülən obyektdən kiçikdirsə mənfi;
- obyektlər bərabər olduqda null.
Niyə Java-da compareTo metoduna ehtiyac var?
Java proqramçısı çox vaxt massivlər və obyektlərin siyahıları ilə məşğul olur. Böyük həcmli məlumatlarla işləyərkən, onları mütəşəkkil və ya çeşidlənmiş formada saxlamaq çox vaxt rahatdır. Birincisi, lazımi məlumatları axtararkən kolleksiya ilə işləməyi sürətləndirir, ikincisi, təşkil edilmiş məlumatlar vizual olaraq daha yaxşı qəbul edilir.sort()
sinif metodudur Arrays
və siyahı şəklində olan obyektlərin toplusu isə oxşar sinif metodudur Collections
. Bu üsullardan istifadə edərək çeşidləmək üçün Java tərtibatçıları bizə çeşidləmə meyarlarını necə təyin edəcəyimizi seçmək azadlığı verdilər: interfeysi Comparable
çeşidləmək istədiyimiz obyektlər sinfində tətbiq etməklə və ya Comparator
. Birinci halda, çeşidləmə metodları massiv və ya siyahı şəklində bir sıra obyektləri qəbul edir:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
və ikinci üstəgəl interfeysin başqa bir tətbiqi Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
İnterfeys Comparable
çeşidləmə zamanı obyektlərin təbii (bizim nöqteyi-nəzərimizdən ən məntiqli) sırasını təyin etmək istədiyimiz zaman istifadə olunur. Bu, həm də dizayn mərhələsində bu sinif obyektlərini müqayisə etmək üçün alqoritmi “sabit tellə bağlamaq” üsuludur. Məsələn, bu interfeysin həyata keçirilməsindən istifadə edərək, əsas primitiv növlərin sarğı siniflərində təbii sıralanma meyarları müəyyən edilir: , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
, Boolean
. Bu həm də o deməkdir ki, bu siniflərdə lazım gəldikdə proqramda istifadə edə biləcəyimiz String
həyata keçirilmiş metod var . Bu metodun sinifdə necə tətbiq olunduğunu görmək üçün sətirlərin müqayisəsicompareTo
nümunəsinə baxaq . 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);
}
}
Bu kodu metodda icra etsək main
, aşağıdakı nəticəni alacağıq:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Sinifdəki misalda gördüyünüz kimi String
, üsul compareTo
sətirləri əlifba, leksikoqrafik və hərf hərfinə həssaslıqla düzür. String
Sinfin tərtibatçıları tərəfindən təbii olaraq təyin olunan simli müqayisənin bu sırasıdır . Leksikoqrafiya sırasının nə olduğunu daha sadə başa düşmək üçün dil lüğətlərində sözlərin necə düzüldüyünü xatırlamaq kifayətdir. Rəqəmləri müqayisə edərkən cisimlər artan ardıcıllıqla sıralanır. Byte
Bu müqayisə məntiqi , Character
, Long
, , Integer
, Shor
, Double
, siniflərində yerləşdirilmişdir Float
.
Müqayisəni sinfimizdə həyata keçirək
Öz sinifinizdə obyektləri müqayisə etmək bacarığını necə qura biləcəyiniz nümunəsinə baxaq. Java metodunu tətbiq edərkəncompareto
biz obyektlərin sifarişi üçün bir və ya bir neçə meyar təyin edə, həmçinin və compareto
siniflərindən metodlardan istifadə edə bilərik . Məsələn, sinif obyektləri üçün adla, eyni adlar olduqda isə yaşa görə çeşidləmə təyin edirik. Obyektlər təbii qaydada yerləşdiriləcək (dəyər artdıqca). Sinif : 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 + '\'' +
'}';
}
Sinif metodundan istifadə edərək compareTo
sinifdə tətbiq olunan metodun işini yoxlayaq : 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);
}
}
}
}
Metodun nəticəsi 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'}
Beləliklə, ümumiləşdirək. Əgər siz hər şeydə nizamın tərəfdarısınızsa və obyektlərinizi lazımsız kod olmadan massiv və ya siyahıda yerləşdirmək istəyirsinizsə, interfeysdən istifadə edin Comparable
. Onun compareTo metodunun tətbiqi sinifinizdə obyektləri təbii qaydada sifariş etmək üçün mexanizm qurmağı çox asanlaşdırır. Java kitabxanasında təsvir edilmiş standart sinif obyektlərinin kolleksiyaları və massivləri ilə işləmək məcburiyyətindəsinizsə, compareTo
bu siniflərdə hazır tətbiqlərdən istifadə edin.
GO TO FULL VERSION