» »

Java in reference (strokovno vprašanje)

Java in reference (strokovno vprašanje)

marjan_h ::

Tole je nekaj kar je stvar Jave in me zanima če bo tole pravilno delovalo:


public class Veriga {
	static int dolzina;
	
	int element;
	Veriga naslednji;
	
	public Veriga(int element){
		this.element = element;
	}
	
	public void izpisi(){
		Veriga t = this;
		
		for(int i=0; i < dolzina; i++){
			System.out.println(element);
			t = naslednji;
		}
	}
	
	/** Tukaj je tisto kar je problematično **/
	
	public void dodaj(int e){
		if (e < element){
			Veriga clen = new Veriga(e);
			clen.naslednji = this;
		}
	}
	
}


Gre zato, če imamo verigo elementov 3 -> 8 -> 10, ko bom klical metodo izpiši bo lepo izpisal po vrsti.
Če pa dodam element not (recimo 1), ki je manjši od 3, bo pa ustvaril nov Člen verige in vezal kot njegovega naslednika element 3. (sebe)

Ali bo potem java izpisala normalno 1 -> 3 -> 8 -> 10, ali kako drugače?

Kako JVM ve, kje je začetek?

Mavrik ::

Če pa dodam element not (recimo 1), ki je manjši od 3, bo pa ustvaril nov Člen verige in vezal kot njegovega naslednika element 3. (sebe)


Ne, ne bo. Prva vrstica metode "dodaj" to preprečuje.

Kako JVM ve, kje je začetek?


JVM ne "ve" nič. Izpis se začne pri objektu, na katerem kličeš "izpiši". Saj je v metodi to zelo lepo razvidno.

Tale tvoja koda zgleda hudo napačna... kaj hočeš doseči?
The truth is rarely pure and never simple.

Zgodovina sprememb…

  • spremenil: Mavrik ()

marjan_h ::

Kode nisem pognal, vendar kje vidiš da prva vrstica metode dodaj preprečuje to.


Recimo če bi iz tega zgradil objekt, pa bi bili v tem objektu že elementi 3 -> 7 -> 10, če bi dodal manjšega od 3, bi naredil nov člen, ga prevezal na "3".

Problematično je v tem ker delaš nov clen na začetku, in ga vežeš na ostale.

Sedaj razumeš kaj želim doseči?

kr?en ::


Tale tvoja koda zgleda hudo napačna... kaj hočeš doseči?

+1

Hoces narediti svojo implementacijo povezanega seznama ali kaj?

Ti potrebujes neko referenco na zacetek seznama, ki se potem premakne na ta najmanjsi element, ki ga dodas. Tale koda je pa itak popolnoma napacno strukturirana in ti ne bo delala.

Zgodovina sprememb…

  • spremenil: kr?en ()

marjan_h ::

Ni povezan seznam, je veriga členov. In vsak člen kaže na naslednjega.

Referenca, kot boolean vrednost? In če je true, označuje kot začetek verige? Kako pa potem se izpisuje?

kr?en ::

Saj kaj pa je povezan seznam, kot pa veriga clenov, kjer vsak clen kaze na naslednjega? Ti pac hoces narediti se to, da je seznam urejen po velikosti od najmanjsega do najvecjega (vsaj to se vidi iz kode).

kr?en ::

Imo je to kar ti hoces.

P.S. Verjetno bi se dalo lepse spisat. Cba tbh.

public class Clen
{
    private int vrednost;
    private Clen naslednji;

    public Clen(int vrednost)
    {
        this.vrednost = vrednost;
    }

    public int getVrednost()
    {
        return vrednost;
    }

    public void setVrednost(int vrednost)
    {
        this.vrednost = vrednost;
    }

    public Clen getNaslednji()
    {
        return naslednji;
    }

    public void setNaslednji(Clen naslednji)
    {
        this.naslednji = naslednji;
    }
}


public class Veriga
{
    private Clen zacetek;
    private int velikost;

    public Veriga()
    {
        velikost = 0;
    }

    public void dodaj(Clen clen)
    {
        if (zacetek == null)
        {
            zacetek = clen;
            velikost++;
        }
        else if (clen.getVrednost() < zacetek.getVrednost())
        {
            clen.setNaslednji(zacetek);
            zacetek = clen;
            velikost++;
        }
        else
        {
            Clen c = zacetek;

            while (c != null)
            {
                if (c.getNaslednji() == null)
                {
                    c.setNaslednji(clen);
                    velikost++;

                    return;
                }

                if (clen.getVrednost() <= c.getNaslednji().getVrednost())
                {
                    clen.setNaslednji(c.getNaslednji());
                    c.setNaslednji(clen);
                    velikost++;

                    return;
                }

                c = c.getNaslednji();
            }
        }
    }

    public void izpisi()
    {
        Clen c = zacetek;

        while (c != null)
        {
            System.out.print(c.getVrednost() + ", ");
            c = c.getNaslednji();
        }

        System.out.println();
    }

    public int getVelikost()
    {
        return velikost;
    }
}


public class Random
{
    public static void main(String[] args)
    {
        Veriga veriga = new Veriga();

        veriga.dodaj(new Clen(3));
        veriga.dodaj(new Clen(7));
        veriga.dodaj(new Clen(1));
        veriga.dodaj(new Clen(5));
        veriga.dodaj(new Clen(11));
        veriga.dodaj(new Clen(8));

        veriga.izpisi();
        System.out.println("Velikost: " + veriga.getVelikost());
    }
}


Izpis:
1, 3, 5, 7, 8, 11,
Velikost: 6

Zgodovina sprememb…

  • spremenil: kr?en ()

dope1337 ::

Zdej, če hočeš res mal bol na profi naredit oz. uporabiti OOP dejansko čemur je namenjen - "reuse" že razrešenih problemov, bi se v tvojem primeru spogledoval z vzorcem Veriga odgovornosti - Chain of responsibility design pattern. Poglej si pa tudi ostale vzorce (na podnu strani) vkolikor omenjeni ne služi tvojemu namenu. Res je, da se boš pri implementaciji mal bolj mogu potrudit - vsaj v prvih nekaj primerih uporabe, boš pa kasneje toliko bolj vešč in hitr.

Drugače ti je dal kr?en, čist lep odgovor (na oko), sam je še vseeno veliko bolj podoben strukturnemu načinu, kot pa sledenju namembnosti OOP-ja.

Pač, če strmiš OOP-ju, si vsekakor poglej taglavne načrtovalske vzorce, dedovanje, polimorfizem, itd. in jih uporablji.
"Everybody is a genius. But if you judge a fish by its ability to climb a tree
it will live its whole life believing that it is stupid."
-Albert Einstein

Zgodovina sprememb…

  • spremenilo: dope1337 ()

marjan_h ::

kr?en, zelo dobra čisto razumljiva koda.

Sedaj razumem kako se to dela, najlepša hvala.

Sam še nimam toliko izkušenj zato je dobro da obstajajo forumi kot je ta :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

c++ rabim pomoč konstuktorji

Oddelek: Programiranje
61098 (793) Snowflake2
»

[Java] Objekt poslan k metodi v kakšnem stanju?

Oddelek: Programiranje
211549 (996) shadeX
»

[java] Osnovna vprašanja

Oddelek: Programiranje
372624 (1631) killa bee
»

C# LinkedList

Oddelek: Programiranje
91179 (1030) PoPon2
»

[Java][Naloga] Seznam študentov, majčken problem

Oddelek: Programiranje
362315 (2002) VASkO

Več podobnih tem