JAVA - pomoc s ArrayListom a metódami

Programovacie jazyky, rady, poradňa...
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa macher1 »

Zdravím!
Neviem si dať rady s jednou časťou programu. Takže:

- mám triedy Ziak, Kontakty, Adresa, DatumNarodenia a Zoznam
- pri vytváraní inštancie triedy Ziak treba vytvoriť inštanciu triedy Kontakty
- pri vytváraní inštancie triedy Kontakty treba vytvoriť inštanciu triedy Adresa a DatumNarodenia
- mám triedu Zoznam obsahujúcu ArrayList typu Ziak
- v tejto triede chcem mať metódu, ktorá vypíše cez príkaz for each údaje všetkých žiakov. A tu nastáva problém!

Z nasledujúcich zdrojákov som naschvál vyhodil settery.
Trieda Ziak:

Kód: Vybrať všetko

public class Ziak
{
    public static String meno;
    public static String priezvisko;
    public static Kontakty kontakty;
    
    public Ziak(String meno,String priezvisko,Kontakty kontakty)
    {
        this.meno=meno;
        this.priezvisko=priezvisko;
        this.kontakty=kontakty;
    }
    
    public String getMenoZiaka()
    {
        return meno;
    }
    public String getPriezviskoZiaka()
    {
        return priezvisko;
    }
    public Kontakty getKontakty()
    {
        return kontakty;
    }

    public void printVytlac()
    {
        System.out.println("********Osobne udaje ziaka********");
        System.out.println("Meno: "+meno);
        System.out.println("Priezvisko: "+priezvisko);
        System.out.println("Narodeny/a: "+DatumNarodenia.den+"."+DatumNarodenia.mesiac+"."+DatumNarodenia.rok);
        System.out.println("Ulica: "+Adresa.ulica);
        System.out.println("Cislo domu/bytu: "+Adresa.cisloDomu);
        System.out.println("PSC: "+Adresa.PSC);
        System.out.println("Mesto: "+Adresa.mesto);
    }
}
Trieda Kontakty:

Kód: Vybrať všetko

public class Kontakty
{
    public static String telefon;
    public static DatumNarodenia datumNarodenia;
    public static Adresa adresa;
    
    public Kontakty(String telefon,Adresa adresa,DatumNarodenia datumNarodenia)
    {
        this.telefon=telefon;
        this.adresa=adresa;
        this.datumNarodenia=datumNarodenia;
    }
    
    public String getTelefon()
    {
        return telefon;
    }
    public Adresa getAdresa()
    {
        return adresa;
    }
    public DatumNarodenia getDatumNarodenia()
    {
        return datumNarodenia;
    }
}
Trieda Adresa:

Kód: Vybrať všetko

public class Adresa
{
    public static String ulica;
    public static int cisloDomu;
    public static String mesto;
    public static String PSC;
    
    public Adresa(String ulica,int cisloDomu,String mesto,String PSC)
    {
        this.ulica=ulica;
        this.cisloDomu=cisloDomu;
        this.PSC=PSC;
        this.mesto=mesto;
    }
    
    public String getNazovUlice()
    {
        return ulica;
    }
    public int getCisloDomu()
    {
        return cisloDomu;
    }
    public String getPSC()
    {
        return PSC;
    }
    public String getMesto()
    {
        return mesto;
    }
    public String toString()
    {
        return this.ulica+" "+this.cisloDomu+" "+this.PSC+" "+this.mesto;
    }
}
Trieda DatumNarodenia:

Kód: Vybrať všetko

public class DatumNarodenia
{
    public static int den;
    public static int mesiac;
    public static int rok;
    
    public DatumNarodenia(int den,int mesiac,int rok)
    {
        this.den=den;
        this.mesiac=mesiac;
        this.rok=rok;
    }
    
    public int getDenNarodenia()
    {
        return den;
    }
    public int getMesiacNarodenia()
    {
        return mesiac;
    }
    public int getRokNarodenia()
    {
        return rok;
    }
    public String toString()
    {
        return this.den+"."+this.mesiac+"."+this.rok;
    }
}
Trieda Zoznam:

Kód: Vybrať všetko

import java.util.*;
class Zoznam
{
    private ArrayList<Ziak> ziak = new ArrayList<Ziak>();
    
    
    public void pridajZiaka(Ziak z)
    {
       ziak.add(z);
    }
    public void vytlacVsetkych()
    {
            for(Ziak z : ziak)
                System.out.println("***********************");
                System.out.println(""+Ziak.meno+" "+Ziak.priezvisko);
                System.out.println(""+DatumNarodenia.den+"."+DatumNarodenia.mesiac+"."+DatumNarodenia.rok);
                System.out.println(""+Adresa.ulica+" "+Adresa.cisloDomu+" "+Adresa.PSC+" "+Adresa.mesto);
                System.out.println("***********************");
    }
}
Chcem aby mi metóda vytlacVsetkych() vytlačila všetkých žiakov vo formáte
- meno a priezvisko
- dátum narodenia
- adresa
Napr.
jozko mrkvicka
11.11.2000
podmostova 4 90999 bratislava
Problém je ale v tom, že keď vytvorím novú inštanciu triedy Ziak, a potom použijem metódu pridajZiaka triedy Zoznam, tak potom keď dám vytlačiť všetkých žiakov (pomocou metódy vytlacVsetych()) tak mi vypíše iba poslednú vytvorenú inštanciu. A keď vytvorím zas ďalšiu inštanciu triedy Ziak a pridám ju do Zoznam-u, tak Zoznam vypíše opäť len posledného pridaného žiaka. Dúfam že ste pochopili pointu môjho problému.
Takže čo s tým?
paralen
Light Star
Light Star
Príspevky: 267
Registrovaný: 02 máj 2006, 15:15

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa paralen »

Neviem, kde si videl ze k datovym clenom triedy mas vzdy pridavat public static, ale tu tkvie problem. Ak je datovy clen staticky tak "patri triede" a nie instancii triedy. To znamena, ze v celej aplikacii sa nachadza iba jeden zaznam s danym datovym clenom. Odstran static
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa macher1 »

Z ktorej triedy mám odstrániť static?
Ichi
Zablokovaný
Zablokovaný
Príspevky: 5
Registrovaný: 04 dec 2012, 15:53

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa Ichi »

zo všetkých, vieš čo je to OOP a ako funguje static?
macher1
Light Expert
Light Expert
Používateľov profilový obrázok
Príspevky: 38
Registrovaný: 07 jún 2011, 19:36

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa macher1 »

Vyhodil som static zo všetkých a pri kompilácií (triedy Ziak) mi píše chybu "non-static variable den cannot be referenced from a static context". Je to v riadku

Kód: Vybrať všetko

System.out.println("Narodeny/a: "+DatumNarodenia.den+"."+DatumNarodenia.mesiac+"."+DatumNarodenia.rok);
A keď kompilujem triedu Zoznam tak mi vypíše tu istú hlášku, ale pri premennej meno, a to v tomto riadku

Kód: Vybrať všetko

System.out.println(""+Ziak.meno+" "+Ziak.priezvisko);
axxis
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3690
Registrovaný: 29 máj 2007, 21:53
Bydlisko: Spálené mlyny
Kontaktovať používateľa:

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa axxis »

macher1 napísal:Vyhodil som static zo všetkých a pri kompilácií (triedy Ziak) mi píše chybu "non-static variable den cannot be referenced from a static context". Je to v riadku

Kód: Vybrať všetko

System.out.println("Narodeny/a: "+DatumNarodenia.den+"."+DatumNarodenia.mesiac+"."+DatumNarodenia.rok);
A keď kompilujem triedu Zoznam tak mi vypíše tu istú hlášku, ale pri premennej meno, a to v tomto riadku

Kód: Vybrať všetko

System.out.println(""+Ziak.meno+" "+Ziak.priezvisko);
cakal si nieco ine? tie property musis volat na premennej, nie na triede. mas tam cyklus, aj ked nemas paru o OOP mohlo Ta napadnut, ze ked v cykle iterujes list premennych tak by si mozno mohol pracovat s nimi a nie s triedou, ktora je len ich predpis. to iste plati pre datum narodenia (ktory mimochodom nemas nikde instanciovany)
pcsiete
Medium Star
Medium Star
Príspevky: 413
Registrovaný: 07 dec 2012, 18:47

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa pcsiete »

Inak povedane: do arraylistu musis najprv nahadzat instancie. To robis cez pridajZiaka. A teaz musis pouzit 'z' vo vispisovani, aby si vypisoval kokretnu premennu. Takze tam daj z.meno, z.priezvisko a vsade povymazuj static. A presne naopak v zozname by som osobne pouzil vsetko na static, pokym sa niekde nespracovava viac zoznamov. BTW axxis ma pravdu, urcite nemas ani paru o OOP.
Ichi
Zablokovaný
Zablokovaný
Príspevky: 5
Registrovaný: 04 dec 2012, 15:53

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa Ichi »

axxis napísal:cakal si nieco ine? tie property musis volat na premennej, nie na triede. mas tam cyklus, aj ked nemas paru o OOP mohlo Ta napadnut, ze ked v cykle iterujes list premennych tak by si mozno mohol pracovat s nimi a nie s triedou, ktora je len ich predpis. to iste plati pre datum narodenia (ktory mimochodom nemas nikde instanciovany)
Myslíš že ti niečo rozumel? Ja myslím že nie :) Podľa mňa by nemal robiť takéto programy pokým neovláda OOP a aj Javu lebo zjavne nechápe viacerým veciam na objektoch, funkciách, ...
mirak2
Hardcore addict
Hardcore addict
Používateľov profilový obrázok
Príspevky: 6719
Registrovaný: 18 sep 2005, 13:44
Bydlisko: Prague, CZE / Kosice, SVK

Re: JAVA - pomoc s ArrayListom a metódami

Príspevok od používateľa mirak2 »

nehovoriac o tom, ze ten foreach ani nemas cely v kuceravych zatvorkach, teda ti vypise riadok plny hviezdiciek tolkokrat, kolko je objektov v arrayliste a az po tom prave raz ten tvoj static humus
princip foreach je ten, ze v kazdej iteracii cyklu pracujes s instanciou Ziaka, ktora je oznacena ako z. preto v kazdom vypise budes mat trebars

Kód: Vybrať všetko

System.out.println(""+z.getmeno()+" "+z.getpriezvisko());
a vsetky ostatne podobne. na TO presne su gettery....a potom datum narodenia vypises takto:

Kód: Vybrať všetko

System.out.println("Narodeny/a: "+z.getdatumnarodenia().getden()+"."+z.getdatumnarodenia().getmesiac()+"."+z.getdatumnarodenia().getrok());
(samozrejme so spravne napisanymi nazvami metod, java je case-sensitive)
PS: a uz ked mas metodu printVytlac v ziakovi, tak preco nepouzijes rovno ju? vo foreach budes mat len jeden riadok z.printVytlac() a nemusis sa o nic starat
Napísať odpoveď