Bir massiwde ýa-da kolleksiýada saklanýan şol bir görnüşdäki obýektleri tertiplemek üçin Java döredijiler tapdylar
Obýektleriň toplumyny tertipleşdirmegiň iň ýönekeý we täsirli usullaryndan biri synp usulydyr
Comparable
. Diňe bir usuly yglan edýär compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Interfeýs, Comparable
usula parametr hökmünde kabul edýän obýektiň görnüşi bilen parametrleşdirilýär compareTo
. Bu ýagdaýda, haýsy obýektleri deňeşdirjekdigimizi düzüjä duýduryş berýäris. Görnüşiň şahsyýet şerti ýerine ýetirilmese, ýalňyşlyk alarys ClassCastException
. Java-da bir usul, compareTo
çagyryş obýektini parametr hökmünde kabul edilen obýekt bilen deňeşdirýär we deňeşdirmegiň netijesinde bitewi san görkezýär:
- çagyryş obýekti parametr hökmünde geçen obýektden has uly bolsa polo positiveitel;
- çagyryş obýekti parametr hökmünde geçen obýektden kiçi bolsa negatiw;
- obýektler deň bolsa null.
Java-da näme üçin deňeşdirmek usuly gerek?
Java programmisti ýygy-ýygydan obýektleriň sanawlary we sanawlary bilen iş salyşmaly bolýar. Köp mukdarda maglumatlar bilen işleýän wagtyňyz ony köplenç tertipli ýa-da tertipli görnüşde saklamak amatly. Birinjiden, zerur maglumatlary gözläniňizde kolleksiýa bilen işlemegi çaltlaşdyrýar, ikinjiden, guramaçylykly maglumatlar has gowy kabul edilýär.sort()
we Arrays
sanaw görnüşindäki obýektleriň ýygyndysy şuňa meňzeş synp usulydyr Collections
. Bu usullary ulanmak bilen tertiplemek üçin, Java döredijiler bize tertipleşdirmegiň ölçeglerini nädip kesgitlemelidigini saýlamaga erkinlik berdiler: Comparable
tertiplemek isleýän obýektlerimiziň synpyna interfeýsi ornaşdyrmak ýa-da ulanmak arkaly Comparator
. Birinji ýagdaýda tertipleşdirmek usullary, massiw ýa-da sanaw görnüşinde obýektleriň toplumyny kabul edýär:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
ikinjisinde - goşmaça interfeýsiň ýerine ýetirilişi Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Interfeýs, Comparable
tertiplenende obýektleriň tebigy (biziň nukdaýnazarymyzdan iň logiki) tertibini bellemek islänimizde ulanylýar. Şeýle hem dizaýn tapgyrynda bu synpyň obýektlerini deňeşdirmek üçin algoritmi “gaty sim” etmegiň usulydyr. Mysal üçin , bu interfeýsiň ýerine ýetirilişini ulanyp , esasy başlangyç görnüşleriň örtük synplarynda tebigy sargyt etmegiň ölçegleri kesgitlenýär : Byte
,,,,,,,, . Bu, bu synplaryň zerur bolsa programmada ulanyp boljak ýerine ýetirilen usulynyň bardygyny aňladýar . Bu usulyň synpda nähili durmuşa geçirilýändigini görmek üçin setir deňeşdirmesiniň mysalyna seredeliň . 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);
}
}
Bu kody usul bilen ýerine ýetirsek main
, aşakdaky netijäni alarys:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Synpdaky mysaldan görnüşi ýaly String
, usul compareTo
setirleri elipbiý, leksikografiki we baş harplar bilen tertipleýär. Hut şu deňeşdirme tertibi synpy döredijiler tarapyndan String
tebigy diýip kesgitlenýär. Leksikografiki tertipiň nämedigine has ýönekeý düşünmek üçin sözleriň dil sözlüklerinde nähili ýerleşdirilendigini ýatda saklamak ýeterlikdir. Sanlar deňeşdirilende obýektler ýokarlanýan tertipde sargyt edilýär. Bu deňeşdirme logikasy Byte
,,,,,, . Character
_ Long
_ Integer
_Shor
Double
Float
Deňeşdirmäni synpymyzda durmuşa geçireliň
Obýektleri synpyňyz bilen deňeşdirmek ukybyny nädip gurup boljakdygynyň bir mysalyna seredeliň. Java usuly durmuşa geçirilendecompareto
, obýektleri sargyt etmegiň bir ýa-da birnäçe ölçegini kesgitläp bileris, şeýle hem synplardan we usullary compareto
ulanyp String
bileris Integer
. Mysal üçin, synp obýektleri üçin User
atlar boýunça, deň atlar bolsa ýaş boýunça tertipleşdirýäris. Obýektler tebigy tertipde tertipleşdiriler (bahasy ýokarlanýar). Synp 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 + '\'' +
'}';
}
Synp usuly bilen compareTo
synpda ýerine ýetirilen usulyň işleýşini synap göreliň : 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);
}
}
}
}
Usulyň netijesi 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'}
Geliň, jemläliň. Everythinghli zatda tertip-düzgüni goldaýan bolsaňyz we zatlaryňyzy massiwde ýa-da gereksiz kodsyz tertipleşdirmek isleseňiz, interfeýsi ulanyň Comparable
. Deňeşdirmek usulynyň ýerine ýetirilmegi, synpyňyzdaky zatlary tebigy sargyt etmegiň mehanizminde gurmagy aňsatlaşdyrýar. Java kitaphanasynda beýan edilen adaty synplaryň ýygyndylary we massiwleri bilen işlemeli bolsaňyz, compareTo
bu synplarda taýýar amallary ulanyň.
GO TO FULL VERSION