[ miljannet @ 05.03.2014. 23:40 ] @
Radim tu neki prost primer iz knjige, evo ga kod:

Code:


public class ForEach3 {
    public static void main(String args[]){
        int zbir=0;
        int brojevi [][]=new int[3][5];
        
        //brojevima dodeljujemo vrednosti
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<5;j++)
            {
                brojevi[i][j]=(i+1)*(j+1);
            }
        }
        
        // upotreba verzije for each petlje
        // za prikazivanje i sabiranje brojeva
        
        for(int x[]:brojevi)
        {
            for(int y:x)
            {
                System.out.println("Broj je: "+y);
                zbir+=y;
            }
        }
    }
}


Sve razumem dok ne dodje ovaj deo ovde:

Code:

for(int x[]:brojevi)
        {
            for(int y:x)


Taj deo me zbuni, znam kako se radi obicna for each petlja. Ali nije mi jasno zasto sam morao da stavim ovaj deo ovde i koja je svrha te for petlje: for(int y:x) ? Moze li neko da mi objasni ? Zar ne moze jednostavno ova prva for petlje da nasledjuje vrednosti iz niza :
for(int x[]:brojevi) ?
[ Andrej013 @ 06.03.2014. 01:42 ] @
moglo bi to sto ti zelis, kada bi promenjiva brojevi bila jednodimenzionalni niz a ne dvodimenzionalni.

u prvoj petlji, u svakoj iteraciji dobijas po jedan x[] sto je niz brojeva, u ovom slucaju niz od 5 brojeva.
U drugoj petlji ti prolazis kroz taj niz, broj po broj, ciju vrednost dobija y.
U sustini, u pitanju je identicna petlja kao:
Code:

        for(int i=0;i<3;i++)
        {
            for(int j=0;j<5;j++)
            {
                brojevi[i][j]=(i+1)*(j+1);
            }
        }


Mozda bi bilo jednostavnije da ovako napises foreach petlju (promeni imena variablama tako da brojevi->matrica, x->niz, y->broj):
Code:

for(int niz[]:matrica)
{
    for(int broj:niz)
    {
        System.out.println("Broj je: "+broj);
        zbir+=y;
    }
}


Takodje, mozes da probas i da prodjes kroz petlju na nacin na koji zelis, pa vidi rezultate:
Code:

        for(int x[]:brojevi)
        {
         System.out.println("x je: "+x);
        }

dobices neke ruzne rezultate tipa
[[email protected]
[[email protected]
[[email protected]

gde je "[I" ime klase zatim sledi @ pa onda hashcode broj, u hexadecimalnom zapisu koji je vezan za objekat(u ovom slucaju niz).
[ miljannet @ 06.03.2014. 09:58 ] @
Ovako, postavio sam to pitanje na stackoverflowm evo ga link : https://stackoverflow.com/questions/22211943/dont-understand-for-each-loop-with-two-dimensional-array Tamo su mi dosta objasnjavali i dosta sam toga shvatio mada nisam sve posto mi je malo losiji engleski.
Razumem sta je dvodimenzionalni niz, to je niz nizova i to mi je skroz jasno...

Kada si mi sada napisao da je ovaj for:
Code:

 for(int i=0;i<3;i++)
        {
            for(int j=0;j<5;j++)
            {
                brojevi[i][j]=(i+1)*(j+1);
            }
        }


U sustini isti kao i ova for each petlja skontao sam:

Code:

for(int niz[]:matrica)
{
    for(int broj:niz)
    {
        System.out.println("Broj je: "+broj);
        zbir+=y;
    }


matrica[3][5] Ima tri niza od po 5 odnosno 3 niza od 5 elemenata jel tako ?
Sada obicna for each petlja na primer :
for(int[] niz:matrica) radi samo sa jednodimenzionalnim nizom ?
A kad imam dvodimenzionalni moram dodati ispod novu for petlju koja je u ovom mom primeru for(int y:niz)

for(int[] niz:matrica) // sada ovaj int [] niz dobija od matrice [0][5]
for(int y:niz) // i onda prosledjuje ovih pet elemenata iz nultog niza u y?
i onda tako kada for(int y:niz) zavrsi sa tih pet onda int[] niz dobija od matrice [1][5] koje opet salje u y ? Jesam li dobro razumeo ?
[ Rapaic Rajko @ 06.03.2014. 17:54 ] @
U praksi, fakt da je visedimenzionalni array zapravo "array of arrays of arrays..." ima neocekivane posledice. Ko kaze da dvo-dimenziona matrica mora biti "pravougaona"..?

Pa ide kod/primer sa oracle sajta:

Code:
class MultiDimArrayDemo {
    public static void main(String[] args) {
        String[][] names = {
            {"Mr. ", "Mrs. ", "Ms. "},
            {"Smith", "Jones"}
        };
        // Mr. Smith
        System.out.println(names[0][0] + names[1][0]);
        // Ms. Jones
        System.out.println(names[0][2] + names[1][1]);
    }
}


Bez foreach petlje, ovu matricu gore bi bilo jako tesko (nemoguce!) izlistati. Rekoh ja, java je fenomenalna .

Pozz

P.S. Dobro, nije nemoguce, ali uz dosta dodatnog kodiranja.


[Ovu poruku je menjao Rapaic Rajko dana 06.03.2014. u 19:41 GMT+1]
[ blekmor @ 06.03.2014. 19:31 ] @
for-each petlja sa n dimenzionalnim nizovima ustvari raspakuje takav niz po prvoj dimenziji i prodje kroz svaki (n-1) dimenzionalni niz.

konkretno posmatrajmo dvodimenzionalni niz (matrica, obrati pažnju na Rajkov odgovor)
Code:
int brojevi [][]=new int[3][5];

For-each ce raspakovati ovaj niz po prvoj dimenziji i proći će kroz niz 1 dimenzionalnih, tako raspakovanih, nizova.
Konkretno će raspakovati ovaj dvo dimenzionalni niz na 3(prva dimenzija) jednodimenzionalna(n-1, konkretno n=2, pa je 2-1=1) niza.

Code:

1.  for(int x[]:brojevi)
2.  {                                  
3.    for(int y:x)
4.    {
5.       System.out.println("Broj je: "+y);
6.    }
7.  }


1. brojevi je promenljiva koja je dvodimenzionalni niz(3 reda, 5 kolona), i taj niz će se raspakovati po prvoj dimenziji na jednodimenzionalne nizove(tri jednodimenzionalna niza). U svakom koraku promeljiva x će sadržati jednodimenzionalni niz(sa 5 elemenata), i tako se prolazi kroz sve nizove. U tijelu prve for petlje x je ustvari jedan jednodimenzionalni niz.
3. Druga for petlja će da raspakuje taj, već raspakovani, niz koji je sačuvan u promeljivoj x. Kako je to jednodimenzionalni niz, raspakovaće ga na int-ove (5 intova za svaki niz), koji se čuvaju u promeljivoj y.
5. U promenljivoj y čuvamo int-ove koji se izlistavaju u for petlji, pa ih ovako možemo ispisati

for(tip promeljiva1:promeljiva2)
, "tip" predstavlja tip kada se raspakuje n dimenzionalni niz raspakuje po prvoj dimenziji, "promeljiva1" će da sadrži to što je raspakovano, i to u svakoj sledećoj iteraciji će biti sledeći raspakovani segment. "promenljiva2" je ustvari ono što raspakujemo. 5-dimenzionalni niz se raspakuje na 4-dimenzionalni, koji se raspakuje na 3-dimenzionalni.... 1-dimenzionalni niz se raspakuje na osnovne elemente, sadržaj niza.

Nadam se da sam pomogao,
pozdrav
[ miljannet @ 06.03.2014. 22:09 ] @
@blekmor Bas to sada sto si ti rekao sam i ja napisao, samo sto si mi ti to u detalje potvrdio... Hvala vam momci sve sam shvatio, super ste ! hvala !