Java cyklus for

Programovacie jazyky, rady, poradňa...
rado06
Novice
Novice
Príspevky: 7
Registrovaný: 03 mar 2010, 23:08

Java cyklus for

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

ahojte,
potreboval by som pomoct a vysvetlit jednoduchy cyklus v Jave. Mam kod v ktorom mam v arrayliste (je staticky v maine) instancie tied, ktore su odvodene od triedy Vagon (napr. JedalenskyVozen,SpaciVozen,PostovyVozen...),spolocne zdedene metody z Vagon su napr.getPocetMiest. V triede PostovyVozen mam instancnu premmenu cielZasielok a metodu getCielZasielok, ktora nieje zdedena. A moj problem je ze ked spustim kod tak mi v tomto cykle tuto metodu prida v vypise cielzasielok ku kazdej instancii v arrayliste (napr.k SpaciVozen) nie len k objektu typu PostovyVozen a neviem preco

Kód: Vybrať všetko

static void cielZasielok(ArrayList<Vagon>v){
		
		for (Vagon vag : v){
			if (vag instanceof PostovyVozen){
				PostovyVozen pv = (PostovyVozen)vag; //pretipovanie
				System.out.println(pv.getCielZasielok() + ".");				
			}	
		}
	}
Dufam ze som to napisal spravne :-), vyrazy ako metoda, instancia atd. este nemam v krvy, doteraz sme brali Ccko.
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: Java cyklus for

Príspevok od používateľa c-ice »

toto mas v Maine ? alebo tej triede Vozen ? lebo ak to mas vo Vozen tak to prida asi do vsetkych odvodenych tried ...

Kód: Vybrať všetko

static void cielZasielok(ArrayList<Vagon>v){
a neviem ja mam prvy semester Javu ale to slovicko static sa mi vobec nepaci teda jeho pouzivanie ked ho netreba...

a cyklus mas dobre v tom to nebude je to foreach cyklus
rado06
Novice
Novice
Príspevky: 7
Registrovaný: 03 mar 2010, 23:08

Re: Java cyklus for

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

uz som na to prisiel, prehodil som volanie funkcie na ine miesto v inej funkcii, som tam mal zdvojeny ten cyklus :(

Kód: Vybrať všetko

import java.util.ArrayList;

public class Hlavna {

	public static void main(String[] args){

		ArrayList<Vagon> vlak = new ArrayList<Vagon>();
		
		Rusen r = new Rusen();
		r.setEngine(true); 
		r.setPocetMiest(0);
		vlak.add(r);
		
		Vozen v1 = new Vozen();
		v1.setPocetMiest(80); 
		v1.setPocetKupeciek(10);
		v1.setObsadenych(32);
		vlak.add(v1);
		
		Vozen v2 = new Vozen();
		v2.setPocetMiest(80);
		v2.setPocetKupeciek(10);
		v2.setObsadenych(12);
		vlak.add(v2);
		
		Vozen v3 = new Vozen();
		v3.setPocetMiest(80);
		v3.setPocetKupeciek(10);
		v3.setObsadenych(60);
		vlak.add(v3);
		
		Vozen v4 = new Vozen();
		v4.setPocetMiest(80);
		v4.setPocetKupeciek(10);
		v4.setObsadenych(43);
		vlak.add(v4);
		
		JedalenskyVozen j1 = new JedalenskyVozen(10);
		j1.setPocetMiest(40);
		j1.setObsadenych(35);
		vlak.add(j1);
		
		SpaciVozen s1 = new SpaciVozen();
		s1.setPocetMiest(40);
		s1.setPocetPosteli(40);
		s1.setObsadenych(13);
		vlak.add(s1);

		PostovyVozen p1 = new PostovyVozen();			
		p1.setPocetMiest(0);
		p1.setCielZasielok("Praha");
		vlak.add(p1);
		
		pocitajMiesto(vlak);
		miestoVoVlaku(vlak);
		 
	
	}
	
	static void pocitajMiesto(ArrayList<Vagon>vl){
	
		for(int i = 0; i < vl.size();i++){
			vl.get(i).vypisObsadene (vl.get(i).getObsadenych());
			vl.get(i).vypisVolne((vl.get(i).getPocetMiest())-(vl.get(i).getObsadenych()));
			//cielZasielok(vl); - povodne som mal volanie funkcie tu
		}
		cielZasielok(vl);
	}
	
	static void cielZasielok(ArrayList<Vagon>v){
		
	
		for (Vagon vag : v){
			if (vag instanceof PostovyVozen){
				PostovyVozen pv = (PostovyVozen)vag;//pretipovanie
				System.out.println(pv.getCielZasielok() + ".");				
			}	
		}
	}

	static void miestoVoVlaku(ArrayList<Vagon>v){
	
		int pocet = 0;
		int pocetObsadenychMiest = 0;
	
		for(int i = 0; i< v.size();i++){
			pocet += v.get(i).getPocetMiest();
		}
		for(int j = 0; j< v.size();j++){
			pocetObsadenychMiest += v.get(j).getObsadenych();
		}
		
		System.out.println("Pocet miest vo vlaku " + pocet + " zostava volnych este "
			+ (pocet - pocetObsadenychMiest) + " miest.");
	}
}
		
inak neviem ale asi musi byt ten zoznam staticky , v tom arrayliste mam instancie tried odvodenych od abstraktnej triedy Vagon ale arraylist je iba jeden(aspon ja to tak chapem ze potom je staticky), neviem ci by nebolo lepsie riesenie presunut ten arraylist do tiedy napr. vlak, ci to je blbost?
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 cyklus for

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

kazda ta sekcia s vytvorim novej instancie sa da skratit upravou konsturktora
konstruktor bude vyzerat napr takto:

Kód: Vybrať všetko

public NejakyVozen (int pocetMiest, ...dalsie tie parametre ktore mas ako instancne v kazdej triede) {
this.pocetMiest=pocetMiest;
atd s dalsimi parametrami..}
a potom ked vytvaras instanciu tak budes mat NejakyVozen vozen = new NejakyVozen(50,dalsieparametre); a potom teda nemusis robit to setovanie...to bude zlozvyk z c :)

co sa tyka abstraktnej triedy a arraylistu, neviem pomoct, zvyknem skor robit s interfaceami, aj by som to vyskusal konkretne ale nemam cas teraz...vecer sa ti na to viem pozriet blizsie ked budem mat chvilku na eclipse (kazda hovadinka ktora ma usetri od roboty na bakalarke mi pride vhod :lol:)
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 cyklus for

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

zoznam nemusí byť statický (určite by sa to nehodilo keby si mal viac vlakov). Ako si spominal urob si objekt vlak, napr takto:

Kód: Vybrať všetko

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author pheo
 */
public class Vlak implements Iterable<Vagon>{
    List<Vagon>  vozne = new ArrayList<Vagon>();


    public boolean pridaj(Vagon e) {
        return vozne.add(e);
    }

    public Iterator<Vagon> iterator() {
        return vozne.iterator();
    }

    //...... + tie tvoje metriky miestoVoVlaku, .... (už samozrejme že nie static)
}
Všimni si ten interface iterable, keď ho implementuješ môžeš iterovať objekt ako kolekci:

Kód: Vybrať všetko

Vlak vlak = new Vlak();
for(Vagon vagon: vlak) {
        //....
}
rado06
Novice
Novice
Príspevky: 7
Registrovaný: 03 mar 2010, 23:08

Re: Java cyklus for

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

pheo dakujem:-) skusal som to. kolekcie sme este nebrali, my sa zatial motame iba okolo konstruktorov, interface-ov, dedicnosti atd. niesom si isty ktory parameter dat do tejto metody

Kód: Vybrať všetko

vlak.pocitajMiesto();
// neskor som v triede Vlak zmenil
List<Vagon> vozne = new ArrayList<Vagon>(); 
na 
ArrayList<Vagon> vozne = new ArrayList<Vagon>();
// a v maine volal metodu
vlak.pocitajMiesto(vlak.vozne);

len neviem ci toto riesenie je spravne a neminulo sa ucinku co si mi chcel vysvetlit


mirak2 skusal som to v triede napisat konstruktor pre rusen

Kód: Vybrať všetko

public Rusen(boolean engine, int pocetMiest){
		this.engine = engine;
		this.pocetMiest = pocetMiest;
	}

// dostal som chybovu hlasku o tom ze Vagon.pocetMiest (vagon je rodicovska trieda )nieje ukazany/nevidi ho
pridam sem aj kod vsetkych tried , prosim o vysvetlenie chyb,teda ak sa to bude chciet niekomu citat, viem ze su to zaciatocnicke chyby len ked mi to niekto vysvetli tak to najrychlejsie pochopim :-)

Kód: Vybrať všetko

public class Hlavna {

	public static void main(String[] args){

		Vlak vlak = new Vlak();
						
		Rusen r = new Rusen();
		r.setEngine(true);
		r.setPocetMiest(0);
		vlak.pridaj(r);
		
		Vozen v1 = new Vozen();
		v1.setPocetMiest(80); 
		v1.setPocetKupeciek(10);
		v1.setObsadenych(32);
		vlak.pridaj(v1);
		
		Vozen v2 = new Vozen();
		v2.setPocetMiest(80);
		v2.setPocetKupeciek(10);
		v2.setObsadenych(12);
		vlak.pridaj(v2);
		
		Vozen v3 = new Vozen();
		v3.setPocetMiest(80);
		v3.setPocetKupeciek(10);
		v3.setObsadenych(60);
		vlak.pridaj(v3);
		
		Vozen v4 = new Vozen();
		v4.setPocetMiest(80);
		v4.setPocetKupeciek(10);
		v4.setObsadenych(43);
		vlak.pridaj(v4);
		
		JedalenskyVozen j1 = new JedalenskyVozen(10);
		j1.setPocetMiest(40);
		j1.setObsadenych(35);
		vlak.pridaj(j1);
		
		PostovyVozen p1 = new PostovyVozen();			
		p1.setPocetMiest(0);
		p1.setCielZasielok("Praha");
		vlak.pridaj(p1);
		
		SpaciVozen s1 = new SpaciVozen();
		s1.setPocetMiest(40);
		s1.setPocetPosteli(40);
		s1.setObsadenych(13);
		vlak.pridaj(s1);

		PostovyVozen p2 = new PostovyVozen();			
		p2.setPocetMiest(0);
		p2.setCielZasielok("Blava");
		vlak.pridaj(p2);
		
		vlak.pocitajMiesto(vlak.vozne);
		vlak.miestoVoVlaku(vlak.vozne);       			
	}
}
---------------------------------------------------------------------------------------------------------------------------------
import java.util.ArrayList;
//import java.util.List;
import java.util.Iterator;


	public class Vlak implements Iterable<Vagon>{
		
		ArrayList<Vagon> vozne = new ArrayList<Vagon>();
		
		
		public boolean pridaj(Vagon e) {
	        return vozne.add(e);
	    }

		
		public Iterator<Vagon> iterator() {
			return vozne.iterator();
		}
		
		protected void pocitajMiesto(ArrayList<Vagon>vl){
			
			motor(vl);
			for(int i = 0; i < vl.size();i++){
				vl.get(i).vypisObsadene (vl.get(i).getObsadenych());
				vl.get(i).vypisVolne((vl.get(i).getPocetMiest())-(vl.get(i).getObsadenych()));
				
			}
			cielZasielok(vl);
		}
		
		private void motor(ArrayList<Vagon>v){

			for (Vagon vag : v){	
				if (vag instanceof Rusen){
					Rusen rusen = (Rusen)vag;//pretipovanie
					if(rusen.isEngine() == true){
					rusen.vypisObsadene();
					rusen.vypisVolne();
					}
				}	
			}
			
		}
		private void cielZasielok(ArrayList<Vagon>v){
			
			for (Vagon vag : v){	
				if (vag instanceof PostovyVozen){
					PostovyVozen pv = (PostovyVozen)vag;
					System.out.print("V postovom vozni sa nevezu ziadni cestujuci, ");
					System.out.println("ciel zasielok je mesto "+ pv.getCielZasielok() + ".");				
				}	
			}
		}

		protected void miestoVoVlaku(ArrayList<Vagon>v){
		
			int pocet = 0;
			int pocetObsadenychMiest = 0;
		
			for(int i = 0; i< v.size();i++){
				pocet += v.get(i).getPocetMiest();
			}
			for(int j = 0; j< v.size();j++){
				pocetObsadenychMiest += v.get(j).getObsadenych();
			}
			
			System.out.println("Pocet miest vo vlaku " + pocet + " zostava volnych este "
				+ (pocet - pocetObsadenychMiest) + " miest.");
		}
	}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
public abstract class Vagon implements Vypis{
	
	private int pocetMiest;
	private int obsadenych;
	
	public abstract void vypisVolne(int x);
	public abstract void vypisObsadene(int x);
	
	public int getPocetMiest() {
		return pocetMiest;
	}
	public void setPocetMiest(int pocetMiest) {
		this.pocetMiest = pocetMiest;
	}
	public int getObsadenych() {
		return obsadenych;
	}
	public void setObsadenych(int obsadenych) {
		this.obsadenych = obsadenych;
	}	
}
-----------------------------------------------------------------------------------------------------------------------------
public interface Vypis {
	
	void vypisVolne(int x);	
	void vypisObsadene(int x);
}
----------------------------------------------------------------------------------------------------------------------------
public class Vozen extends Vagon{
	
	private int pocetKupeciek;
	
	public Vozen(){
		
	}
	
	//konstruktor
	public Vozen(int pocetkupeciek){
		super(); //volanie konstruktora rodica
		this.pocetKupeciek = pocetkupeciek; 
	}
	
	public int getPocetKupeciek() {
		return pocetKupeciek;
	}

	public void setPocetKupeciek(int pocetKupeciek) {
		this.pocetKupeciek = pocetKupeciek;
	}
	
	public void vypisVolne(int x) {
		System.out.println(",zostava este " + x + " volnych miest.");	
	}

	public void vypisObsadene(int x) {
		System.out.print("V tomto vozni je " + x + " obsadenych miest");
	}
}
-----------------------------------------------------------------------------------------------------------------------------
public class Rusen extends Vagon{
	
	private boolean engine = true;
	
	public Rusen(){
	}

	public Rusen(boolean engine){
		
		this.engine = engine;
	}
	
	
	public boolean isEngine() {
		return engine;
	}

	public void setEngine(boolean engine) {
		this.engine = engine;
	}

	public void vypisVolne() {
		
		System.out.println(" v rusni sa vezie motor.");
		
	}
	
	public void vypisObsadene() {
		
		System.out.print("V rusni sa nevezu ziadni cestujuci.");
		
	}
	@Override
	public void vypisVolne(int x) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void vypisObsadene(int x) {
		// TODO Auto-generated method stub
		
	}
}
---------------------------------------------------------------------------------------------------------------------------------------------
public class SpaciVozen extends Vagon{
	
	private int pocetPosteli;
	
	public SpaciVozen() {
	}
	
	public SpaciVozen(int postele){
		pocetPosteli = postele;
	}

	public int getPocetPosteli() {
		return pocetPosteli;
	}

	public void setPocetPosteli(int pocetPosteli) {
		this.pocetPosteli = pocetPosteli;
	}

	@Override
	public void vypisVolne(int x) {
		// TODO Auto-generated method stub
		System.out.println("zostava este "+ x +" volnych posteli.");
		
	}

	@Override
	public void vypisObsadene(int x) {
		// TODO Auto-generated method stub
		System.out.print("Spaci vozen ma obsadenych " + x +" posteli,");
		
	}
}
---------------------------------------------------------------------------------------------------------------------------------
public class JedalenskyVozen extends Vagon {
	
	private int pocetStolov;
	
	
	public JedalenskyVozen(int pocetStolov){
		this.pocetStolov = pocetStolov;
	}

	public int getPocetStolov() {
		return pocetStolov;
	}

	public void setPocetStolov(int pocetStolov) {
		this.pocetStolov = pocetStolov;
	}

	public void vypisVolne(int x) {
		System.out.println(" zostava este "+ x + " volnych miest." );		
	}

	public void vypisObsadene(int x) {
		System.out.print("Jedalensky vozen ma obsadenych "+ x + " miest," );
	}
}
----------------------------------------------------------------------------------------------------------------------------------
public class PostovyVozen extends Vagon{
	
	private String cielZasielok;
	
	public PostovyVozen(){
		
	}
	
	public PostovyVozen(String cielZasielok){
		
		this.cielZasielok = cielZasielok;
	}

	public String getCielZasielok() {
		return cielZasielok;
	}

	public void setCielZasielok(String cielZasielok) {
		this.cielZasielok = cielZasielok;
	}
	

	@Override
	public void vypisVolne(int x) {
		// TODO Auto-generated method stub
				
	}

	@Override
	public void vypisObsadene(int x) {
		// TODO Auto-generated method stub
			
	}
}


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 cyklus for

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

Robis to presne naopak presne ako ceckar .... zaobaľuj nie publikuj protected void pocitajMiesto(ArrayList<Vagon>vl) - špatne
weroro
Flash coder
Flash coder
Používateľov profilový obrázok
Príspevky: 3206
Registrovaný: 14 feb 2009, 22:34
Bydlisko: Bratislava
Kontaktovať používateľa:

Re: Java cyklus for

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

pheo napísal:Robis to presne naopak presne ako ceckar .... zaobaľuj nie publikuj protected void pocitajMiesto(ArrayList<Vagon>vl) - špatne
To bude zrejme spôsobené tým, že c-ice je céčkar :D
rado06
Novice
Novice
Príspevky: 7
Registrovaný: 03 mar 2010, 23:08

Re: Java cyklus for

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

pheo, dik za vysvetlenie, ale nepochopil som ani slovo. ked dam private tak v maine neviem do tej metody pristupit, ako to mam riesit? cez nejaky interface, ktory pridam do vlaku a tiedy kde mam main alebo ako? od rana sa s tym lamem :D ked nevies system tak neurobis nic, iba beham po nete a motam sa dookola, v skole nam to poriadne nevysvetlili, mame skusat doma, zevraj tak sa to najlepsie naucime
c-ice
Medium Star
Medium Star
Používateľov profilový obrázok
Príspevky: 475
Registrovaný: 04 mar 2008, 15:18
Kontaktovať používateľa:

Re: Java cyklus for

Príspevok od používateľa c-ice »

weroro napísal: To bude zrejme spôsobené tým, že c-ice je céčkar :D
Hmm ale ja tu stym nic nemam :) :nono:
a Pheov post nebol reakciou namna ale na kod ktory sem pastol rado06 ...
ja osobne protected som zatial nepouzil aspon o tom neviem v zadaniach co mame tento rok pouzivam public a private + static pre jednu premennu ...
Ono to je asi skôr o tom navrhu riesenia ako k tomu clovek pristupy a nemyslím si že uvažovanie pri OOP sa velmi líši pri Jave a C++
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 cyklus for

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

rado06 napísal:pheo, dik za vysvetlenie, ale nepochopil som ani slovo. ked dam private tak v maine neviem do tej metody pristupit, ako to mam riesit? cez nejaky interface, ktory pridam do vlaku a tiedy kde mam main alebo ako? od rana sa s tym lamem :D ked nevies system tak neurobis nic, iba beham po nete a motam sa dookola, v skole nam to poriadne nevysvetlili, mame skusat doma, zevraj tak sa to najlepsie naucime
Ok, vidim u teba chut sa niečo naučiť, tak som to trošku za teba upravil. Máš to v prílohe ....

//autoeditácia príspevku (12 Dec 2010, 16:23)
c-ice napísal: Hmm ale ja tu stym nic nemam :) :nono:
a Pheov post nebol reakciou namna ale na kod ktory sem pastol rado06 ...
ja osobne protected som zatial nepouzil aspon o tom neviem v zadaniach co mame tento rok pouzivam public a private + static pre jednu premennu ...
Ono to je asi skôr o tom navrhu riesenia ako k tomu clovek pristupy a nemyslím si že uvažovanie pri OOP sa velmi líši pri Jave a C++
Ani moc nie, len si musíš zvyknúť na to že v C++ (ISO C99) nemáš interface , iba triedy ... Protected je pomôcka pri dedičnosti. Keď máš len doménový model jednoduchý skoro žiadna dedičnosť tak public private ti stačí, ak hodne dedíš, čo je tento prípad tak sa to celkom hodí ....
Prílohy
Vlak.zip
(4.15 KiB) 13 stiahnutí
Napísať odpoveď