5

これを行うよりもオブジェクトの配列を初期化する便利な方法はありますか?

SomeClass[] someArray = new SomeClass[100];
//...
for (int i = 0; i < someArray.length; i++) { 
  someArray[i] = new SomeClass();
}
// ...
4

5 に答える 5

8

使用するArrays.fill()

String[] stringArray = new String[100];
Arrays.fill(stringArray, "");

あなたと同じように配列を反復処理するため、高速ではありませんが、より便利です。

Arrays.fill() コード

public static void fill(Object[] a, int fromIndex, int toIndex, Object val) {
    rangeCheck(a.length, fromIndex, toIndex);
    for (int i=fromIndex; i<toIndex; i++)
        a[i] = val;
}
于 2013-04-19T17:56:02.153 に答える
2

Javaの不変性のためString、あなたの質問は少し奇妙です。主な推力は、あなたがこれを探していることを示唆しています:

String[] arr = new String[100];
Arrays.fill(arr, new String());//Array utility

Stringただし、これらの配列項目の 1 つを別の文字列に置き換えるたびに、新しいオブジェクトを効果的に作成する必要があるため、実際には何も得られません。これは、 を作成するnew String()操作が冗長であり、したがって効率が悪いことを意味します。

これは疑問を投げかけます:なぜあなたはこれをしているのですか?有効なオブジェクトが返されるようにするためですか? または、配列内のオブジェクトが実際にはString? 後者の場合は、ジェネリックを使用します。

List<String> arr = new ArrayList<String>();

これにより、同じ問題が解決され、オブジェクト指向のメリットが得られます。一般に、できる限りプリミティブ配列を使用しないことをお勧めします。オブジェクトベースの配列ははるかに使いやすく、コードがよりクリーンになり、多くの場合より効率的なプログラムになります。

可変型を使用していて、事前入力のポイントが、オブジェクトが配列から取得されたときにオブジェクトが存在することを確認することである場合、これを処理する最善の方法は、2 つの理由から、受信側で実際に例外を使用することです。 1つ目は、実際に必要になる前にメモリを割り当てないことでメモリを節約すること(およびそれに伴うすべての節約)であり、2つ目は、配列の要素が に設定されるのをほとんど止められないnullため、確認する必要がありますとりあえず:

try {
  SomeObject myObj = arr.get(idx);
  myObj.doSomethingFun();//will fail if this is null!
} catch (NullPointerException e) {
  //do something intelligent like return a fail case.
}

例外が実際のエラーをキャッチするとオーバーヘッドが発生しますが、その時点まではオーバーヘッドがないことに注意してください。このため、制御の流れにそれらを使用したくはありませんが、意味をなさないエッジケースをキャッチするために (おそらくよりも多く) 使用したいと考えています。

于 2013-04-19T17:59:12.050 に答える
2

つまり、個別のオブジェクトの配列を作成したいと言いました。次に、渡すデフォルトのコンストラクターまたはファクトリが必要です。最初のケースのコードを示します-空のコンストラクターを次のように呼び出すことができる場合Class<...>.newInstance():

import java.lang.reflect.Array;
// ... in a class:
@SuppressWarnings("unchecked")
public static <T> T[] initializedArray(int size, Class<T> classHint) throws java.lang.Exception {
   T[] result = (T[]) Array.newInstance(classHint, size);
   for (int i = 0; i < size; ++i) {
      result[i] = classHint.newInstance();
   }
   return result;
}

ここでの使用例: http://ideone.com/pbTFq9

于 2013-04-19T19:31:38.680 に答える