Komparator, ngurutake koleksi - 1

"Halo, Amigo!"

"Hai, Bilaabo!"

"Dina iki kita bakal nliti topik cilik, nanging menarik lan migunani: ngurutake koleksi."

"Ngurutake? Aku wis krungu bab iku."

"Dulu, saben programmer kudu bisa nulis algoritma ngurutake. Bisa lan kudu nulis. Nanging dina-dina iku wis rampung. Dina iki, nulis kode sortir dhewe dianggep ala, kaya nulis maneh apa wae sing wis ana. wis diciptakake."

"Ing Jawa (lan basa pamrograman liyane), ngurutake wis dileksanakake.  Tugas sampeyan yaiku sinau carane nggunakake kanthi bener sing wis ana. "

"Oke."

" Kelas helper Collections nduweni cara ngurutake statis sing digunakake kanggo ngurutake koleksi-utawa luwih tepat, dhaptar. Unsur ing Peta lan Set ora duwe urutan / indeks, mula ora ana sing kudu diurutake."

"Ya, aku kelingan. Aku nggunakake cara iki kanggo ngurutake dhaptar nomer."

"Great. Nanging cara iki luwih kuat saka misale jek ing kawitan marketing. Bisa Ngurutake ora mung nomer, nanging uga sembarang obyek, adhedhasar kritéria sembarang. Loro antarmuka bantuan cara iki: Comparable lan Comparator . "

"Kadhangkala sampeyan kudu ngurutake obyek, ora nomer. Contone, umpamane sampeyan duwe dhaptar wong, lan sampeyan pengin ngurutake miturut umur. Kita duwe antarmuka Comparable kanggo iki."

"Ayo dhisik aku nuduhake conto, banjur kabeh bakal dadi luwih jelas:"

Tuladha
public class Woman implements Comparable<Woman>
{
public int age;

public Woman(int age) {
this.age = age;
}

public int compareTo(Woman o)
{
return this.age - o.age;
}
}
Conto carane bisa digunakake:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Collections.sort(women);
}

"Kanggo ngurutake obyek, sampeyan kudu ngerti carane mbandhingake. Kanggo iki, kita nggunakake Comparable. Antarmuka Comparable iku umum, tegese nampa argumentasi jinis. Iku mung siji cara umum: compareTo (T o). Cara iki mbandhingake obyek saiki (iki) lan obyek sing dilewati minangka argumen (o). Kanthi tembung liyane, kita kudu ngleksanakake metode iki ing kelas kita banjur digunakake kanggo mbandhingake obyek saiki (iki) karo obyek sing dilewati. "

"Lan kepiye carane compareTo bisa digunakake? Aku ngarepake manawa bakal bali bener utawa salah gumantung manawa obyek sing dilewati luwih gedhe utawa luwih cilik."

"Iku trickier kene. Cara compareTo ora bali bener / salah. Nanging, iku ngasilake int. Iki bener rampung kanggo gamblang.

"Nalika komputer kudu nemtokake manawa nomer siji luwih gedhe tinimbang nomer liyane, mula mung nyuda nomer nomer loro saka nomer siji banjur ndeleng asile. Yen asile 0, mula angka kasebut padha. Yen asile kurang saka nol. , banjur nomer loro luwih gedhe. Lan yen asil luwih saka nol, banjur nomer pisanan luwih gedhe."

"Logika sing padha ditrapake ing kene. Miturut spesifikasi, metode compareTo kudu ngasilake nol yen obyek sing dibandhingake padha. method ngasilake angka kurang saka nol, banjur 'iki' kurang saka obyek liwati."

"Iku rada aneh."

"Ya, nanging yen sampeyan mbandhingake obyek mung adhedhasar sawetara properti numerik, sampeyan mung bisa mbalekake bedane kanthi nyuda siji saka liyane. Kaya sing ditindakake ing conto ing ndhuwur."

public int compareTo(Woman o)
{
return this.age - o.age;
}

"Aku rumangsa ngerti kabeh. Nanging bisa uga ora. Nanging meh kabeh."

"Apik. Saiki ayo dipikirake masalah sing luwih praktis. Upamane sampeyan wis nulis situs web sing apik kanggo nggawe sandhangan wanita ing China. Sampeyan nggunakake kelas Wanita kanggo njlèntrèhaké pelanggan sampeyan. Sampeyan malah nggawe kaca web kanthi meja sing bisa ndeleng kabeh. . Nanging ana masalah… "

"Obyek Woman Panjenengan ora mung ngandhut umur, nanging uga akeh data liyane: jeneng ngarep, jeneng mburi, dhuwur, bobot, nomer anak, etc."

"Tabel pangguna akeh kolom, lan iki pitakonan: kepiye sampeyan ngurutake pangguna miturut macem-macem kritéria? Miturut bobot, umur, jeneng mburi?"

"Hmm. Ya, aku kerep ndeleng tabel sing ngidini sampeyan ngurutake miturut kolom. Dadi, kepiye carane?"

"Kanggo iki, kita duwe antarmuka kaloro aku wanted kanggo pitutur marang kowe bab dina iki: antarmuka Comparator. Uga duwe cara mbandhingaké, nanging njupuk loro bantahan, ora siji: int mbandhingaké (T o1, T o2). Punika carane iku. nyambut gawe:"

Tuladha
public class Woman
{
public int age;
public int childrenCount;
public int weight;
public int height;
public String name;

public Woman(int age) {
this.age = age;
}
}
Conto carane bisa digunakake:
public static void main(String[] args )
{
ArrayList<Woman> women = new ArrayList<Woman>();
women.add(new Woman(18));
women.add(new Woman(21));
women.add(new Woman(5));

Comparator<Woman> compareByHeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.height - o2.height;
}
};

Collections.sort(women, compareByHeight);
}

"Antarmuka Comparator ora ndhelikake logika comparison obyek nang kelas obyek sing dibandhingake. Nanging, iku dipun ginakaken ing kelas kapisah."

"Dadi, aku bisa nggawe sawetara kelas sing ngleksanakake antarmuka Comparator, lan saben wong mbandhingake sifat beda? Bobot ing siji, umur ing liyane, lan dhuwur ing katelu?"

"Ya, prasaja banget lan trep."

"Kita mung nelpon metode Collections.sort , ngliwati dhaptar obyek lan obyek khusus liyane minangka argumen kapindho, sing ngetrapake antarmuka Comparator lan ngandhani carane mbandhingake pasangan obyek kanthi bener ing proses ngurutake."

"Hmm. Aku rumangsa ngerti kabeh. Ayo kula nyoba. Ayo dadi ngomong aku kudu ngurutake pangguna miturut bobot. Iku bakal kaya mangkene: "

Conto ngurutake pangguna miturut bobot:
Comparator<Woman> compareByWeight = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.weight - o2.weight;
}
};

Collections.sort(women, compareByWeight);

"Ya, persis."

"Great. Nanging yen aku arep ngurutake ing urutan mbalikke?"

"Coba pikirake. Jawabane prasaja banget!"

"Aku wis entuk! Kaya iki:"

Ngurutake kanthi urutan munggah:
return o1.weight - o2.weight;
Ngurutake ing urutan mudhun:
return o2.weight – o1.weight;

"Inggih. Inggih rampung."

"Lan yen aku arep ngurutake jeneng mburi? Kepiye cara ngurutake senar, Bilaabo?"

"Kelas String wis ngetrapake metode compareTo. Sampeyan mung kudu nelpon:"

Conto ngurutake pangguna miturut jeneng:
Comparator<Woman> compareByName = new Comparator<Woman>() {
public int compare(Woman o1, Woman o2) {
return o1.name.compareTo(o2.name);
}
};

Collections.sort(women, compareByName);

"Iku pelajaran sing apik, Bilaabo. Matur nuwun kanthi sanget."

"Lan matur nuwun kanggo sampeyan, kancaku!"