JavaRush /Blog Jawa /Random-JV /Komparator ing basa Jawa

Komparator ing basa Jawa

Diterbitake ing grup
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." Komparator ing basa Jawa - 1Nanging 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 Collectionslan 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 Carlan 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 Carbisa 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.
Wis booleanmung 2 nilai - bener lan salah, kang ora trep kanggo mbandhingaké obyek. Kabeh intluwih 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! :) Komparator ing basa Jawa - 2Ing kasus apa kudu digunakake Comparable? Metode perbandingan sing ditindakake Comparablediarani "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. Komparator ing basa Jawa - 3Contone, kita kudu ngurutake kaya ing 15% kasus. Iki jelas ora cukup kanggo nyetel ngurutake alam Carkanthi 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, Comparablediketik. Apa bedane? Comparablendadekake 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 Carlan 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 Comparatorcukup prasaja. Mung ana siji cara compare()- iki cara antarmuka Comparator, sing kudu dileksanakake. Butuh loro obyek minangka input Carlan 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 Comparabletetep 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! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION