Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Implementacija metoda...

[es] :: Java :: Implementacija metoda...

[ Pregleda: 3699 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Implementacija metoda...09.03.2014. u 16:11 - pre 123 meseci
Pozdrav, naisao sam na zadatak gde mi delovi nisu bas najasni pa da pitam ako moze neko da objasni. U pitanju je zadatak koji ima klasu Osoba sa atributima ime i prezime.

U toj klasi se vrsi implementacija metoda compareTo i equals. E sad, razumem da treba da se naprave promene u te dve metode za nase potrebe ali u ovom slucaju nije mi jasno kako ove izmenjene metode uspeju da obave posao.

Prva izmenjene metoda campareTo kasnije ce posluziti u pozivu metoda Collection.sort u main metodu da sortiramo osobe po prezimenima , ali ne vidim cemu sluzi konkretno ova izmena i na koji nacin poredi objekte i sortira ih po abecednom redu

Izmena metode equals ce kasnije posluziti da proverimo da li zadati objekat postoji u listi objekata i prvi deo gde metoda mi je jasan ali ova linija mi nije jasna cemu sluzi i kako obavlja posao return compareTo((Osoba)o)==0;

Evo i celog koda klase Osoba:

Code:
public class Osoba implements Comparable<Osoba>{
    private String ime;
    private String prezime;
    
    public Osoba(String ime, String prezime){
        this.ime=ime;
        this.prezime=prezime;
    }
    public int compareTo(Osoba o){
        int rez=prezime.compareTo(o.prezime);
        if(rez==0)
            return ime.compareTo(o.ime);
        
            return rez;
    }
    public boolean equals(Object o){
        if(!(o instanceof Osoba))
            return false;
        return compareTo((Osoba)o)==0;
    }
    public String toString(){
        return prezime+" , "+ime;
    }
}


U main matodi imam ove dve metode koje bi trebalo da su povezane sa ovim izmenama ... ono sto mi nije jasno je na koji nacin su one izmene uticale da se sortira lista po prezimenu i uporede dva objekta ...

Code:
ArrayList<Osoba> listaOsoba=new ArrayList<>();
.
.
.
System.out.println("Sortiranje liste");
        Collections.sort(listaOsoba);
        for (Osoba o:listaOsoba){
            System.out.println(o);
        }
        
        Osoba trazise=ucitajOsobu();
        if(listaOsoba.contains(trazise))
            System.out.println("Osoba "+trazise+" se nalazi na listi.");
        else
            System.out.println("Osoba " +trazise+" se NE NALAZI na listi");
    }
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Implementacija metoda...09.03.2014. u 18:40 - pre 123 meseci
Meni nije jasno o kakvoj je izmeni reč. Da li je kod klase koji si okačio pre izmene ili posle izmene? Ko treba da uradi tu izmenu?

Inače, equals metoda koristi već definisanu metodu compareTo da proveri dve osobe za jednakost. compareTo vraća 0 ako su i ime i prezime dve osobe isti.
 
Odgovor na temu

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Re: Implementacija metoda...09.03.2014. u 18:51 - pre 123 meseci
Hajde da pokusam da budem konkretni sa pitanjem i mozda jasni ... Zasto sam morao da radim implementaciju metoda compareTo() i equals() ?
 
Odgovor na temu

dejanet
Beograd

Član broj: 19240
Poruke: 1181



+836 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:07 - pre 123 meseci
^ contains i sort koriste compareTo() i equals() koje si implementirao.
 
Odgovor na temu

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:07 - pre 123 meseci
Ako klasu osoba napravim bez implementacije ...
Code:
public class Osoba {
    private String ime;
    private String prezime;
    
    public Osoba(String ime, String prezime){
        this.ime=ime;
        this.prezime=prezime;
    }
    public String toString(){
        return prezime+" , "+ime;
    }
}

onda mi u main metodu pri pozivanju Collections.sort(listaOsoba); izbacuje gresku

"Bound mismatch: The generic method sort(List<T>) of type Collections is not applicable for the arguments (ArrayList<Osoba>). The inferred type Osoba is not a valid substitute for the bounded parameter <T extends Comparable<? super T>>"
 
Odgovor na temu

dejanet
Beograd

Član broj: 19240
Poruke: 1181



+836 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:14 - pre 123 meseci
Da bi sortirao objekat po property-iju, mislim da u object-u moras da implemetiras Comparble interface i da override-ujes compareTo() metod, kao sto si mislim uradio u prvoj varijanti.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:35 - pre 123 meseci
U principu ne mora, ali onda sam mora da napiše metodu za sortiranje. Ono što je poenta Comparable interfejsa (i compareTo metode koju on uslovljava) je da ti implementiraš njega u svojoj klasi, i tvoji objekti "gratis" dobijaju sistemsku podršku za sortiranje.

Isto važi i za equals metodu, koja se koristi u hešmapama itd.
 
Odgovor na temu

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:41 - pre 123 meseci
U pravu si Dejane, i u opisu zadatka u sustini pise to ... "implementacija metoda compareTo iz interfejsa Comparable<> omogucuje da se metodom Collections.sort() sortira kolekcija objekata tipa Osoba"

E ono sto sam odmah pitao je , kod koji je napisan, kako funkcionise jer nikada se ne bi setio nesto ovako da napisem... niti razumem ovaj deo programa pa zato ne bi ni napisao nesto ovako...

Code:
public int compareTo(Osoba o){
        int rez=prezime.compareTo(o.prezime);
        if(rez==0)
            return ime.compareTo(o.ime);
        
            return rez;
    }
    public boolean equals(Object o){
        if(!(o instanceof Osoba))
            return false;
        return compareTo((Osoba)o)==0;
 
Odgovor na temu

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:47 - pre 123 meseci
U narednim temama ima jos price o ovome tako da cu nastaviti pa ce biti verovatno jasnije kada prodjem sve to....

"Ono što je poenta Comparable interfejsa (i compareTo metode koju on uslovljava) je da ti implementiraš njega u svojoj klasi, i tvoji objekti "gratis" dobijaju sistemsku podršku za sortiranje." -- ovo sam razumeo ali nisam razumeo nacin na koji je implementiran...

na primer da Osoba ima pored imena i prezimena i datum rodjenja , kako bi izgledala implementacija compareTo() metoda ...
 
Odgovor na temu

dejanet
Beograd

Član broj: 19240
Poruke: 1181



+836 Profil

icon Re: Implementacija metoda...09.03.2014. u 19:50 - pre 123 meseci
Mislim da postoji slucaj kada npr. za sort ne moras da implementiras compareTo, a to je kada kao clan niza ili liste imas String, npr:
String[] xxxxx= new String[] {"aaa","bbb", "ccc", "ddd"};

i

List<String> yyyy= new ArrayList<String>();

yyyy.add("aaa");
yyyy.add("bbb");
yyyy.add("cccc");
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Implementacija metoda...09.03.2014. u 20:03 - pre 123 meseci
To je zato što String klasa već implementira compareTo i equals funkcije (kao i gomila drugih klasa, Integer, Float, ... http://docs.oracle.com/javase/.../api/java/lang/Comparable.html).
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Implementacija metoda...09.03.2014. u 21:13 - pre 123 meseci
Citat:
casperns2:
E ono sto sam odmah pitao je , kod koji je napisan, kako funkcionise jer nikada se ne bi setio nesto ovako da napisem... niti razumem ovaj deo programa pa zato ne bi ni napisao nesto ovako...

U suštini je vrlo jednostavno. Ti metodi sort daješ listu nečega - brojeva, stringova, osoba, bilo čega, i želiš da ti ona tu listu sortira. Da bi metoda sort to uradila ona mora umeti da uporedi dva po dva objekta iz te liste, da zna koji treba da se nađe pre, a koji posle u toj uređenoj sekvenci koju će ti ona vratiti. Jel dotle jasno?

E sad, za "sistemske" objekte, poput brojeva i stringova, Java zna kako da ih uporedi. Ono što ne zna su objekti koje ti praviš. Zato je tu metoda compareTo, kojom ti "objašnjavaš" sort metodi koji je objekat od ta dva tvoj objekta "manji" a koji "veći". sort() očekuje da compareTo() vrati -1, 0 ili 1 u zavisnosti od toga da li je prvi objekat manji, isti ili veći od drugog. U tvojoj klasi zadato je da se to poređenje vrši po prezimenu, pa po imenu (ako je prezime isto).

Praktično ni ne postoji neki drugi način da se uradi to osim onog koji si naveo, nema tu prevelike mudrosti.
 
Odgovor na temu

casperns2
Full Stack Java Web Developer
Novi Sad

Član broj: 288154
Poruke: 227
*.dynamic.sbb.rs.



+45 Profil

icon Re: Implementacija metoda...09.03.2014. u 21:24 - pre 123 meseci
Hvala jablane najlepse na ovakvom objasnjenu, sada mi je savrseno jasno , probacu sutra jos sa nekim eksperimentisanjima oko sortiranja i mislim da ce ici sada bez problema....
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Implementacija metoda...09.03.2014. u 21:51 - pre 123 meseci
Jasno je sta te buni - interfaces.
Interface je UGOVOR koji obavezuje klasu da implementira metode koje ovaj sadrzi. Na taj nacin, ako instanciras klasu preko(kao) interface-a, novi instanca moze da prodje kao argument svuda gde je predvidjen pomenuti interface.
Evo primera, gledaj svoj kod:

Code:

        ArrayList<Osoba> listaOsoba=new ArrayList<>();
        .
        .
        .
        System.out.println("Sortiranje liste");
        Collections.sort(listaOsoba);
        for (Osoba o:listaOsoba){
            System.out.println(o);
        }


Obrati paznju na

Code:
Collections.sort(listaOsoba);


Argument metode .sort() je List<> interface. Pa kako je onda prosao ArrayList? Jednostavno, ArrayList implementira List<> interface, i samim tim moze da se prosledi metodi sort.
Isto bi radilo i da si ArrayList klasu instancirao odmah kao List interface:

Code:

        List<Osoba> listaOsoba=new ArrayList<>();


Da li uvidjas ideju interface-a? A zamisli sad sledeci misaoni eksperiment:

1) Recimo da imamo klase C1, C2 i C3. Sve tri implementiraju neki interface I.
2) Sad recimo pisemo neku klasu Complex koja radi sa interface-om I (ima metode sa argumentima tipa I).
3) U aplikaciji nasumicno kreiramo instance C1, C2 ili C3, kako vec ide tok/algoritam. Po potrebi, instance prosledjujemo instanci klase Complex.
4) Instanca Complex ce raditi sa SVIM instancama (bilo C1, C2 ili C3) na potpuno isti nacin, ni ne znajuci sta je koja instanca (koja klasa); sve "vidi" kao interface I.
5) E, to garantuje ugovor/interface I.

Da li je sad malo jasnije?

Pozz
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Implementacija metoda...09.03.2014. u 22:11 - pre 123 meseci
Ja ću samo još jednu poruku i odjavljujem se, obećavam...

Citat:
Rapaic Rajko: Jasno je sta te buni - interfaces.


Buni ga interfejs, ali samo zato što je on zapravo suvišan koncept prilikom učenja OOP (o tome smo već pričali u drugom tredu).

Ono što je suština priče je da sort metoda koristi metodu compareTo da bi znala kojim redosledom da poređa neke njegove Osobe. Samo to i ništa više. E sad, da bi se to tehnički izvelo, u Javi si prinuđen da koristiš interfejse. :) Kad ti sve to ovako nabace na gomilu u jednom zadatku, sasvim je normalno da se čovek zbuni...
 
Odgovor na temu

Rapaic Rajko
Bgd

Član broj: 4105
Poruke: 810
..ppoe.dyn.broadband.blic.net.



+62 Profil

icon Re: Implementacija metoda...10.03.2014. u 15:00 - pre 123 meseci
Ali compareTo() je upravo DEO nekog interface-a/ugovora (u ovom slucaju Comparable<>), o tome pricamo.

Kako bi inace pozivao/pisao u kodu poziv metode .compareTo(), od instanci razlicitih klasa (C1, C2 ili C3), koje sam recimo napakovao u neki List<>?
(U Delphi-ju je moguce dobiti odredjenu metodu (po nazivu) iz neke instance nepoznate klase, ali to je zapravo budjevina svoje vrste (pricam o unit-u typinfo.pas))

Da li to neki jezici omogucuju bez upotrebe interface-a?

Pozz
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Implementacija metoda...10.03.2014. u 15:37 - pre 123 meseci
Naravno.

Smalltalk, kao OOP rodonačelnik, i Ruby i Python kao savremeni predstavnici dinamičkih jezika ne poznaju koncept interfejsa. Na bilo kom objektu možeš pozvati bilo koju metodu, i ako objekat ne ume da odgovori na poziv, doći će do exceptiona. (Postoji čak i pojam: "duck typing" - ako ptica hoda kao patka i kvače kao patka, onda je patka. ;) Drugim rečima, ako objekti imaju compareTo metodu, onda će sort moći da ih sortira.)

Pored toga, i statički OO jezici poput C++-a koji podržavaju višestruko nasleđivanje (obično) nemaju interfejse.
 
Odgovor na temu

dusans
Stojanov Dušan
Pančevo

Član broj: 9551
Poruke: 1343
*.dynamic.sbb.rs.



+311 Profil

icon Re: Implementacija metoda...10.03.2014. u 15:45 - pre 123 meseci
@jablan

Pa baš zato im i ne trebaju interfejsi - dozvoljavaju ti da napišeš brljotinu i pozoveš metodu koja ne postoji.
Interfejs u C#, Javi je eksplicitan ugovor koji moraš i formalno da napišeš u kodu,
a koji u npr. Ruby-ju ne moraš (a verovatno i ne možeš) da napišeš, ali ga svakako poštuješ preko neke konvencije.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+711 Profil

icon Re: Implementacija metoda...10.03.2014. u 16:08 - pre 123 meseci
Tako je, dinamički jezici imaju vrline i mane. Doduše, pozivanje metode koja ne postoji nije uvek brljotina, nekad itekako ima smisla.

BTW, evo kako u Rubiju izgleda sortiranje objekata custom klase (Javina metoda compareTo u Rubiju je operator <=>, ali je ideja praktično ista): http://ideone.com/bu8q5i
 
Odgovor na temu

[es] :: Java :: Implementacija metoda...

[ Pregleda: 3699 | Odgovora: 18 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.