[Java] Inicializácia objektu, niečo ako record alebo struct

Programovacie jazyky, rady, poradňa...
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

[Java] Inicializácia objektu, niečo ako record alebo struct

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

Mám problém s inicializovaním objektu v Jave, ktorý chcem použiť ako niečo podobné ako je record alebo struct. Keď to spravím bez poľa, tak to funguje, ale s poľom objektov mi to vyhadzuje chybu.

"hlavný program"

Kód: Vybrať všetko

 public static void main(String[] args) {
        // TODO code application logic here
        Scanner sc = new Scanner(System.in);
        int pocetVrcholov;
        System.out.println("Napis pocet vrcholov");
        pocetVrcholov = sc.nextInt();
        int n;
        vrchol v = null;
        vrchol[] poleVrcholov;
        System.out.println("Pocet vrcholov: "+pocetVrcholov);
        poleVrcholov = new vrchol[pocetVrcholov];
        v = new vrchol(v.Cislo,v.nazov,v.cena,v.pocetNaslednikov,v.naslednici);
        System.out.println("Pocet vrcholov: "+pocetVrcholov);
        poleVrcholov = new vrchol[pocetVrcholov];
        for (int j = 0; j < pocetVrcholov; j++) {
        poleVrcholov[j].Cislo = j+1;
        System.out.println("Napis nazov vrchola");
        poleVrcholov[j].nazov = sc.next();
        System.out.println("Napis dlzku cinnosti");
        poleVrcholov[j].cena = sc.nextInt();
        System.out.println("Napis pocet vrcholov doprednej hviezdy");
        poleVrcholov[j].pocetNaslednikov = sc.nextInt();
        v.naslednici = new String[poleVrcholov[j].pocetNaslednikov];
        for (int i = 0; i < poleVrcholov[j].pocetNaslednikov; i++){
          System.out.println("Napis naslednika");
          poleVrcholov[j].naslednici[i] = sc.next();
        }
        }
        for (int j = 0; j < pocetVrcholov; j++) {
        System.out.println("Cislo: "+poleVrcholov[j].Cislo);
        System.out.println("Nazov: "+poleVrcholov[j].nazov);
        System.out.println("Dlzka: "+poleVrcholov[j].cena);
        System.out.print("Naslednici: ");
        for (int i = 0; i < poleVrcholov[j].pocetNaslednikov; i++) {
          System.out.print(poleVrcholov[j].naslednici[i]+" ");
        }
        }
    }
trieda vrchol:

Kód: Vybrať všetko

public class vrchol {
   int Cislo;
   String nazov;
   int cena; // dlzka cinnosti
   int pocetNaslednikov;
   String[] naslednici;

    public vrchol (int parCislo, String parNazov, int parCena, int parPocetNaslednikov, String[] parNaslednici) {
       Cislo = parCislo;
       nazov = parNazov;
       cena = parCena;
       pocetNaslednikov = parPocetNaslednikov;
       naslednici = parNaslednici;
       throw new UnsupportedOperationException("Not yet implemented");
       }
    
void inic() {
        throw new UnsupportedOperationException("Not yet implemented");
    }

}
alebo ešte by som mohol spraviť v triede vrchol nejakú metódu napln a potom aj vypis. Čo by bolo lepšie? Ďakujem.
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] Inicializácia objektu, niečo ako record alebo struct

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

v prvom rade sa drz zavedenych noriem...nazvy tried maj velkym zaciatocnym a vsetky premenne malym, hlavne teda Vrchol a cislo...
trieda Vrchol:
ten throw tam mas naco? ak uz na nieco je dobry, preco je aj v metode aj v konstruktore? bud jedno abo druhe (ja by som nedal ani ani)...v konstruktore si daj pred kazdu premennu this. (this.cislo=parCislo) a vsetky "globalne" premenne public (nechce sa mi ti vysvetlovat gettre a settre)
co sa tyka vytvarania objektov, vyzera to nejak takto:
Vrchol v = new Vrchol(parameterzkonstruktora1,..atd);
tie parametre tam musis uz pchat konkretne, t.j. najprv si radsej urob vo for cykle nacitanie do docasnych premennych a potom vytvor objekt
pole:
Vrchol[] poleVrcholov = new Vrchol[velkostpola];
do neho priradujes takto:
poleVrcholov=new Vrchol(tie tvoje parametre);
(je mozne ze pri poliach to je inak, nepamatam jak s nimi, davno som s nimi nerobil, robim radsej s dynamickym polom - ArrayList-om, ak chces o nom nieco pekne pocut, napis) - v tom tvojom je brutalne citit pascal
ps: rob si metody, nepis vsetko do mainu
ps2: nemam sajnu co to ma robit :D
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Re: [Java] Inicializácia objektu, niečo ako record alebo struct

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

Taaaaakze.
mirak2 to vystihol az az.
1) Zide sa nieco precitat o tom ako by mal nejaky ten zdrojak vyzerat, aby to tu nevyzeralo ze dristam do vetra uvadzam link:
2)Problém z poľom. Keď sa v jave vytvára pole, nie je to také isté pole ako pole záznamov v pascale. Kompilátor pascalu vie dopredu aký veľký bude daný record, kedže (v štandartnom) pascale nie je možné vytvárať dynamické pole (to je niečo iné ako dynamický zoznam) a teda vie vyhradiť potrebnú pamaäť. V jave je to problém, keďže pole sa vytvára dynamicky (až za behu programu sa mu pridelí príslušná pamäť - ako parameter pri vytváraní môže byť premenná (v pascali to nejde) Vrchol[]v = new Vrchol[y]), pole nie je nič iné ako pole odkazov do pamäti (nejake 32 bitové (dnes už aj 64 bitové) číslo), Ked teda vytvoríš pole Vrchol []v = new Vrchol[100] vytvoríš len pole odkazov (štandartne nastavených na null). v[22].x vyvolá výnimku java.lang.NullPointerException, kedže sa snažíš pristúpiť k pamäti ktorá nie je alokovaná. Preto musíš v cykle každú položku poľa nastaviť na ne-nulll-ový ukazateľ => v[x] = new Vrchol(...);
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] Inicializácia objektu, niečo ako record alebo struct

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

ked zacina s javou nepotrebuje vediet ako su struktury reprezentovane v pamati a ak to potrebuje vediet tak to velmi nepochopi...
ak zacnes prepisovat veci z mainu do metod, urcite natrafis na problem static...k tomu neskor, az k tomu dojdes
Sagittarius
Guru
Guru
Používateľov profilový obrázok
Príspevky: 2883
Registrovaný: 13 feb 2007, 21:58
Bydlisko: Do nekonečna a ešte ďalej

Re: [Java] Inicializácia objektu, niečo ako record alebo struct

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

Ďakujem obom za pomoc. :) Už mi to funguje len to ešte musím dať do metód.

mirak2: ten ArrayList by som si chcel pozrieť, ako sa robí, ak vieš o nejakých dobrých materiáloch na nete, stačili by aj tie.

A ešte by sa chcel spýtať ako v Jave vyzerať nejaký formátovaný vstup z textového súboru. Či také niečo existuje alebo sa všetko musí pretypovávať zo stringov. Lebo som nikde zatiaľ nič také nenašiel, ani na nete, ani v Heroutovej knižke.

A čo to má robiť? Toto konkrétne je načítanie grafu pre úlohu časového plánovania. Názov je názov vrcholu/činnosti, cena je trvanie činnosti a tie ostatné vrcholy sú následníci tej činnosti.
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Re: [Java] Inicializácia objektu, niečo ako record alebo struct

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

Vsak mozes pouzit scanner, ako keby si citaj z konzoly len namiesto system.in das new FileInputStream("subor");

k arraylistu:
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] Inicializácia objektu, niečo ako record alebo struct

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

teoreticke blaboly k listom: http://web.ics.upjs.sk/paz/PAZ1aPrednasky/10Prednaska vyber si ci chces ppt alebo suvisly text
uprimne nikdy som nepouzival scanner na nacitavanie z konzoly, stale len na nacitanie zo suboru..mozes to urobit aj tak, ze Scanner scFile = new Scanner(new File(cestaksuboru)); (pri cestach k suboru pouzivaj dvojitu lomku \\) a potom mozes pouzivat scFile.next a ostatne metody pre triedu Scanner (pheo, aky ne rozdiel medzi fileinputstream a fileom? ze jeden pluje vynimku a druhy nie?)
pheo
Light Star
Light Star
Používateľov profilový obrázok
Príspevky: 212
Registrovaný: 20 sep 2005, 16:53
Bydlisko: moje hniezdo
Kontaktovať používateľa:

Re: [Java] Inicializácia objektu, niečo ako record alebo struct

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

Kód: Vybrať všetko

Scanner(InputStream source) 
potrebuje inputsream => keď tam chceš dať subor, použiješ FileInputStrem, keď ho vytváraš cez konstruktor tak sa subor hneď otvorí, výnimka je tam z toho dôvodu, že prístup k súboru sa nemusí podariť - subor neexistuje, nie sú dostatočné práva .....
Keď použiješ 
Scanner(File source)
si to scanner ošetruje sám.

Napísať odpoveď