Массивде же коллекцияда сакталган бир типтеги an objectтерди уюштуруу үчүн Java иштеп чыгуучулары
Объекттердин массивдерин иреттөөнүн эң жөнөкөй жана эң эффективдүү жолдорунун бири
Comparable
. Ал бир гана ыкманы жарыялайт compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Интерфейс Comparable
методдун параметри катары кабыл алган an objectтин түрү боюнча параметрленет compareTo
. Бул учурда, биз компиляторго an objectтердин кандай түрлөрүн салыштыра турганыбызды эскертебиз. Эгерде типти аныктоо шарты аткарылбаса, биз ката алабыз ClassCastException
. Javaдагы метод compareTo
чакыруучу an objectти параметр катары берилген an object менен салыштырат жана салыштыруунун натыйжасында бүтүн санды кайтарат:
- эгерде чакыруучу an object параметр катары берилген an objectтен чоңураак болсо оң;
- терс, эгерде чакыруучу an object параметр катары берилген an objectтен кичине болсо;
- an objectтер бирдей болсо, null.
Эмне үчүн салыштыруу ыкмасы Java үчүн керек?
Java программисти көбүнчө массивдер жана an objectтердин тизмелери менен иштеши керек. Чоң көлөмдөгү маалыматтар менен иштөөдө аны уюшкан же иреттелген түрдө сактоо көбүнчө ыңгайлуу. Биринчиден, керектүү маалыматты издөөдө коллекция менен иштөөнү тездетет, экинчиден, уюшулган маалыматтар визуалдык жактан жакшыраак кабыл алынат.sort()
класс методу Arrays
, ал эми тизме түрүндөгү an objectтердин жыйындысы окшош класстык метод болуп саналат Collections
. Бул ыкмаларды колдонуу менен сорттоо үчүн, Java иштеп чыгуучулары бизге сорттоо критерийлерин кантип аныктоону тандоо эркиндигин беришти: биз Comparable
сорттогубуз келген an objectтердин классында интерфейсти ишке ашыруу же Comparator
. Биринчи учурда, сорттоо ыкмалары массив же тизме түрүндөгү an objectтердин жыйындысын кабыл алат:
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
, .
Салыштырууну классыбызда ишке ашыралы
Классыңызда an objectтерди салыштыруу жөндөмүңүздү кантип түзө аларыңыздын мисалын карап көрөлү. Java ыкмасын ишке ашыруудаcompareto
биз an objectтерди иреттөө үчүн бир же бир нече критерийлерди белгилей алабыз, ошондой эле жана 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илерди табигый иреттөө механизмин түзүүнү абдан жеңилдетет. Java китепканасында сүрөттөлгөн стандарттык класстардын an objectтеринин коллекциялары жана массивдери менен иштөөгө туура келсе, compareTo
бул класстарда даяр ишке ашырууларды колдонуңуз.
GO TO FULL VERSION