Java - řazení objektů Kapitola seznamuje se základními principy řazení objektů Klíčové pojmy: Přirozené řazení, absolutní řazení, ideální porovnávatelná třída ŘAZENÍ OBJEKTŮ U objektů není příliš jasné, podle čeho by se měly řadit, většinou mají více atributů, podle kterých lze řadit. Pak mohu volit z více způsobů, jak řadit: 1. řadíme podobně jako primitivní datové typy pomocí metod sort(pole) a binarysearch(), způsob porovnání objektů musí být definován ve třídě těchto objektů = přirozené řazení 2. můžeme si vybrat, podle čeho budeme chtít řadit, u metody sort(pole, jak_řadit) si pomocí druhého parametru můžeme vybrat, podle čeho budeme chtít řadit = absolutní řazení Přirozené řazení natural ordering metody sort() a binarysearch() voláme stejně jako pro primitivní datové typy způsob porovnání objektů musí být popsán ve třídě těchto objektů třída implementuje rozhraní java.lang.comparable s metodou compareto(trida t) rozhraní je generické metoda int compareto(trida t) při porovnání našeho objektu s nějakým objektem-parametrem vrací (this == param) > 0 (this < param) > záporné celé číslo (this > param) > kladné celé číslo rozhraní java.lang.comparable implementují všechny obalové třídy (např. Integer, String,...), nemusíme pro ně tedy definovat metodu compareto(trida t) Příklad 1: seřadíme pole Stringů, metodu compareto(string s) nemusíme definovat, uz je definována Příklad 2: napiš třídu Osoba s atributy jméno, výška a váha a implementující Comparable class Osoba implements Comparable<Osoba> předefinuj metodu public int compareto() tak, aby bylo možné řadit např. podle výšky předefinuj metodu tostring() vytvoř pole Osob a pracuj obdobně jako v předchozích příkladech 2011-12-05 Java - řazení objektů 1/5
class Osoba implements Comparable<Osoba> { String jmeno; int vyska; double vaha; public Osoba(String jmeno, int vyska, double vaha) { this.jmeno = jmeno; this.vyska = vyska; this.vaha = vaha; /* compareto() řadí objekty Osoba podle výšky */ // v tomto případě můžeme psát také: this.vyska - os.vyska public int compareto(osoba os) { if (this.vyska == os.vyska) return 0; else if (this.vyska > os.vyska) return 1; else return -1; public String tostring() { return "Jmeno: " + jmeno + ", vyska: " + vyska + ", vaha: " + vaha; ------------------------------------------------------------------------------------- import java.util.*; public class PrirozeneRazeni { public static void vypis(osoba[] o) { for (int i=0; i<o.length; i++) { System.out.println(i + "..." + o[i].tostring()); Osoba[] clovek = new Osoba[3]; clovek[0] = new Osoba("Eva", 165, 52.8); clovek[1] = new Osoba("Čeněk", 177, 64.2); clovek[2] = new Osoba("Dana", 170, 70.5); Arrays.sort(clovek); Absolutní řazení total ordering implementace rozhraní java.lang.comparator, které má 2 metody: metoda equals(object o) tuto metodu dědí každá třída ze třídy Object, nemusíme def. metoda int compare(trida t1, Trida t2) platí pro ni stejná pravidla jako pro metodu pro českou lokaci použijeme objekt třídy Collator z java.text.* 2011-12-05 Java - řazení objektů 2/5
import java.util.*; import java.text.*; class KomparatorPodleVysky implements Comparator<Osoba> { return os1.vyska - os2.vyska; class KomparatorPodleVahy implements Comparator<Osoba> { return (int)(os1.vaha - os2.vaha); /* pro řazení akcentovaných řetězců */ class KomparatorStringuCesky implements Comparator<String> { /* použijeme objekt třídy Collator pro českou lokaci z java.text.*; */ private Collator col = Collator.getInstance(new Locale("cs", "CZ")); public int compare(string s1, String s2) { return col.compare(s1, s2); class KomparatorPodleJmena implements Comparator<Osoba> { String s1 = os1.jmeno; String s2 = os2.jmeno; return s1.compareto(s2); public class AbsolutniRazeni { public static void vypis(osoba[] os) { for (int i=0; i<os.length; i++) { os[i].vypis(); Osoba[] clovek = new Osoba[3]; clovek[0] = new Osoba("Zita", 165, 52.8); clovek[1] = new Osoba("Hana", 177, 64.2); clovek[2] = new Osoba("Čeněk", 170, 70.5); Arrays.sort(clovek, new KomparatorPodleVysky()); Arrays.sort(clovek, Collections.reverseOrder(new KomparatorPodleVahy())); System.out.println("\nPo seřazení podle váhy sestupně"); Arrays.sort(clovek, new KomparatorPodleJmena()); System.out.println("\nPo seřazení podle jména"); String[] jmeno = new String[clovek.length]; for (int i=0; i<clovek.length; i++) { jmeno[i] = clovek[i].jmeno; Arrays.sort(jmeno, new KomparatorStringuCesky()); 2011-12-05 Java - řazení objektů 3/5
System.out.println("\nPo seřazení podle jména česky"); for (int i=0; i<clovek.length; i++) { System.out.println(jmeno[i]); Ideální porovnávatelná třída implementace rozhraní java.lang.comparable má už ve své definici obsaženy komparátory import java.util.*; class PorovnavatelnaOsoba implements Comparable<PorovnavatelnaOsoba> { String jmeno; int vyska; double vaha; public PorovnavatelnaOsoba(String jmeno, int vyska, double vaha) { this.jmeno = jmeno; this.vyska = vyska; this.vaha = vaha; /* compareto() řadí objekty Osoba podle výšky */ public int compareto(porovnavatelnaosoba os) { return this.vyska - os.vyska; public String tostring() { return "Jmeno: " + jmeno + ", vyska: " + vyska + ", vaha: " + vaha; public void vypis() { System.out.println(this.toString()); public static final Comparator<PorovnavatelnaOsoba> PODLE_VYSKY = new ; return (os1.vyska - os2.vyska); public static final Comparator<PorovnavatelnaOsoba> PODLE_VAHY = new ; return (int)(os1.vaha - os2.vaha); public static final Comparator<PorovnavatelnaOsoba> PODLE_JMENA = new ; return os1.jmeno.compareto(os2.jmeno); 2011-12-05 Java - řazení objektů 4/5
import java.util.*; public class AbsolutniRazeni2 { public static void vypis(porovnavatelnaosoba[] os) { for (int i=0; i<os.length; i++) { os[i].vypis(); PorovnavatelnaOsoba[] clovek = new PorovnavatelnaOsoba[3]; clovek[0] = new PorovnavatelnaOsoba("Zita", 165, 52.8); clovek[1] = new PorovnavatelnaOsoba("Hana", 177, 64.2); clovek[2] = new PorovnavatelnaOsoba("Čeněk", 170, 70.5); Arrays.sort(clovek, PorovnavatelnaOsoba.PODLE_VYSKY); System.out.println(Arrays.asList(clovek)); Arrays.sort(clovek, Collections.reverseOrder(PorovnavatelnaOsoba.PODLE_VAHY)); System.out.println("\nPo seřazení podle váhy sestupně"); System.out.println(Arrays.asList(clovek)); Arrays.sort(clovek, PorovnavatelnaOsoba.PODLE_JMENA); System.out.println("\nPo seřazení podle jména"); System.out.println(Arrays.toString(clovek)); 2011-12-05 Java - řazení objektů 5/5