Java

Programovacie jazyky, rady, poradňa...
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Java

Príspevok od používateľa beluský »

Hello World,
začínam v Jave a mám vytvoriť projekt "plánovač úloh".
... začal som to ukladať do poľa a keďže nikto nevie koľko úloh bude, použil by som dynamické pole, kde o tom niečo nájdem?
Lebo keď nadefinujem pole napr.

Kód: Vybrať všetko

Uloha[] ulohy = new Uloha[3];
je v nom vlozeny jeden prvok a vypisujem to cyklom

Kód: Vybrať všetko

...
System.out.println(i+1+". ("+p[i].menoZakladatela+") "+ p[i].textUlohy);
...
prvy vypise, potom hlasi chybu "java.lang.NullPointerException"...

preto chcem pouzit dynamicke pole... alebo dá sa to nejak inak obísť...
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

Použi ArrayList
Info nájdeš hocikde ked pogooglis alebo na stranke sunu java.sun.com

// Odporucam použiť ku ArrayListu generics aby si zakaždým nemusel pretypovávať premenné pri manipulácii s nimi

No menšia ukážka ako sa pracuje s arraylistom a generics

Kód: Vybrať všetko

package temppack;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

public class TestClass {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//bez generics
		//ArrayList pole = new ArrayList();
		ArrayList<Uloha> pole = new ArrayList<Uloha>();//Tymto zabezprcis ze do Arraylistu pole budes davat iba objekty typu Uloha
		pole.add(new Uloha("Jan", 5));
		pole.add(new Uloha("Peter", 5));
		
		for(int i=0; i<pole.size(); i++){
			pole.get(i).vypis_ulohu();
		}
		
		// bez generics by si to musel zakazdym pretypovavat
		// for(int i=0; i<pole.size(); i++){
		// 	((Uloha) pole.get(i)).vypis_ulohu();
		// }
	}

}

class Uloha{
	private String meno;
	private int cislo;
	public Uloha(String s, int c){
		this.meno = s;
		this.cislo = c;
	}
	public String getMeno() {
		return meno;
	}
	public void setMeno(String meno) {
		this.meno = meno;
	}
	public int getCislo() {
		return cislo;
	}
	public void setCislo(int cislo) {
		this.cislo = cislo;
	}
	
	public void vypis_ulohu(){
		System.out.println("Meno : "+this.meno + " cislo : "+this.cislo);
	}
}

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:

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

NO v tvojom prípade ide o rídzo začiatočnícku chybku :) Ide o to že pole objektov sa inicializuje inak, ako pole primitívnych dátových tipov (int , double).
Jednotlivé položky poľa je nutné initializovať postupne teda niečo v šýle cyklu:

Kód: Vybrať všetko

for(int i=0; i < pole.length; i++) {
pole[i] = new Clovek(); 
}
Dôvod takéhoto postupu je že objekty nemusia mať vždy bezparametrický konštruktor a teda pri inicializácií je mu možné predať parametre, čo by sa pri jednorazovej inicializacii nedalo ;)

Hlási to chybu preto že tým tvojím zápisom vytvorí len jednu inštanciu objektu a ostatné su defaul null

inak dinamické premenné nepoužívaj ak nevieš koľko budeš mať prvkov. Pri výpočtoch s veľkým množstvom prvkov ta to bude spomaľovať.


//inak xivo prečo tam používaš tu IOexception ?
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

pheo napísal:NO v tvojom prípade ide o rídzo začiatočnícku chybku :) Ide o to že pole objektov sa inicializuje inak, ako pole primitívnych dátových tipov (int , double).
Jednotlivé položky poľa je nutné initializovať postupne teda niečo v šýle cyklu:

Kód: Vybrať všetko

for(int i=0; i < pole.length; i++) {
pole[i] = new Clovek(); 
}
Dôvod takéhoto postupu je že objekty nemusia mať vždy bezparametrický konštruktor a teda pri inicializácií je mu možné predať parametre, čo by sa pri jednorazovej inicializacii nedalo ;)

Hlási to chybu preto že tým tvojím zápisom vytvorí len jednu inštanciu objektu a ostatné su defaul null
čiže treba najprv všetko inicializovať a až potom s tým ide pracovať, dobre to chápem? :)
a keby som chcel pridať daľší prvok poľa... tak treba na to ArrayList?
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:

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

Ano najprv musiš vytvoriť všetky inštancie a až potom s nimi pracovať. Pole obejktov nie su priamo inštancie ale len referencie na inštancie (proste odkazy ) Keď pole nadefinuješ napevno už ho nemôžeš roširovať , na dinamické pole sa používa trieda ArraList z Collection java (ako už radil xivo).
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

pheo napísal:Ano najprv musiš vytvoriť všetky inštancie a až potom s nimi pracovať. Pole obejktov nie su priamo inštancie ale len referencie na inštancie (proste odkazy ) Keď pole nadefinuješ napevno už ho nemôžeš roširovať , na dinamické pole sa používa trieda ArraList z Collection java (ako už radil xivo).
aha to som potreboval vedieť, vďak K+
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

a ešte by som potreboval nejaké funkcie na prácu s časom... ale nejak normálne vyzerajúcim... nie ako new Date(); ;)
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

xivo napísal:Použi ArrayList
Info nájdeš hocikde ked pogooglis alebo na stranke sunu java.sun.com

// Odporucam použiť ku ArrayListu generics aby si zakaždým nemusel pretypovávať premenné pri manipulácii s nimi

No menšia ukážka ako sa pracuje s arraylistom a generics

Kód: Vybrať všetko

package temppack;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;

public class TestClass {

	/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {
		//bez generics
		//ArrayList pole = new ArrayList();
		ArrayList<Uloha> pole = new ArrayList<Uloha>();//Tymto zabezprcis ze do Arraylistu pole budes davat iba objekty typu Uloha
		pole.add(new Uloha("Jan", 5));
		pole.add(new Uloha("Peter", 5));
		
		for(int i=0; i<pole.size(); i++){
			pole.get(i).vypis_ulohu();
		}
		
		// bez generics by si to musel zakazdym pretypovavat
		// for(int i=0; i<pole.size(); i++){
		// 	((Uloha) pole.get(i)).vypis_ulohu();
		// }
	}

}

class Uloha{
	private String meno;
	private int cislo;
	public Uloha(String s, int c){
		this.meno = s;
		this.cislo = c;
	}
	public String getMeno() {
		return meno;
	}
	public void setMeno(String meno) {
		this.meno = meno;
	}
	public int getCislo() {
		return cislo;
	}
	public void setCislo(int cislo) {
		this.cislo = cislo;
	}
	
	public void vypis_ulohu(){
		System.out.println("Meno : "+this.meno + " cislo : "+this.cislo);
	}
}

nevieš prečo keď vkladám nové objecty do ArrayListu, tak sa mi vsetky prepisu tym poslednym...

na načítavanie reťazcov používam toto

Kód: Vybrať všetko

public static String VstupRet() {
		byte[] pole = new byte[200];
		String nacitane;
		
		try {
			System.in.read(pole);
			nacitane = new String(pole).trim();
			return nacitane;
		}
		catch (IOException e) {
			// TODO: handle exception
			Prtln("Zle nacitany retazec!");
			return "";
		}
	}
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

S tou funkciou by nemalo byt nic zle (ona ti nemoze ovplivnit objekty v ArrayListe) skusk hladat v nejakom forcykle (skor)
Inac newiem preco to citas do toho pola bytov

Kód: Vybrať všetko

byte[] pole = new byte[200];
a necitas to rovno do Stringu

//inac bez zdrojaku ti toho moc nepowiem
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

xivo napísal:S tou funkciou by nemalo byt nic zle (ona ti nemoze ovplivnit objekty v ArrayListe) skusk hladat v nejakom forcykle (skor)
Inac newiem preco to citas do toho pola bytov

Kód: Vybrať všetko

byte[] pole = new byte[200];
a necitas to rovno do Stringu

//inac bez zdrojaku ti toho moc nepowiem
a ako sa nacita teda string, lebo v knihe som nasiel iba toto

no neviem ci sem mozem dat kody, kedze to je moja dusevna tvoriva cinnost :D
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

Kód: Vybrať všetko

String name;
Scanner in = new Scanner(System.in);//musis si vytvorit Objekt typu Scanner a potom uz iba pouzivas in.nextLine(); pre citanie riadku
name = in.nextLine();
System.out.println(name);

beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

ide o to, že ja keď zadávam prvky do toho pola (arraylist) tak kazdy prvok pola obsahuje vzdy referenciu na posledny pridany prvok, neviem ci som to dobre vysvetlil...

tu je vystup mojho programu :

Kód: Vybrať všetko

---------------------------
MENU
1) Vlozit ulohu
2) Vypis zoznam uloh
3) Zmazat ulohu
4) Koniec
===========================
Volba >> 1
---------------------------
Zadaj meno >> Jozko
Zadaj ulohu >> nic
---------------------------
MENU
1) Vlozit ulohu
2) Vypis zoznam uloh
3) Zmazat ulohu
4) Koniec
===========================
Volba >> 1
---------------------------
Zadaj meno >> dwa
Zadaj ulohu >> tri
---------------------------
MENU
1) Vlozit ulohu
2) Vypis zoznam uloh
3) Zmazat ulohu
4) Koniec
===========================
Volba >> 2
---------------------------
Mate 2 naplanovanych uloh.
1. (dwa) tri
    Thu Mar 06 12:36:39 CET 2008
2. (dwa) tri
    Thu Mar 06 12:36:49 CET 2008
---------------------------
MENU
1) Vlozit ulohu
2) Vypis zoznam uloh
3) Zmazat ulohu
4) Koniec
===========================
Volba >> 1
---------------------------
Zadaj meno >> prepisem to
Zadaj ulohu >> nejde to :(
---------------------------
MENU
1) Vlozit ulohu
2) Vypis zoznam uloh
3) Zmazat ulohu
4) Koniec
===========================
Volba >> 2
---------------------------
Mate 3 naplanovanych uloh.
1. (prepisem to) nejde to :(
    Thu Mar 06 12:36:39 CET 2008
2. (prepisem to) nejde to :(
    Thu Mar 06 12:36:49 CET 2008
3. (prepisem to) nejde to :(
    Thu Mar 06 12:37:11 CET 2008
---------------------------
MENU
1) Vlozit ulohu
2) Vypis zoznam uloh
3) Zmazat ulohu
4) Koniec
===========================
Volba >> 4
---------------------------
Koniec.
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

Ak si podavas len refernciu tak potom ked posledny vymazes a das ich vypisat tak ti bud hodi error alebo null, skus.
Lebo vyzera to ze fakt podavas iba tie referenice na ten isty objekt

proste ked das nacitat tak si musis vzdy vytvorit novy objekt Typu Uloha

tj nacitas
ArrayList<Ulohy> pole = new ArrayList<Ulohy>();
String meno = "peter";
Sring uloha = "daco";
pole.add( new Uloha(meno,uloha));
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

// vdaka za ochotu
xivo napísal:Ak si podavas len refernciu tak potom ked posledny vymazes a das ich vypisat tak ti bud hodi error alebo null, skus.
Lebo vyzera to ze fakt podavas iba tie referenice na ten isty objekt

proste ked das nacitat tak si musis vzdy vytvorit novy objekt Typu Uloha

tj nacitas
nehodí mám to ošetrené

Kód: Vybrať všetko

zmaz = IO.VstupInt();
					if (zmaz != 0 && zmaz <= ulohy.size()) {
						ulohy.remove(zmaz-1);
						IO.Prtln("Uloha c."+zmaz+" zmazana.");
					}
					else 
						IO.Prtln("Uloha, ktoru chcete zmazat neexistuje.");
a aj to čo si radil mám

Kód: Vybrať všetko

ulohy.add(new Uloha());
					IO.Prt("Zadaj meno >> ");
					ulohy.get(ulohy.size()-1).nastavMeno(IO.VstupRet());
					IO.Prt("Zadaj ulohu >> ");
					ulohy.get(ulohy.size()-1).nastavText(IO.VstupRet());
					break;
dokonca aj pridavanie pomocou konstruktoru tvojho typu som skusal a stale to nejde ako ma, ja uz neviem kde moze byt chyba... skusal som vselico
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

Nakolko nemam velky pristup k tvojim tazkym zdrojakom tak som sa rozhodol spravit vernu kopiu tvojho programu, n ilustraciu toho ako by to malo vyzerat .. je fprilohe a ide ako ma :)

este to ze ci problem nebude f tch dvoch premenny (meno, uloha) nakolko su Stringy objekty a ked sprais priradenie tak vlastne podavas iba referenciu ... kedze mas prazdny konstruktor(co neodporucam) tak este pohladaj v tom com pisem ...

//sakra neslo to uploadnut

Kód: Vybrať všetko

package tmp;

import java.util.ArrayList;
import java.util.Scanner;

import javax.swing.JOptionPane;

import sun.util.calendar.BaseCalendar.Date;

public class TestClass {
	static ArrayList<Uloha> t = new ArrayList<Uloha>();
	
	public static void main(String[] args){
		int vyber = 0;
		while(vyber != -1){
			System.out.println("Pre pridanie zadaj 1");
			System.out.println("Pre zmazanie zadaj 2");
			System.out.println("Pre vypis zadaj 3");
			String inputValue = JOptionPane.showInputDialog("Please input a value");
			vyber = Integer.parseInt(inputValue);
			switch(vyber){
			case 1 : pridaj_zanam();
			break;
			case 2 : vymaz_zaznam();
			break;
			case 3: vypis_vsetko();
			break;
			default : System.out.println("Zadal si zlu hodnotu");
			break;
			}
		}
	}

	private static void vypis_vsetko() {
		for(int i=0; i<t.size(); i++){
			System.out.println(t.get(i).vypis());
		}
	}

	private static void vymaz_zaznam() {
		String meno = JOptionPane.showInputDialog("Zadaj meno");
		
	}

	private static void pridaj_zanam() {
		String meno = JOptionPane.showInputDialog("Zadaj meno");
		String uloha = JOptionPane.showInputDialog("Zadaj ulohu");
		t.add(new Uloha(meno,uloha));
	}

	
}

class Uloha{
	private String meno;
	private String uloha;
	private java.util.Date datum;
	
	public Uloha(String m, String u){
		this.meno = m;
		this.uloha = u;
		datum = new java.util.Date();
	}
	
	public String vypis(){
		return "Meno : "+this.meno+" Uloha : "+this.uloha+" Date : "+this.datum;
	}
	
}

beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

vdaka ti moc ;)

tak som to nakoniec spravil :)
ale tolko som sa s tym babral, ze som nakoniec porobil tolko veci, ze ani neviem uz ake vsetky :)

tak aspon v kratkosti...
vytvoril som si abstractnu triedu Uloha
od nej dedenim -> triedu poznamka, planovana uloha...
...
a podla mna bol este problem v tom ze som mal pri metodach a instanciach triedy uloha identifikator static...

a teraz kukal ze ani ty ho tam nemas, takze asi v tom bol problem..

----------------------------------------

a teraz trocha odveci :)
keby som tomu chcel spravit normalnu podobu (aplikaciu) a nie dosovské okno, kde by som nasiel nieco o tom... videl som jednoduchy program na kreslenie pomocou applet... chcel by som to skusit, neviem ci mi rozumies... mam totiz javu asi tak tri tyzdne a je to moj prvy OO jazyk, ale ako vidim, ty sa vyznas ;)
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

jj, ten static tam vadil (ked mas v nejakej triede static nemusis vytvarat objekt aby si tu funkciu mohol pouzivat Staci dat Nazovtriedy.nazovmetody(); a taktiez mozes pracovat iba so statickymi premennymi .. v tej metode)

Apllet pre aplkiaciu ktoru xes mat v html stranke, inac pouzi normalnu "Window" app, Odporucam java.awt ale skor, javax.swing (asi to budes musiet kombinovat)

http://java.sun.com/docs/books/tutorial/uiswing/
beluský
Darca
Darca
Používateľov profilový obrázok
Príspevky: 317
Registrovaný: 21 sep 2006, 13:46

Príspevok od používateľa beluský »

hm, hm, hm, hútam hútam hútam, ale nejak mi ten swing a awt nejde dole krkom...
nemá niekto nejaký nápad ako by som si osvojil základy čo najskôr? buď nejaký tut, alebo niečo iné... začať je najťažšie :)
xivo
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 752
Registrovaný: 27 jún 2005, 22:49
Bydlisko: Slovensko
Kontaktovať používateľa:

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

Čo presne ti nejde dole krkom ...
Okno sa ti hadam podarilo, dalej pridavat text. polia, labely, buttony atd hadam tiez ....
Ak ti to nejde tak sa zatial snaz spravit iba toto
potom skus LayoutManager a ActionListener .... (to je asi trochu zlozitejsie)

a tutorialy, vsade na webe ...

http://www.google.sk/search?hl=cs&q=Jav ... tnG=Hledat
hned prve 3 odkazy napr....
Napísať odpoveď