Hello! Dina iki kita bakal ngomong babagan mbandhingake obyek. Hmm... Nanging kita koyone wis ngomong babagan iki luwih saka sepisan? : / Kita ngerti carane "
==
" operator dianggo, uga lan equals()
cara hashCode()
. Perbandingan dudu babagan iki. Sadurunge, kita tegese luwih kaya "obyek nguji kesetaraan." Nanging mbandhingake obyek bisa uga duwe tujuan sing beda! Sing paling jelas yaiku ngurutake. Aku yen sampeyan didhawuhi ngurutake dhaptar ArrayList<>
nomer utawa senar, sampeyan bisa nangani tanpa masalah:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
String name1 = "Masha";
String name2 = "Sasha";
String name3 = "Даша";
List<String> names = new ArrayList<>();
names.add(name1);
names.add(name2);
names.add(name3);
Collections.sort(names);
System.out.println(names);
}
}
Output konsol:
[Даша, Маша, Саша]
Iku apik yen sampeyan ngelingi kelas Collections
lan cara sort()
. Aku ora mikir bakal ana masalah karo nomer uga. Mangkene tugas sing luwih angel kanggo sampeyan:
public class Car {
private int manufactureYear;
private String model;
private int maxSpeed;
public Car(int manufactureYear, String model, int maxSpeed) {
this.manufactureYear = manufactureYear;
this.model = model;
this.maxSpeed = maxSpeed;
}
//...геттеры, сеттеры, toString()
}
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Car> cars = new ArrayList<>();
Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
Car lambo = new Car(2012, "Lamborghini Gallardo", 290);
Car bugatti = new Car(2010, "Bugatti Veyron", 350);
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
}
}
Iku banget prasaja: kelas Car
lan 3 saka sawijining obyek. Dadi apik kanggo ngurutake mobil ing dhaptar! Sampeyan bisa uga bakal takon: "Kepiye kudu diurutake?" Miturut jeneng, dening taun Pabrik, dening kacepetan maksimum? Pitakonan gedhe. Saiki kita ora ngerti carane ngurutake obyek saka kelas Car
. Lan, cukup alami, Jawa uga ora ngerti iki! Nalika kita nyoba ngirim Collections.sort()
dhaptar obyek menyang metode Car
, kita bakal nampa kesalahan:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Car> cars = new ArrayList<>();
Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
Car lambo = new Car(20012, "Lamborghini Gallardo", 290);
Car bugatti = new Car(2010, "Bugatti Veyron", 350);
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
//ошибка компилятора!
Collections.sort(cars);
}
}
Lan tenan, kepiye basa ngerti persis carane ngurutake obyek sing sampeyan tulis? Iku gumantung saka tujuan program sampeyan. Kita kudu piye wae mulang basa Jawa kanggo mbandhingake obyek kasebut. Lan mbandhingake cara sing kita butuhake. Kanggo tujuan iki, Jawa duwe alat khusus - antarmuka Comparable
. Ing basa Inggris iki dijarwakake minangka "comparable". Supaya obyek kita Car
bisa dibandhingake karo siji liyane lan piye wae diurutake, kelas kudu ngetrapake antarmuka iki lan ngetrapake cara mung: compareTo()
:
public class Car implements Comparable<Car> {
private int manufactureYear;
private String model;
private int maxSpeed;
public Car(int manufactureYear, String model, int maxSpeed) {
this.manufactureYear = manufactureYear;
this.model = model;
this.maxSpeed = maxSpeed;
}
@Override
public int compareTo(Car o) {
return 0;
}
//...геттеры, сеттеры, toString()
}
Pay manungsa waé:kita nemtokake antarmuka Comparable<Car>
, ora mung Comparable
. Iki minangka antarmuka sing diketik, yaiku, mbutuhake nemtokake kelas tartamtu sing digandhengake. Ing asas, <Car>
sampeyan bisa nyopot saka antarmuka, nanging banjur mbandhingaké obyek minangka standar Object
. Tinimbang metode compareTo(Car o)
ing kelas kita bakal duwe:
@Override
public int compareTo(Object o) {
return 0;
}
Mesthi, luwih gampang kanggo kita nggarap Car
. Ing cara compareTo()
kita ngetrapake logika kanggo mbandhingake mesin. Kita kudu ngurutake miturut taun produksi. Sampeyan mbokmenawa ngeweruhi sing cara compareTo()
ngasilake Nilai int
, ora boolean
. Aja nganti sampeyan kaget. Kasunyatane yaiku mbandhingake rong obyek menehi 3 pilihan sing bisa ditindakake:
а < b
a > b
a == b
.
boolean
mung 2 nilai - bener lan salah, kang ora trep kanggo mbandhingaké obyek. Kabeh int
luwih prasaja. Yen nilai bali > 0
, banjur a > b
. Yen asile compareTo < 0
, banjur а < b
. Inggih, yen asil punika == 0
, banjur loro obyek padha: a == b
. Ngajari kelas kita kanggo ngurutake mobil miturut taun produksi gampang kaya ngethok woh pir:
@Override
public int compareTo(Car o) {
return this.getManufactureYear() - o.getManufactureYear();
}
Apa sing kedadeyan ing kene? Kita njupuk siji obyek mobil ( this
), taun Pabrik mobil iki lan nyuda saka taun pabrik mobil liyane (sing mbandhingaké obyek). Yen taun pabrikan mobil pisanan luwih gedhe, cara kasebut bakal bali int > 0
. Tegese mobil this >
iku mobil о
. Yen, ing nalisir, taun Pabrik mobil kapindho ( о
) luwih, cara bakal bali nomer negatif, lan mulane о > this
. Inggih, yen padha padha, cara bakal bali 0
. Mekanisme sing prasaja iki wis cukup kanggo ngurutake koleksi obyek Car
! Sampeyan ora perlu nindakake apa-apa liyane. Kene sampeyan:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Car> cars = new ArrayList<>();
Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
Car lambo = new Car(2012, "Lamborghini Gallardo", 290);
Car bugatti = new Car(2010, "Bugatti Veyron", 350);
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
//тут раньше была ошибка
Collections.sort(cars);
System.out.println(cars);
}
}
Output konsol:
[Car{manufactureYear=1990, model='Ferrari 360 Spider', maxSpeed=310},
Car{manufactureYear=2010, model='Bugatti Veyron', maxSpeed=350},
Car{manufactureYear=2012, model='Lamborghini Gallardo', maxSpeed=290}]
Mobil-mobil kasebut diurutake kaya sing dikarepake! :) Ing kasus apa kudu digunakake Comparable
? Metode perbandingan sing ditindakake Comparable
diarani "urutan alami". Iki amarga ing cara compareTo()
sampeyan njlèntrèhaké cara comparison paling umum sing bakal digunakake kanggo obyek saka kelas iki ing program. Tatanan Alam wis ana ing Jawa. Contone, Jawa ngerti yen strings paling kerep diurutake miturut abjad, lan nomer paling kerep diurutake miturut nilai munggah. Mulane, yen sampeyan nelpon cara ing dhaptar nomer utawa strings sort()
, padha bakal diurutake. Yen ing program kita, mobil bakal dibandhingake lan diurutake miturut taun pabrik, mula sampeyan kudu nemtokake jinis alami kanggo nggunakake antarmuka Comparable<Car>
lan metode compareTo()
. Nanging apa yen iku ora cukup kanggo kita? Ayo mbayangno program kita ora gampang banget. Umume kasus, ngurutake mobil alami (sing disetel miturut taun produksi) cocog karo kita. Nanging kadhangkala ing antarane klien kita ana penggemar nyopir cepet. Yen kita nyiapake katalog mobil sing bisa dipilih, mula kudu diurutake kanthi kacepetan maksimal. Contone, kita kudu ngurutake kaya ing 15% kasus. Iki jelas ora cukup kanggo nyetel ngurutake alam Car
kanthi kacepetan tinimbang taun manufaktur. Nanging kita ora bisa nglirwakake 15% klien. Apa sing kita lakoni? Kene antarmuka liyane teka kanggo bantuan kita - Comparator
. Kaya wae, Comparable
diketik. Apa bedane? Comparable
ndadekake obyek kita "dibandhingake" lan nggawe urutan urutan paling alam kanggo wong-wong mau sing bakal digunakake ing paling kasus. Comparator
- iki minangka kelas "komparator" sing kapisah (terjemahan rada kikuk, nanging bisa dingerteni). Yen kita kudu ngleksanakake sawetara ngurutake tartamtu, kita ora kudu pindhah menyang kelas Car
lan ngganti logika compareTo()
. Nanging, kita bisa nggawe kelas komparator sing kapisah ing program kita lan mulang supaya bisa ngurutake sing dibutuhake!
import java.util.Comparator;
public class MaxSpeedCarComparator implements Comparator<Car> {
@Override
public int compare(Car o1, Car o2) {
return o1.getMaxSpeed() - o2.getMaxSpeed();
}
}
Nalika sampeyan bisa ndeleng, kita Comparator
cukup prasaja. Mung ana siji cara compare()
- iki cara antarmuka Comparator
, sing kudu dileksanakake. Butuh loro obyek minangka input Car
lan mbandhingaké kacepetan maksimum ing cara biasanipun (dening subtraction). Kaya compareTo()
, ngasilake nomer kasebut int
, prinsip perbandingan padha. Kepiye carane nggunakake iki? Prasaja banget:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Car> cars = new ArrayList<>();
Car ferrari = new Car(1990, "Ferrari 360 Spider", 310);
Car lambo = new Car(2012, "Lamborghini Gallardo", 290);
Car bugatti = new Car(2010, "Bugatti Veyron", 350);
cars.add(ferrari);
cars.add(bugatti);
cars.add(lambo);
Comparator speedComparator = new MaxSpeedCarComparator();
Collections.sort(cars, speedComparator);
System.out.println(cars);
}
}
Output konsol:
[Car{manufactureYear=2012, model='Lamborghini Gallardo', maxSpeed=290},
Car{manufactureYear=1990, model='Ferrari 360 Spider', maxSpeed=310},
Car{manufactureYear=2010, model='Bugatti Veyron', maxSpeed=350}]
Kita mung nggawe obyek komparator lan pass menyang cara Collections.sort()
bebarengan karo dhaptar sing bakal diurutake. Sawise nampa komparator minangka input, metode kasebut sort()
ora bakal nggunakake pangurutan alami sing ditetepake ing metode compareTo()
kelas Car
. Nanging, bakal ngetrapake algoritma pangurutan saka komparator sing diwenehake. Apa kaluwihan iki menehi kita? Kaping pisanan, kompatibilitas karo kode sing ditulis. Kita nggawe anyar, cara ngurutake tartamtu, nalika njaga sing saiki, kang bakal digunakake ing paling kasus. Kita ora ndemek kelas babar pisan Car
. Dheweke Comparable
tetep kaya dheweke:
public class Car implements Comparable<Car> {
private int manufactureYear;
private String model;
private int maxSpeed;
public Car(int manufactureYear, String model, int maxSpeed) {
this.manufactureYear = manufactureYear;
this.model = model;
this.maxSpeed = maxSpeed;
}
@Override
public int compareTo(Car o) {
return this.getManufactureYear() - o.getManufactureYear();
}
//...геттеры, сеттеры, toString()
}
Kapindho, keluwesan. Kita bisa nambah macem-macem kaya sing dikarepake. Ngomong, urut mobil miturut warna, kacepetan, bobot, utawa kaping pirang-pirang mobil kasebut digunakake ing film Batman. Cukup mung kanggo nggawe tambahan Comparator
. Iku kabeh! Dina iki sampeyan sinau rong mekanisme penting sing bakal kerep digunakake ing proyek nyata ing karya. Nanging, kaya sing sampeyan ngerteni, teori tanpa praktik ora ana apa-apa. Mulane, wektune kanggo nggabungake kawruh lan ngrampungake sawetara masalah! :)
GO TO FULL VERSION