Przekazywanie globalne- róznica for i for each

0

Witam

Mam pytanie odnośnie poniższego kodu:

public class Przekazywanie2 
{
	public static void podwojenie(int[] x)
	{
		for(int i=0; i<x.length;i++)
		{
			x[i]=x[i]*2;
		}
	}
	public static void podwojenie2(int[] y)
	{
		for(int e: y)
		{	
			System.out.println("Wartosc przed, ale w procedurze "+e);
			e=e*2;
			System.out.println("Wartosc po, ale w procedurze "+e);
		}
	}
	public static void main(String[] args) 
	{
		int[] x={10};
		System.out.println("Wartosc przed "+x[0]);

		podwojenie(x);
		System.out.println("Wartosc po w main "+x[0]);
		System.out.print("\n\n");
		
		int[] y={10};
		System.out.println("Wartosc przed "+y[0]);
		podwojenie2(y);
		System.out.println("Wartosc po w main "+y[0]);


	}

}
 

Wynik działania tego prog:

Wartosc przed 10
Wartosc po w main 20

Wartosc przed 10
Wartosc przed, ale w procedurze 10
Wartosc po, ale w procedurze 20
Wartosc po w main 10

Dlaczego pętla for each nic nie zmienia, a zwykły for już tak?

1

Bo w pętli for each nie zmieniasz wartości elementu tablicy tak jak to robisz w normalnej pętli for, tylko zmieniasz zmienną lokalną e.

PS: Jakbyś chciał, zmieniać składniki tablicy w for each to musisz mieć zmienną pomocniczą np. int counter=0; którą będziesz inkrementował
za każdym razem i zmieniać wartość y[counter]*2, a nie e, ale jak widzisz w takim przypadku zastosowanie for each jest bezsensu.

0

Pętla for z : korzysta pod spodem z iteratora, czyli mniej więcej (w przykładzie są listy, a nie tablice, bo nie wiem jak to pod spodem jest z tablicami):

void przekazywanie3(List<Integer> lista){
    for(Integer x : lista){
        System.out.println(x);
    }
}

działa tak samo jak:

void przekazywanie4(List<Integer> lista){
    Iterator<Integer> iterator = lista.iterator();
    while(iterator.hasNext()){
        Integer x = iterator.next();
        System.out.println(x);
    }
}
0

Takie rady ode mnie. Nie używaj języka polskiego w kodzie i... brzydkie klamry :)

Kiedyś przeczytałem tutaj, że foreach to tzw. "ładny for" :D

0

W pierwszym przypadku masz

x[i]=x[i]*2;

Co oznacza przypisanie do i-tego elementu listy wartości podwojonego i-tego elementu.

W drugim przypadku masz

e=e*2;

co oznacza tylko tyle, że do aktualnego elementu pętli przypisujesz jego podwojenie. Żeby otrzymać kod działający tak jak ze zwykłym for:

int i = 0;
for(int e: y){
  y[i]  = e*2;
  i++;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1