Массивте немесе жинақта сақталған бір типті нысандарды ұйымдастыру үшін Java әзірлеушілері
Объектілер массивін сұрыптаудың ең қарапайым және тиімді әдістерінің бірі
Comparable
. Ол тек бір әдісті жариялайды compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Интерфейс Comparable
әдіске параметр ретінде қабылдайтын нысанның түрі бойынша параметрленеді compareTo
. Бұл жағдайда біз компиляторға an objectілердің қандай түрлерін салыстыратынымызды ескертеміз. Егер түр сәйкестендіру шарты орындалмаса, біз қатені аламыз ClassCastException
. Java тіліндегі әдіс compareTo
шақырушы нысанды параметр ретінде берілген нысанмен салыстырады және салыстыру нәтижесінде бүтін санды қайтарады:
- егер шақырушы an object параметр ретінде берілген нысаннан үлкен болса оң;
- егер шақырушы an object параметр ретінде берілген нысаннан кіші болса теріс;
- нысандар тең болса null.
Неліктен Java-да compareTo әдісі қажет?
Java бағдарламалаушысы жиі массивтермен және an objectілер тізімімен айналысады. Мәліметтердің үлкен көлемімен жұмыс істегенде, оны ұйымдасқан немесе сұрыпталған түрде сақтау жиі ыңғайлы. Біріншіден, ол қажетті ақпаратты іздеу кезінде жинақпен жұмыс істеуді тездетеді, екіншіден, ұйымдастырылған деректер визуалды түрде жақсы қабылданады.sort()
класс әдісі болып табылады Arrays
, ал тізім түріндегі an objectілер жиынтығы ұқсас класс әдісі Collections
. Осы әдістерді пайдалана отырып сұрыптау үшін Java әзірлеушілері сұрыптау критерийлерін қалай анықтау керектігін таңдау еркіндігін берді: интерфейсті 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
сұрыптау кезінде an objectілердің табиғи (біздің көзқарасымыз бойынша ең логикалық) тәртібін орнатқымыз келгенде қолданылады. Бұл сондай-ақ жобалау сатысында осы класс an objectілерін салыстыру алгоритмін «қатты сыммен» қосу тәсілі. Мысалы, осы интерфейсті жүзеге асыру арқылы негізгі қарабайыр типтердің орауыш сыныптарында табиғи реттілік критерийлері анықталады: , 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);
}
}
Бұл codeты әдісте орындасақ main
, келесі нәтиже аламыз:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Класстағы мысалда көріп отырғаныңыздай String
, әдіс compareTo
жолдарды алфавиттік, лексикографиялық және регистрді ескере отырып орналастырады. Дәл осы жолды салыстыру тәртібін класс әзірлеушілері String
табиғи деп анықтайды. Лексикографиялық тәртіптің не екенін оңайырақ түсіну үшін тілдік сөздіктерде сөздердің қалай орналасатынын еске түсіру жеткілікті. Сандарды салыстыру кезінде an objectілер өсу ретімен реттеледі. Бұл салыстыру логикасы , , , , , , , , , , , , , , , , , , , , , , , Byte
, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , . Character
Long
Integer
Shor
Double
Float
Салыстыруды сабағымызда жүзеге асырайық
Нысандарды сыныпта салыстыру мүмкіндігін құрудың мысалын қарастырайық. Java әдісін енгізу кезіндеcompareto
біз нысандарды ретке келтіру үшін бір немесе бірнеше критерийлерді белгілей аламыз, сондай-ақ және compareto
сыныптарындағы әдістерді пайдалана аламыз . Мысалы, сынып an objectілері үшін атау бойынша сұрыптауды, ал атаулар бірдей болған жағдайда жас бойынша сұрыптауды орнатамыз. Объектілер табиғи ретімен орналасады (мән өскен сайын). Сынып : 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'}
Сонымен, қорытындылайық. Егер сіз барлық нәрседе тәртіпті жақтасаңыз және an objectілеріңізді массивте немесе тізімде қажетсіз codeсыз реттегіңіз келсе, интерфейсті пайдаланыңыз Comparable
. Оның compareTo әдісін іске асыру сыныптағы an objectілерді табиғи ретке келтіру механизмін құруды айтарлықтай жеңілдетеді. compareTo
Java кітапханасында сипатталған стандартты класстардың an objectілерінің жинақтарымен және массивтерімен жұмыс істеу керек болса, осы сыныптарда дайын іске асыруларды пайдаланыңыз .
GO TO FULL VERSION