Upang ayusin ang mga bagay na may parehong uri na naka-imbak sa isang array o koleksyon, ang mga developer ng Java ay gumawa ng
Ang isa sa pinakasimple at pinakaepektibong paraan upang pagbukud-bukurin ang isang hanay ng mga bagay ay ang pamamaraan
Comparable
. Ito ay nagpapahayag lamang ng isang paraan compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Ang isang interface Comparable
ay na-parameter ayon sa uri ng bagay na tinatanggap nito bilang isang parameter sa pamamaraan compareTo
. Sa kasong ito, binabalaan namin ang compiler kung anong mga uri ng mga bagay ang aming ihahambing. Kung hindi natugunan ang kundisyon ng pagkakakilanlan ng uri, makakatanggap kami ng error ClassCastException
. Ang isang pamamaraan compareTo
sa Java ay naghahambing ng object sa pagtawag sa object na ipinasa bilang isang parameter at nagbabalik ng isang integer bilang isang resulta ng paghahambing:
- positibo kung ang tumatawag na bagay ay mas malaki kaysa sa bagay na ipinasa bilang isang parameter;
- negatibo kung ang tumatawag na bagay ay mas maliit kaysa sa bagay na ipinasa bilang isang parameter;
- null kung ang mga bagay ay pantay.
Bakit kailangan ng compareTo method sa Java?
Ang isang Java programmer ay madalas na humarap sa mga arrays at listahan ng mga bagay. Kapag nagtatrabaho sa malalaking halaga ng data, madalas na maginhawang iimbak ito sa isang organisado o pinagsunod-sunod na anyo. Una, pinapabilis nito ang pagtatrabaho sa koleksyon kapag naghahanap ng kinakailangang impormasyon, at pangalawa, ang organisadong data ay mas nakikitang mas nakikita.sort()
ng klase Arrays
, at ang isang koleksyon ng mga bagay sa anyo ng isang listahan ay isang katulad na paraan ng klase Collections
. Upang pag-uri-uriin gamit ang mga pamamaraang ito, binigyan kami ng mga developer ng Java ng kalayaan na pumili kung paano tukuyin ang pamantayan sa pag-uuri: sa pamamagitan ng pagpapatupad ng interface Comparable
sa klase ng mga bagay na gusto naming pag-uri-uriin, o sa pamamagitan ng paggamit ng Comparator
. Sa unang kaso, ang mga paraan ng pag-uuri ay tumatanggap ng isang hanay ng mga bagay sa anyo ng isang array o listahan:
sort(T[]array)//sorting массива
sort(List<T> list)// sorting списка
at sa pangalawa - kasama ang isa pang pagpapatupad ng interface Comparator
:
sort(T[]array, Comparator <? super T> comparator)//sorting массива
sort(List<T> list, Comparator <? super T> comparator)// sorting списка
Ang interface Comparable
ay ginagamit kapag gusto naming magtakda ng natural (ang pinaka-lohikal mula sa aming pananaw) na pagkakasunud-sunod ng mga bagay kapag nag-uuri. Ito rin ay isang paraan upang "hardwire" ang algorithm para sa paghahambing ng mga bagay ng klase na ito sa yugto ng disenyo. Halimbawa, gamit ang pagpapatupad ng interface na ito, ang pamantayan para sa natural na pag-order sa mga klase ng wrapper ng mga pangunahing primitive na uri ay tinukoy: , , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
. Nangangahulugan din ito na ang mga klase na ito ay may ipinatupad na pamamaraan na magagamit natin sa programa kung kinakailangan. Tingnan natin ang isang halimbawa ng paghahambing ng string upang makita kung paano ipinapatupad ang pamamaraang ito sa klase . 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);
}
}
Kung ipapatupad namin ang code na ito sa pamamaraan main
, makukuha namin ang sumusunod na resulta:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Tulad ng makikita mo sa halimbawa sa klase String
, inaayos ng pamamaraan ang compareTo
mga string ayon sa alpabeto, lexicographically, at case-sensitive. Ito ang pagkakasunud-sunod ng paghahambing ng string na tinukoy ng mga developer ng klase String
bilang natural. Para sa isang mas simpleng pag-unawa sa kung ano ang pagkakasunud-sunod ng leksikograpikal, sapat na alalahanin kung paano inayos ang mga salita sa mga diksyunaryo ng wika. Kapag naghahambing ng mga numero, ang mga bagay ay inayos sa pataas na pagkakasunud-sunod. Ang lohika ng paghahambing na ito ay naka-embed sa mga klase Byte
, Character
, Long
, Integer
, Shor
, Double
, Float
.
Ipatupad natin ang paghahambing sa ating klase
Tingnan natin ang isang halimbawa kung paano mo mabubuo ang kakayahang maghambing ng mga bagay sa iyong klase. Kapag nagpapatupad ng isangcompareto
pamamaraan ng Java, maaari naming tukuyin ang isa o higit pang pamantayan para sa pag-order ng mga bagay, at gumamit din ng mga pamamaraan compareto
mula sa String
at mga klase Integer
. Halimbawa, para sa mga bagay sa klase, User
itinakda namin ang pag-uuri ayon sa pangalan, at sa kaso ng magkaparehong mga pangalan, ayon sa edad. Ang mga bagay ay isasaayos sa kanilang natural na pagkakasunud-sunod (habang tumataas ang halaga). klase 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 + '\'' +
'}';
}
Subukan natin ang pagpapatakbo ng pamamaraang compareTo
ipinatupad sa klase User
gamit ang pamamaraan sort
ng klase 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);
}
}
}
}
Resulta ng pamamaraan 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'}
Kaya, sabihin summarize. Kung ikaw ay isang tagasuporta ng kaayusan sa lahat ng bagay at nais mong ayusin ang iyong mga bagay sa isang array o listahan nang walang hindi kinakailangang code, gamitin ang interface Comparable
. Ang pagpapatupad ng paraan ng compareTo nito ay ginagawang medyo madali ang pagbuo sa isang mekanismo para sa natural na pag-order ng mga bagay sa iyong klase. Kung kailangan mong magtrabaho sa mga koleksyon at array ng mga bagay ng karaniwang mga klase na inilarawan sa library ng Java, gumamit ng mga handa na pagpapatupad compareTo
sa mga klase na ito.
GO TO FULL VERSION