2009-04-06 32 views
5

Bu kodda, dizim neden istediğim gibi başlatılmıyor? Her bir döngü, bunu yapmak için tasarlanmamış mı yoksa doğru şekilde kullanmadım mı?Neden bu her bir döngü çalışmıyor?

int[] array = new int[5]; 

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

Diğer soru bir kopya değil mi? Bu önce oldu. – masher

cevap

14

Her bir döngü, bu durum için çalışmayacaktır. Bir diziyi başlatmak için her bir döngü için kullanamazsınız. Kodunuz:

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

aşağıdaki gibi bir şey çevirmek olacaktır: Bu nesneler dizisi olsaydı

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

, hala başarısız olur. Temel olarak, her biri için her girdiyi koleksiyona veya diziye, sırayla, sağladığınız değişkene atar, daha sonra birlikte çalışabilirsiniz. Değişken, bir dizi başvurusuna eşdeğer değil 'dır. Bu sadece bir değişken. Bu, her değeri her seferinde bir vererek, dizi veya Collection mevcut içeriği üzerinde döngüler için

için-her herhangi dizi veya Koleksiyon başlatmak için kullanılamaz. For-each 'deki değişken, numaralı dizisi ya da Collection referansı için bir proxy'dir. Derleyici, "array[index]" ile "i" ("int i") yerine geçmez.

örneğin tarihi bir dizi, var ve bu kodu denerseniz

:

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

böyle bir şey çevrilmiş olacaktır:

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

gördüğünüz gibi hangi edecek diziyi başlatılamıyor. Tüm boş değerleri içeren bir dizi ile sonuçlanacaksınız.

Not: Yukarıdaki kodu aldım, bir .class dosyasına derledim ve daha sonra jad kodunu derlemek için kullandım. Bu işlem bana Sun Java derleyicisi tarafından üretilen aşağıdaki kodu verir (1.6) Yukarıdaki koddan:

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

Aslında, bir yineleyici ile bir while döngüsüne çevirmiyor mu? –

+0

Tam çevirisi vermeye çalışmıyorum, ama neden işe yaramadığına dair bir his. – Eddie

+0

anlamlıdır. Şerefe. – masher

3

int sisteminde basit bir tür, yani aslında oldukça içine atayabilirsiniz dizideki o hücreye başvuru yerine, dizideki hücrenin değerinin bir kopyasını alıyoruz ....

Bunu açıklamaya çalışalım. X'in bir dizisi varsa, X'in veri üyeleri olan bir sınıfı varsa, her yinelemede farklı bir hücreye referans alırsınız ve onun üzerindeki işlevleri çağırarak durumunu değiştirebilir (örneğin, setValue). .

Mürekkepleriniz olduğunda, bu farklı bir öyküdür, int'iniz bir referans değildir, ilkel bir tür olduğu için yığındaki gerçek bir değerdir, bu nedenle her yinelemede diziden i'e bir değer kopyalar. . Sonra i'nizi güncellersiniz, ancak bu dizide bir etkisi yoktur.

+0

Bu tam olarak başarısızlığın nedeni değil. İlkel olmakla ilgisi yok. İçerikleri ilkel olup olmadığına bakılmaksızın * her * dizisini başlatmak için her birini kullanamazsınız. – Eddie

+0

Sınıfınız, aramak istediğiniz açık bir setValue() değerine sahip olmadıkça. – Uri

+0

Bir Nesne dizisi kullanırsanız, bu kod diziyi başlatmaz. Burada ilkel olmanın değişkeni ile ilgisi yok. – Eddie

5

i yalnızca dizinin o noktasında int'nin bir kopyası değil, referansın bir kopyasıdır. Her bir döngü için bu durumda çalışmaz.

0

yerine bunu yapın:

int[] array = new int[5]; 

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

Her seferinde bunu yazmak istemedim. Görünüşe bakılırsa ... :( – masher

+0

Programcının hayatının tekrar eden yazım yönüne hoş geldiniz – euphoria83

4

Kullanım

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

aynı etmek başlatılıyor edilecek gidiyoruz değer. Bunun dışında, Eddie her bir yapı için yaptığı çeviride oldukça fazla yer alıyor.

+0

Güzel! Şu andan itibaren bu sınıfı çok kullanacağım! – masher