2012-06-14 2 views
5

Ich lerne Java auf eigene Faust; und daher hat der folgende Code keine andere Funktion als zum Lernen/Testen.Java Ändern von Elementen in einer Foreach

Im Wesentlichen versuche ich, die Elemente eines Integer-Arrays zu ändern (nämlich, sie zu halbieren), während in einer foreach-Schleife.

Ich sollte beachten, dass ich Elemente nicht neu ordne, hinzufüge oder lösche; einfach ihre Werte ändern.

Hier ist mein Code:

Logger.describe("Now copying half of that array in to a new array, and halving each element"); 
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];  
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2); 
for (Integer x : copyArray) x /= 2; 
Logger.output(Arrays.deepToString(copyArray)); 

jedoch das ursprüngliche Array (intArray) ist dies:

[47, 31, 71, 76, 78, 94, 66, 47, 73, 21] 

Und die Ausgabe von Copyarray ist:

[47, 31, 71, 76, 78] 

So obwohl das Array wurde halbiert, die Elemente (Integer) wurden ebenfalls nicht halbiert. Was mache ich falsch?

Danke

+1

Ich denke, das mit Autoboxing zu tun hat, also wenn Sie tun 'x/2', ist es nicht der Objektwert ändern, sondern automatisch wandelt es in ein primitives "int" um und teilt es, daher ist Ihre "Integer" -Instanz nicht betroffen. – maksimov

+0

Also ist der Operator/= nur auf "int" -Werttypen anwendbar, und nicht auf Ganzzahlen, was die Variable "x" dazu bringt, in einen int umgewandelt zu werden? – Xenoprimate

+0

Im Wesentlichen ist 'x = x/2' ein' x = neuer Integer (x.intValue()/2) '. Da Sie das Array nicht zurück zum Array hinzufügen, werden Ihre Array-Elemente nicht geändert. – maksimov

Antwort

13

Sie können das nicht in einer foreach-Schleife tun.

for (int i=0; i<copyArray.length;i++) 
    copyArray[i] /= 2; 

Andernfalls ordnen Sie es nicht zurück in das Array. Integer Objekte sind übrigens unveränderlich, also können sie sie nicht ändern (aber neue erstellen).

von Kommentar Aktualisiert: Beachten Sie jedoch, dass es ein paar Dinge geht, Autoboxing/Unboxing zum Beispiel sind, etwa:

copyArray[i] = Integer.valueOf(copyArray[i].intValue()/2); 
+0

In Anbetracht ihrer Unveränderlichkeit bedeutet das nur, dass sie das Integer-Objekt durch ein neues im Array ersetzen wird? – Xenoprimate

+0

Korrigieren. In diesem Fall gibt es auch Autoboxing/Unboxing. So simlier auch: 'copyArray [i] = Integer.valueOf (KopieArray [i] .intValue()/2);' –

+0

So ist Integer nur ein Objekt-Wrapper für int? Kein echter Alias ​​(wie in C#)? – Xenoprimate

1
for (int i = 0; i< copyArray.length; i++) { 
    copyArray[i] = new Integer(x /2); 
} 

funktionieren sollte.

1
int counter = 0; 
for(int x : copyArray) 
{ 
     x /= 2; 
     copyArray[counter++] = x; 
} 

Ihr Programm nur den Wert der Variablen x geändert, nicht die Werte innerhalb der Blöcke des Arrays copyArray

0

Ich denke, dass Sie nicht die foreach-Schleife Konstrukt verwenden können, um die Elemente des Arrays zu ändern, die Sie iterieren. Stattdessen müssen Sie ein klassisches for-Schleife verwenden, etwa so:

Logger.describe("Now copying half of that array in to a new array, and halving each element"); 
Integer[] copyArray = new Integer[DEFAULT_SAMPLE_SIZE/2];  
System.arraycopy(intArray, 0, copyArray, 0, DEFAULT_SAMPLE_SIZE/2); 
    for (int i = 0; i < copyArray.length; i++) { 
     copyArray[i] /= 2; 
    } 
Logger.output(Arrays.deepToString(copyArray)); 
+1

Im Allgemeinen können Sie die Elemente ändern (wenn sie veränderbar sind), das wahre Problem ist, dass Ganzzahlen unveränderlich sind ... – Mainguy