Cau mam abstraktni tridu od ktere dedi dalsi tridy. Pak mam tridu kde mam mnozinu tech potomku. A ted chci seradit ty potomky podle nejakej jejich spolecneho atributu. Kde mam presne implementovat comparator atd. Dik
Fórum › Java
Java razene a abstraktni trida
Tak třída comparatoru bude ve vlastním souboru, ve který bude i to seřazení a samotné řazení bude tam, kde to potřebuješ seřadit
a implementace comparatoru bude u třídy, kterou chceš seřazovat
A hezký příklad k tomu :)
#4 crash40
ano i ne, pokud implementuješ rozhraní Comparable, tak musíš implementovat funkci compareTo(...), kde si už vytvoříš nějaký porovnávací pravidlo
a rozhraní Comparable bude obsahovat pouze ten objekt, kterej se má porovnávat => bude mít funkci compareTo(..)
pokud implementujes Comparator, tak musíš implementovat compare(...)
v tvém případě bych doporučil první možnost
a teoreticky nemusíš implementovat nic a stačí přepsat equals(..), kterej se stará o porovnání objektů, případně si udělat vlastní funki, co nahradí tyhle rozhraní
Takze jestli to dobre chápu to rozhrani comparable bude obsahovat ten rodic :)
public abstract class Polozka implements Comparable <Polozka>
{
protected String titul;
protected String osoba;
protected int delka;
protected boolean vlastnim;
protected String komentar;
...
public int compareTo(Polozka druha) {
return titul.compareTo(druha.titul);
}
}
ale kdyz to takle naimplementuji tak ne nefunguje:)
tohle ti jde skompilovat? pokud přepisujes nebo implementuješ nějakou funkci, tak nemůžeš měnit její deklaraci
pokud se nemílim, tak compareTo má parametr Object a uvnitř nepoužívej compareTo ale normální porovnání, pokud chceš ten titul, tak něco jako
public int compareTo(Object obj) {
return title.equals(((Polozka)obj).title) ? 0 : -1;
}
EDIT: ted jsem si vsim, ze ty implementujes Comparable<Polozka>, takze parametr bude jak máš Polozka, to co jsem psal je ciste jen implementace Comparable
noo, jednoduchá ukázka základního compatable je treba...
import java.util.*;
class Main {
public static void main(String[] args) {
List<Human> humans = new ArrayList<Human>();
humans.add(new Human("aaa", 20));
humans.add(new Human("bbb", 15));
humans.add(new Human("ccc", 30));
humans.add(new Human("ddd", 25));
Collections.sort(humans);
for (Human h : humans) {
System.out.println(h);
}
}
}
class Human implements Comparable<Human> {
public String name;
public int age;
public Human(String name, int age) {
this.name = name;
this.age = age;
}
public int compareTo(Human h) {
return (age < h.age) ? 0 : 1; // seradi vzestupne
//return (age > h.age) ? 0 : 1; // seradi sestupne
}
public String toString() {
return name + ", " + age;
}
}
implementujes ji tam, kde ji potrebujes...
pokud potrebujes serazovat prvky podle neceho co je v rodici, tak ji das do rodice
pokud podle neceho co je pouze v potomku, tak ji das do potomku (zde si nejsem jistej, jestli se muzes odkazat na rodice pro vytvareni pole tech potomku)
pokud podle neceho co je v rodici, ale potom i podle neceho co je v potomku, tak do rodice a funkci potom znova prepises v potomku
Porad to nefunguje
public int compareTo(CD obj) {
System.out.println("Porovnavam");
return titul.equals(((CD)obj).titul) ? 0 : -1;
}
tuhle metodu jsem vlozil do kazdeho potomka ale stejne se ta metoda ani nezavola. Nevite kde by mohl byt problem?
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Abstraktni trida do vektoru? — založil CommanderZ
Abstraktni trida v turbo pascalu — založil joudik
Abstraktni trida bez atributu s metodami - pomoc — založil Standa
Přetransformovat abstraktní třídu na ne-abstraktní — založil geryeo
Abstraktní třídy — založil tom*p
Moderátoři diskuze