2009-04-06 21 views
5

W tym kodzie, dlaczego moja tablica nie została zainicjalizowana tak, jak tego chcę? Czy pętla for-each nie jest zaprojektowana do tego, czy też po prostu nie używam jej poprawnie?Dlaczego ta pętla nie działa?

int[] array = new int[5]; 

    //initialise array -> Doesn't work! Array still full of 0's 
    for(int i : array) 
     i = 24; 
+0

Czy drugie pytanie nie powinno być duplikatem? To było pierwsze. – masher

Odpowiedz

14

Pętla dla każdej pętli nie będzie działać w tym przypadku. Nie można użyć pętli for-each do zainicjowania tablicy. Twój kod:

int[] array = new int[5]; 
for (int i : array) { 
    i = 24; 
} 

przełoży się coś takiego, co następuje:

int[] array = new int[5]; 
for (int j = 0; j < array.length; j++) { 
    int i = array[j]; 
    i = 24; 
} 

Gdyby to była tablicą obiektów, to nadal nie. Zasadniczo, dla każdego przypisuje się każdy wpis w kolekcji lub tablicy do zmiennej, którą podajesz, z którą możesz następnie pracować. Zmienna jest równa , a nie równoważna odwołaniu do tablicy. To tylko zmienna.

for-each nie może być używany do inicjacji żadnego tablicę lub Collection, ponieważ pętle ciągu bieżącej zawartości tablicy lub kolekcji, dając każdej wartości jeden naraz. Zmienna w jednostce jest , a nie proxy dla tablicy lub odwołania do zbioru. Kompilator nie zastąpi "i" (od "int i") za pomocą "array[index]".

Jeśli masz tablicę data, na przykład, i spróbować tego, kod:

Date[] array = new Date[5]; 
for (Date d : array) { 
    d = new Date(); 
} 

byłyby tłumaczone na coś takiego:

Date[] array = new Date[5]; 
for (int i = 0; i < array.length; i++) { 
    Date d = array[i]; 
    d = new Date(); 
} 

który jak widać będzie nie zainicjować tablicy. Otrzymasz tablicę zawierającą wszystkie wartości null.

UWAGA: Zrobiłem powyższy kod, skompilowałem go do pliku .class, a następnie użyłem jad do jego dekompilacji. Ten proces daje mi następujący kod wygenerowany przez kompilator Sun Java (1.6) z powyższego kodu:

int array[] = new int[5]; 
int ai[]; 
int k = (ai = array).length; 
for(int j = 0; j < k; j++) 
{ 
    int i = ai[j]; 
    i = 5; 
} 
+0

Właściwie, czy nie przekształca się w pętlę while z iteratorem? –

+0

Nie próbuję podać dokładnego tłumaczenia, ale wyczuć, dlaczego to nie działa. – Eddie

+0

ma sens. Twoje zdrowie. – masher

3

int to prymitywny typ w systemie, więc jesteś rzeczywiście coraz kopię wartości komórki w tablicy, zamiast odniesienia do tej komórki w tablicy, które można przypisać do ...

Pozwól mi spróbować wyjaśnić to. Jeśli masz tablicę Xs, gdzie X jest klasą, która ma elementy danych, otrzymywałbyś odwołanie do innej komórki w każdej iteracji i byłbyś w stanie zmienić jej stan przez wywołanie funkcji na nim (np. SetValue) .

Kiedy masz ints to inna historia, twój int nie jest referencją, jest rzeczywistą wartością na stosie, ponieważ jest to typ pierwotny, więc w każdej iteracji, dla kopiuje wartość z tablicy do i . Następnie zaktualizujesz swoje i, ale to nie ma wpływu na tablicę.

+0

Nie jest to jednak dokładnie przyczyna niepowodzenia. Nie ma nic wspólnego z int be prymitywnym. Nie można użyć for-each do zainicjowania * dowolnej * tablicy, bez względu na to, czy jej zawartość jest prymitywna czy nie. – Eddie

+0

Jeśli twoja klasa nie ma wyraźnej wartości setValue(), którą chcesz wywołać. – Uri

+0

Jeśli użyjesz tablicy obiektów, ten kod nie zainicjuje tablicy. Nie ma to nic wspólnego z tym, że zmienna jest tu prymitywna. – Eddie

5

i jest po prostu kopią int w tym miejscu w tablicy, a nie odniesieniem do niego. Pętla for-each nie działa w tym przypadku.

0

Czy to zamiast:

int[] array = new int[5]; 

// initialise array -> Will work now 
for(int i = 0 ; i< array.length ; i++) 
    array[i] = 24 ; 
+0

Nie chciałem tego wszystkiego zapisywać za każdym razem. Wygląda na to, że nie mogę tego uciec ... :( – masher

+0

Witajcie w powtarzającym się wpisywaniu aspektu życia programisty – euphoria83

4

Zastosowanie

java.util.Arrays.fill(array, 24)

jeśli będzie taka sama do inicjowania wartość. Poza tym, Eddie jest prawie na miejscu w jego tłumaczeniu konstrukcji dla każdego.

+0

Dobrze! Odtąd używam tej klasy! – masher

Powiązane problemy