Java: Řazení
Z MiS
(Rozdíly mezi verzemi)
m (→Pro třídy, kde je více možných kritérií řazení: Oprava vzhledu) |
(Přidáno řazení standardních tříd Javy.) |
||
| (Není zobrazeno 5 mezilehlých verzí od 1 uživatele.) | |||
| Řádka 4: | Řádka 4: | ||
| − | == Pro třídy | + | == 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 <code>Integer</code>, <code>String</code>, <code>Date</code> a dalších tříd, kde existuje nějaké „standarní“ uspořádání prvků. | ||
| + | * Prakticky je uspořádání realizováno implementací rozhraní <code>Comparable</code> viz dále. | ||
| + | |||
| + | <div class="Priklad"> | ||
| + | ; 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 <code>ParseException</code>'' | ||
| + | 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); | ||
| + | } | ||
| + | </div> | ||
| + | |||
| + | |||
| + | == <code>Comparable</code> — ř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í: <code>Comparable<Trida></code> | * 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í: <code>Comparable<Trida></code> | ||
* Rozhraní vyžaduje jedinou metodu: <code>int compareTo(druha Trida)</code> | * Rozhraní vyžaduje jedinou metodu: <code>int compareTo(druha Trida)</code> | ||
| Řádka 40: | Řádka 67: | ||
public int getCena() { return this.cena; } | public int getCena() { return this.cena; } | ||
| − | public double getSpotreba() { return this.spotreba; } | + | public double getSpotreba() { |
| + | return this.spotreba; | ||
| + | } | ||
public String getNazev() { return this.nazev; } | public String getNazev() { return this.nazev; } | ||
} | } | ||
class AutoComparatorCena implements Comparator<Auto> { | class AutoComparatorCena implements Comparator<Auto> { | ||
| − | public int compare(Auto a1, Auto a2) { return a1.getCena() - a2.getCena(); } | + | public int compare(Auto a1, Auto a2) { |
| + | return a1.getCena() - a2.getCena(); | ||
| + | } | ||
} | } | ||
class AutoComparatorSpotreba implements Comparator<Auto> { | class AutoComparatorSpotreba implements Comparator<Auto> { | ||
| − | public int compare(Auto a1, Auto a2) { | + | public int compare(Auto a1, Auto a2) { |
| + | if (a1 < a2) return -1; | ||
| + | if (a1 > a2) return 1; | ||
| + | return 0; | ||
| + | } | ||
} | } | ||
class AutoComparatorNazev implements Comparator<Auto> { | class AutoComparatorNazev implements Comparator<Auto> { | ||
| − | public int compare(Auto a1, Auto a2) { return a1.getNazev().compareTo(a2.getNazev()); } | + | public int compare(Auto a1, Auto a2) { |
| + | return a1.getNazev().compareTo(a2.getNazev()); | ||
| + | } | ||
} | } | ||
</div> | </div> | ||
| Řádka 59: | Řádka 96: | ||
Collections.sort(auta, new AutoHmotnostComparator()); | Collections.sort(auta, new AutoHmotnostComparator()); | ||
* Lze vytvořit také anonymní třídu pro porovnání (komparátor): | * Lze vytvořit také anonymní třídu pro porovnání (komparátor): | ||
| − | Collections.sort(auta, new Comparator& | + | Collections.sort( |
| + | auta, | ||
| + | new Comparator<Auto>() { | ||
| + | public int compare(Auto a1, Auto a2) { | ||
| + | return ... | ||
| + | } | ||
| + | }); | ||
== Související stránky == | == Související stránky == | ||
| − | * [[Řadící algoritmy]] | + | * [[Řadící algoritmy]], [[Java: Kontejnery]] |
Aktuální verze z 23. 1. 2018, 07:40
Ř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,Datea dalších tříd, kde existuje nějaké „standarní“ uspořádání prvků. - Prakticky je uspořádání realizováno implementací rozhraní
Comparableviz 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 ...
}
});