2012-06-14 19 views
5

私は自分でJavaを学習しています。以下のコードは、学習/テスト以外の機能を持っていません。foreachのJava修正要素

私は基本的に整数配列の要素を変更しようとしています(つまり、それらを半減させようとしています)。

私は要素の並べ替え、追加、削除をしていないことに注意してください。単純に値を変更します。ここで

は私のコードです:

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)); 

しかし、元の配列(intArray)がこれです:

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

そしてcopyArrayの出力は次のとおりです。

[47, 31, 71, 76, 78] 

もののので、配列のサイズが半分になり、要素(整数)も値が半分になりませんでした。だから私は何が間違っているの?

+1

私は、これはあなたが 'X/2 'を行うときに、それはオブジェクトの値を変更しますが、自動的にされていない、オートボクシングとしなければならないと思いますそれをプリミティブ 'int'に変換し、それを分割するので、' Integer'インスタンスは影響を受けません。 – maksimov

+0

したがって、/ =演算子は整数型ではなく、 'x'型変数をint型に変換する 'int'型の型にのみ適用できますか? – Xenoprimate

+0

本質的に 'x = x/2'は' x =新しい整数(x.intValue()/ 2) 'です。したがって、配列に戻さないので、配列要素が変更されていません。 – maksimov

答えて

13

これはforeachループでは実行できません。

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

それ以外の場合は、配列に戻しません。 Integerオブジェクトは途中で変更できないため、変更することはできません(ただし、新しいオブジェクトを作成することはできません)。

コメントから更新

: 大体、例えばオートボクシング/アンボクシング、起こっていくつかのことがあることにかかわらず、注意してください:

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

不変性を考慮すると、Integerオブジェクトを配列の新しいオブジェクトで置き換えることを意味しますか? – Xenoprimate

+0

正しい。この場合、オートボクシング/アンボクシングも行われます。同様にsimliarもあります: 'copyArray [i] = Integer.valueOf(copyArray [i] .intValue()/ 2); ' –

+0

Integerはintのオブジェクトラッパーです。実際の別名ではありません(C#のように)? – Xenoprimate

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

が動作するはずです、ありがとうございました。

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

をあなたのプログラムはちょうど、変数xの値はありません修正配列のブロック内の値copyArray

0

反復している配列の 要素を変更するためにforeachループ構造を使用できないと思います。代わりに、あなたはそうのようなループ のための古典を使用する必要があります。

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

一般的に、要素を変更することができます(変更可能な場合)。本当の問題は、Integersが不変であることです。 – Mainguy

関連する問題