Java: Řazení
Z MiS
Řadícími algoritmy, jejich principem a vlastnostmi se zabývá stránka Řadící algoritmy.
Obsah |
Standardní třídy Javy
- Standardní třídy v Javě mají definované uspořádání prvků.
- Pro jejich řazení tedy stačí použít:
Collections.sort(kontejner);
- Týká se například tříd
Integer
,String
,Date
a dalších tříd, kde existuje nějaké „standarní“ uspořádání prvků. - Prakticky je uspořádání realizováno implementací rozhraní
Comparable
viz dále.
- Příklad
java.text.DateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");
ArrayList<Date> dataUdalosti = new ArrayList<>();
...
try {
dataUdalosti.add(formatter.parse("2018-01-22")); // Může nastat výjimka ParseException
dataUdalosti.add(formatter.parse("2017-12-31"));
} catch (ParseException ex) { throw RuntimeException("Error in date: "+ex.getMessage() }
dataUdalosti.add(new Date()); // Aktuální datum
Collections.sort(dataUdalosti);
// Seřadí prvky v kontejneru od nejstaršího data k nejnovějšímu.
...
for(Date datum : dataUdalosti) {
System.out.println(datum);
}
Comparable
— řadíme vlastní třídy
- Pokud chceme řadit instance vlastní třídy, musíme Javě vysvětlit, jak mají být uspořádány.
- Pokud je přirozené porovnávat instance třídy a je zřejmé, podle jakého kritéria porovnání probíhá (například srovnání čísel), pak u třídy implementujeme rozhraní:
Comparable<Trida>
- Rozhraní vyžaduje jedinou metodu:
int compareTo(druha Trida)
- Metoda vrací:
- kladné číslo, když je tato instance „větší“ než druhá,
- záporné číslo, když je menší než druhá
- a 0 když jsou obě instance „stejné“.
Příklad:
public class Mince implements Comparable<Mince> { private int hodnota; public int compareTo(Mince druhaMince) { return this.hodnota - druhaMince.hodnota; } }
- Použití:
ArrayList<Mince> mince = new Array... Collections.sort(mince);
Některé třídy Javy už mají rozhraní Comparable
implementované. Pak je můžeme řadit přímo: Collections.sort(cisla);
.
Příkladem takové třídy jsou objektové číselné typy jako Integer
.
Pro třídy, kde je více možných kritérií řazení
- Pokud můžeme porovnávat podle více kritérií, vytvoříme samostatné třídy „komparátory“.
- Implementují rozhraní:
Comparator<Trida>
Příklad:
public class Auto { private int cena; private double spotreba; private String nazev; public int getCena() { return this.cena; } public double getSpotreba() { return this.spotreba; } public String getNazev() { return this.nazev; } }
class AutoComparatorCena implements Comparator<Auto> { public int compare(Auto a1, Auto a2) { return a1.getCena() - a2.getCena(); } }
class AutoComparatorSpotreba implements Comparator<Auto> { public int compare(Auto a1, Auto a2) { if (a1 < a2) return -1; if (a1 > a2) return 1; return 0; } }
class AutoComparatorNazev implements Comparator<Auto> { public int compare(Auto a1, Auto a2) { return a1.getNazev().compareTo(a2.getNazev()); } }
- Použití:
Collections.sort(auta, new AutoHmotnostComparator());
- Lze vytvořit také anonymní třídu pro porovnání (komparátor):
Collections.sort( auta, new Comparator<Auto>() { public int compare(Auto a1, Auto a2) { return ... } });