ではC/C++
私が行うために使用しました
int arr[10] = {0};
...すべての配列要素を0に初期化します。
Javaにも同様のショートカットはありますか?
ループの使用を避けたいのですが可能ですか?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
ではC/C++
私が行うために使用しました
int arr[10] = {0};
...すべての配列要素を0に初期化します。
Javaにも同様のショートカットはありますか?
ループの使用を避けたいのですが可能ですか?
int arr[] = new int[10];
for(int i = 0; i < arr.length; i++) {
arr[i] = 0;
}
回答:
整数型の配列のデフォルト値0は、言語仕様で保証されています。
各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます(§15.9、§15.10)[...] typeの
int
場合、デフォルト値はゼロ、つまりです0
。
1次元配列を別の値に初期化する場合は、java.util.Arrays.fill()を使用できます(もちろん内部的にループを使用します)。
Arrays.fill
必ずしもループを使用する必要はありません。
他の答えは正しいですが(int配列の値はデフォルトで0に初期化されます)、明示的にそうしたい場合(たとえば、値42で満たされた配列が必要な場合など)は、以下のfill()メソッドを使用できます。配列クラス:
int [] myarray = new int[num_elts];
Arrays.fill(myarray, 42);
または、ワンライナーのファンなら、次のCollections.nCopies()
ルーチンを使用できます。
Integer[] arr = Collections.nCopies(3, 42).toArray(new Integer[0]);
arrに値を与えます:
[42, 42, 42]
(そうでInteger
はありませint
んが、プリミティブ型が必要な場合は、Apache CommonsArrayUtils.toPrimitive()
ルーチンに従うことができます:
int [] primarr = ArrayUtils.toPrimitive(arr);
List<Integer>
、Integer[]
にint[]
?それは少し複雑です。
Arrays.fill
メソッドで2D配列を初期化すると問題が発生し、エラーが発生します。
Javaでは、すべての要素(プリミティブ整数タイプはbyte
short
、int
、long
)デフォルトで0に初期化されます。ループを保存できます。
アプリケーションのパフォーマンスをどのように低下させるか... 以下をお読みください。
Java言語仕様では、オブジェクトのデフォルト/初期値を次のように指定できます。
タイプbyteのデフォルト値は0です。つまり、(byte)の値は0です。
型のために短い、デフォルト値はであるゼロである、(ショート)の値は、0。
タイプintの場合、デフォルト値は0、つまり0です。
long型の場合、デフォルト値は0、つまり0Lです。
float型の場合、デフォルト値は正のゼロ、つまり0.0fです。
double型の場合、デフォルト値は正のゼロ、つまり0.0dです。
char型の場合、デフォルト値はヌル文字、つまり「\ u0000」です。
型の場合はブール値、デフォルト値はです偽。
以下のために、すべての参照型、デフォルト値があるヌル。
これらすべてを考慮することで、配列要素のゼロ値で初期化する必要はありません。デフォルトでは、すべての配列要素はint配列では0だからです。
なぜなら、配列は、単一の型の固定数の値を保持するコンテナオブジェクトだからです。配列のTypeはintなので、すべての配列要素のデフォルト値がint typeを保持しているため、自動的に0になることを考慮してください。
次に、すべての配列要素のデフォルト値がnullになるように、String型の配列を検討します。
なんでそんなことしないの……?
質問で提案するようにループを使用してnull値を割り当てることができます。
int arr[] = new int[10];
for(int i=0;i<arr.length;i++)
arr[i] = 0;
しかし、そのようにすると、マシンサイクルが無駄に失われます。多数のアレイがあるアプリケーションで使用し、各アレイに対してそれを行うと、アプリケーションのパフォーマンスにかなりのレベルまで影響します。
マシンサイクルのより多くの利用==>データ処理に多くの時間==>出力時間が大幅に増加されます。アプリケーションのデータ処理を低レベルと見なすことができるようにします(ある程度のレベルまでスロー)。
既存の配列サイズで新しい空の配列を作成し、それらを配列に割り当てることができます。これは他のものより速いかもしれません。スニペット:
package com.array.zero;
public class ArrayZero {
public static void main(String[] args) {
// Your array with data
int[] yourArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
//Creating same sized array with 0
int[] tempArray = new int[yourArray.length];
Assigning temp array to replace values by zero [0]
yourArray = tempArray;
//testing the array size and value to be zero
for (int item : yourArray) {
System.out.println(item);
}
}
}
結果:
0
0
0
0
0
0
0
0
0
はい、配列のint値はゼロに初期化されます。しかし、これは保証されていません。Oracleのドキュメントでは、これは不適切なコーディング方法であると述べています。
みんなが言ったように、int値は初期化後すでにゼロです。実際に配列値をゼロに設定する必要があり、それを最適化したい場合は、次を使用しますSystem.arraycopy
。
static private int[] zeros = new float[64];
...
int[] values = ...
if (zeros.length < values.length) zeros = new int[values.length];
System.arraycopy(zeros, 0, values, 0, values.length);
これはmemcpy
、ほとんどまたはすべてのJRE実装で内部的に使用されます。最悪の場合、複数のスレッドがzeros
同時に再割り当てされ、何も害を及ぼさないため、このようなstaticの使用は複数のスレッドでも安全です。
Arrays.fill
他の人が述べたように使用することもできます。Arrays.fill
はmemcpy
スマートJVMで使用できますが、おそらくJavaループとそれに伴う境界チェックにすぎません。
もちろん、最適化のベンチマークを行います。
c / cppにはショートカットはありませんが、すべての配列をゼロの添え字で初期化する必要があります。例:
int arr[10] = {0};
しかし、JavaにはArrays.fill()と呼ばれる魔法のツールがあり、選択した整数で配列のすべての値を埋めます。例:
import java.util.Arrays;
public class Main
{
public static void main(String[] args)
{
int ar[] = {2, 2, 1, 8, 3, 2, 2, 4, 2};
Arrays.fill(ar, 10);
System.out.println("Array completely filled" +
" with 10\n" + Arrays.toString(ar));
}
}
Javaのintのデフォルト値はゼロであるため、ゼロの場合は初期化は不要です。ゼロ以外の値の場合java.util.Arrays
、いくつかのオプションが提供されますが、最も簡単なのはfillメソッドです。
int[] arr = new int[5];
Arrays.fill(arr, -1);
System.out.println(Arrays.toString(arr)); //[-1, -1, -1, -1, -1 ]
int [] arr = new int[5];
// fill value 1 from index 0, inclusive, to index 3, exclusive
Arrays.fill(arr, 0, 3, -1 )
System.out.println(Arrays.toString(arr)); // [-1, -1, -1, 0, 0]
条件に基づいて値を入力する場合は、Arrays.setAll()を使用することもできます。
int[] array = new int[20];
Arrays.setAll(array, p -> p > 10 ? -1 : p);
int[] arr = new int[5];
Arrays.setAll(arr, i -> i);
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]
配列をクラス内のインスタンス変数として宣言します。つまり、すべてのメソッドから配列を宣言すると、JVMはデフォルト値として0を指定します。もう心配する必要はありません