JavaRush /Java Blog /Random-TK /Java-da deňeşdiriji

Java-da deňeşdiriji

Toparda çap edildi
Salam! Bu gün obýektleri deňeşdirmek barada gürleşeris. Hmm ... thisöne bu hakda eýýäm birnäçe gezek gürleşen ýaly? ==: / “ ” Operatoryň nähili işleýändigini, usullaryny equals()we usullaryny bilýäris hashCode(). Deňeşdirmek hakykatdanam beýle däl. Ozallar “deňlik üçin obýektleri barlamak” ýaly manylary aňladýardyk. Java-da deňeşdiriji - 1Objectsöne obýektleri biri-biri bilen deňeşdirmek düýbünden başga maksatlara eýe bolup biler! Iň göze görnüp duran zat. Meniň pikirimçe, size sanlaryň ýa-da setirleriň sanawyny tertipleşdirmek tabşyrylsa ArrayList<>, kynçylyksyz çözüp bilersiňiz:
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);
   }
}
Konsol çykyşy:

[Даша, Маша, Саша]
CollectionsSynp we onuň usuly ýadyňyza düşse gaty gowy sort(). Sanlar bilen baglanyşykly problema hem bolar öýdemok. Ine, size has kyn mesele:
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);
   }
}
Bu gaty ýönekeý: synp Carwe 3 obýekt. Sanawdaky awtoulaglary tertiplemek üçin mylaýym boluň! Belki: "Olary nädip tertipleşdirmeli?" Ady boýunça, öndürilen ýyly boýunça, iň ýokary tizlik bilen? Gowy sorag. Häzirki wagtda synpyň obýektlerini nädip tertipleşdirmelidigini bilemzok Car. Elbetde, Java muny bilmeýär! Collections.sort()Obýektleriň sanawyny bir usula geçirjek bolanymyzda Carýalňyşlyk alarys:
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);
   }
}
Hakykatdanam, dil ýazýan zatlaryňyzy nädip tertipleşdirmelidigini nädip bilýär? Bu programmaňyzyň maksatlaryna baglydyr. Nädip Java-ny bu zatlary deňeşdirmegi öwretmeli. Bize zerur ýoly deňeşdiriň. Bu maksat bilen Java-da ýörite gural - interfeýs bar Comparable. Iňlis dilinde bu “deňeşdirip bolýar” diýip terjime edilýär. CarObýektlerimiziň biri-biri bilen deňeşdirilmegi we haýsydyr bir görnüşde tertipleşdirilmegi üçin synp bu interfeýsi durmuşa geçirmeli we ýeke-täk usulyny durmuşa geçirmeli 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()

}
Üns beriň:Comparable<Car>diňe däl, interfeýsi kesgitledik Comparable. Bu ýazylan interfeýs, ýagny haýsy ugur bilen baglanyşyklydygyny görkezmegi talap edýär. Aslynda, <Car>ony interfeýsden aýryp bilersiňiz, ýöne soňra obýektleri adaty ýagdaýda deňeşdirýär Object. compareTo(Car o)Synpymyzda usulyň ýerine :
@Override
   public int compareTo(Object o) {
       return 0;
   }
Elbetde, biziň bilen işlemek has aňsat Car. Usulyň içinde compareTo()maşynlary deňeşdirmek üçin logikany durmuşa geçirýäris. Olary önümçilik ýylyna görä tertipleşdirmeli diýeliň. Usulyň däl-de, compareTo()bahanyň yzyna gaýtarylýandygyna göz ýetiren bolsaňyz gerek . Munuň sizi geň galdyrmagyna ýol bermäň. Hakykat, iki zady deňeşdirmek bize 3 mümkin wariant berýär: intboolean
  • а < b
  • a > b
  • a == b.
Onda booleandiňe 2 baha bar - obýektleri deňeşdirmek üçin amatsyz dogry we ýalan. Hemme zat has intýönekeý. Eger yzyna gaýtarmak bahasy > 0bolsa, onda a > b. Netije bolsa compareTo < 0, onda а < b. Garaz, netije bolsa == 0, iki obýekt deňdir : a == b. Maşynlary öndürilen ýylyna görä tertipleşdirmegi öwretmek, armut atmak ýaly aňsat:
@Override
public int compareTo(Car o) {
   return this.getManufactureYear() - o.getManufactureYear();
}
Bu ýerde näme bolýar? Bir awtoulag obýektini (), bu awtoulagyň öndürilen ýylyny alýarys thiswe ondan başga bir awtoulagyň öndürilen ýylyny (obýekt bilen deňeşdirenimizden) aýyrýarys. Ilkinji awtoulagyň öndürilen ýyly has uly bolsa, usul gaýdyp geler int > 0. this >Bu awtoulag diýmekdir о. Munuň tersine, ikinji awtoulagyň ( о) öndürilen ýyly has uly bolsa, bu usul otrisatel san görkezer we şonuň üçin о > this. Garaz, deň bolsa, usul gaýdyp geler 0. Şeýle ýönekeý mehanizm obýektleriň ýygyndysyny tertiplemek üçin eýýäm ýeterlikdir Car! Başga bir zat etmegiň zerurlygy ýok. Ine:
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);
   }
}
Konsol çykyşy:

[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}]
Maşynlar bolmalysy ýaly tertiplenýär! :) Java-da deňeşdiriji - 2Haýsy ýagdaýlarda ulanmaly Comparable? Geçirilen deňeşdirme usuly Comparable“tebigy sargyt” diýilýär. Munuň sebäbi, usulda compareTo()programmaňyzda bu synpyň obýektleri üçin ulanyljak iň köp ýaýran deňeşdirme usulyny suratlandyrýarsyňyz. Tebigy sargyt Java-da eýýäm bar. Mysal üçin, Java setirleriň köplenç elipbiý boýunça tertiplenýändigini we sanlaryň köplenç ýokarlanýan baha boýunça tertiplenýändigini bilýär. Şonuň üçin usuly sanlaryň ýa-da setirleriň sanawyna çagyrsaňyz sort(), tertiplener. Comparable<Car>Programmamyzda awtoulaglar köp halatda öndürilen ýyl bilen deňeşdirilip, tertipleşdirilse, interfeýs we usul ulanyp, olar üçin tebigy görnüşi kesgitlemeli compareTo(). Emma bu bize ýeterlik bolmasa näme etmeli? Maksatnamamyzyň beýle bir ýönekeý däldigini göz öňüne getireliň. Köplenç awtoulaglaryň tebigy görnüşi (ony öndürilen ýylyna görä düzýäris) bize laýyk gelýär. Emma käwagt müşderilerimiziň arasynda çalt sürmegiň muşdaklary bar. Awtoulaglaryň katalogyny saýlamagy üçin taýýarlaýan bolsak, iň ýokary tizlik bilen sargyt edilmeli. Java-da deňeşdiriji - 3Mysal üçin, 15% ýagdaýynda şeýle tertipleşdirme gerek. CarBu önümçiligiň ýylyna derek tebigy tertipleşdirmegi kesgitlemek üçin ýeterlik däl . Emma müşderileriň 15% -ini äsgermezlik edip bilmeris. Biz näme edýäris? Bu ýerde bize başga bir interfeýs gelýär - Comparator. Edil şonuň ýaly Comparableýazylýar. Tapawudy näme? Comparableobýektlerimizi "deňeşdirip" edýär we köp halatlarda ulanyljak olar üçin iň tebigy tertip tertibini döredýär. Comparator- bu aýratyn “deňeşdiriji” synp (terjime biraz manysyz, ýöne düşnükli). CarBelli bir tertipleşdirmegi amala aşyrmaly bolsak, synpa girip logikany üýtgetmeli däldiris compareTo(). Munuň ýerine, programmamyzda aýratyn deňeşdiriji synp döredip, oňa zerur tertipleşdirmegi öwredip bileris!
import java.util.Comparator;

public class MaxSpeedCarComparator implements Comparator<Car> {

   @Override
   public int compare(Car o1, Car o2) {
       return o1.getMaxSpeed() - o2.getMaxSpeed();
   }
}
Görşüňiz ýaly, biziňkiler Comparatorgaty ýönekeý. Diňe bir usul bar compare()- bu interfeýs usuly Comparator, ony durmuşa geçirmeli. Iki obýekti giriş hökmünde alýar Carwe iň ýokary tizligini adaty usulda deňeşdirýär (aýyrmak arkaly). Halaýan ýaly compareTo(), san görkezýär int, deňeşdirme ýörelgesi birmeňzeş. Muny nädip ulanyp bileris? Örän ýönekeý:
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);
   }
}
Konsol çykyşy:

[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}]
Collections.sort()Diňe deňeşdiriji obýekt döredýäris we tertipleşdirilmeli sanaw bilen birlikde usula geçirýäris . Giriş hökmünde deňeşdiriji alansoň, usul synp sort()usulynda kesgitlenen tebigy tertipleşdirmäni ulanmaz . Munuň ýerine, özüne berlen deňeşdirijiden sortlaşdyryş algoritmini ulanar. Bu bize nähili artykmaçlyklary berýär? Ilki bilen, ýazylan koda laýyklyk. Köp halatlarda ulanyljak häzirki usulyny saklamak bilen, täze, aýratyn sortlaşdyryş usulyny döretdik. Biz klasa asla degmedik . Öňküsi ýaly galdy :compareTo()CarCarComparable
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()

}
Ikinjiden, çeýeligi. Islän görnüşimizi goşup bileris. Maşynlary reňk, tizlik, agram ýa-da Batman filmlerinde näçe gezek ulanylandygyny aýdyň. Diňe goşmaça birini döretmek ýeterlikdir Comparator. Bu hemmesi! Bu gün işde hakyky taslamalarda köplenç ulanjak iki sany möhüm mehanizmi öwrendiňiz. Emma, ​​bilşiňiz ýaly, praktikasyz teoriýa hiç zat däl. Şonuň üçin bilimleriňizi berkitmegiň we birnäçe meseläni çözmegiň wagty geldi! :)
Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION