Java: Řazení

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
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.)
 
(Nejsou zobrazeny 4 mezilehlé verze od 1 uživatele.)
Řádka 4: Řádka 4:
  
  
== Pro třídy s přirozeným řazením ==
+
== 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&nbsp;nejnovějšímu.
 +
''...''
 +
for(Date datum : dataUdalosti) {
 +
    System.out.println(datum);
 +
}
 +
</div>
 +
 
 +
 
 +
== <code>Comparable</code> &mdash; ř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&nbsp;je zřejmé, podle jakého kritéria porovnání probíhá (například srovnání čísel), pak u&nbsp;třídy implementujeme rozhraní: <code>Comparable&lt;Trida&gt;</code>
 
* Pokud je přirozené porovnávat instance třídy a&nbsp;je zřejmé, podle jakého kritéria porovnání probíhá (například srovnání čísel), pak u&nbsp;třídy implementujeme rozhraní: <code>Comparable&lt;Trida&gt;</code>
 
* Rozhraní vyžaduje jedinou metodu: <code>int compareTo(druha Trida)</code>
 
* Rozhraní vyžaduje jedinou metodu: <code>int compareTo(druha Trida)</code>
Řádka 54: Řádka 81:
 
  class AutoComparatorSpotreba implements Comparator&lt;Auto> {  
 
  class AutoComparatorSpotreba implements Comparator&lt;Auto> {  
 
      public int compare(Auto a1, Auto a2) {
 
      public int compare(Auto a1, Auto a2) {
         return Math.truncate(a1.getSpotreba() - a2.getSpotreba());  
+
         if (a1 &lt; a2) return -1;
 +
        if (a1 &gt; a2) return 1;
 +
        return 0;  
 
     }  
 
     }  
 
  }  
 
  }  
Řádka 67: Řá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&lt;Auto>() { public int compare(Auto a1, Auto a2) { return ...  } } );
+
  Collections.sort(
 +
        auta,   
 +
        new Comparator&lt;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

Collections.sort(kontejner);
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

Příklad:
public class Mince implements Comparable<Mince> { 
    private int hodnota; 

    public int compareTo(Mince druhaMince) { 
        return this.hodnota - druhaMince.hodnota; 
    } 
}
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í

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()); 
    } 
}
Collections.sort(auta, new AutoHmotnostComparator());
Collections.sort(
        auta,  
        new Comparator<Auto>() {  
                public int compare(Auto a1, Auto a2) { 
                    return ...  
                } 
        });

Související stránky

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje