13

int[]配列要素をに再コピーする最良の方法は何ArrayListですか?

私はこれを速くする必要があるので、最も速い方法は何でしょうか?

4

4 に答える 4

19

ArrayListは、intなどのプリミティブに最適なストレージではありません。ArrayListは、プリミティブではなくオブジェクトを格納します。プリミティブを含むリスト用のライブラリがあります。intすべてのプリミティブをオブジェクトとして本当に保存したい場合はInteger、を使用してそれらを1つずつ変換する必要がInteger.valueOf(...)あります(したがって、不要なときに余分な整数インスタンスを作成する必要はありません)。

あなたがこれを行うことができる間:

List<Integer> list = Arrays.asList(1, 2, 3);

これを行うことはできません:

int[] i = { 1, 2, 3 };
List<Integer> list = Arrays.asList(i); // this will get you List<int[]>

配列は実際にはオブジェクトであり、intなどのプリミティブを使用する場合はvar-argsでそのように扱われます。ただし、オブジェクト配列は機能します。

List<Object> list = Arrays.asList(new Object[2]);

したがって、次のようなものがあります。

int[] array = { 1, 2, 3 };
ArrayList<Integer> list = new ArrayList<Integer>(array.length);
for (int i = 0; i < array.length; i++)
  list.add(Integer.valueOf(array[i]));
于 2012-04-22T15:54:11.520 に答える
13

「指定された配列に基づく固定サイズのリストArrays#asList(T... a)を作成するために使用します。(返されたリストへの変更は、配列に「ライトスルー」します。)」

Integer[] intArray = {1, 2, 3, 42}; // cannot use int[] here
List<Integer> intList = Arrays.asList(intArray);

または、2つのデータ構造を分離するには:

List<Integer> intList = new ArrayList<Integer>(intArray.length);

for (int i=0; i<intArray.length; i++)
{
    intList.add(intArray[i]);
}

またはさらに簡潔に:

List<Integer> intList = new ArrayList<Integer>(Arrays.asList(intArray));
于 2012-04-22T15:37:54.087 に答える
6

Guavaを使用すると、 Integer[]:を気にする必要はありません。

int[] array;
List<Integer> list = Ints.asList(array);

が必要な場合はArrayList、それだけです

List<Integer> list = Lists.newArrayList(Ints.asList(array));

(開示:私はグアバに貢献します。)

そうでなければ、あなたが持っているのがint[]、だけなら、あなたはそれを昔ながらの方法でやらなければなりません:

int[] array;
List<Integer> list = new ArrayList<>(array.length);
for (int val : array) {
  list.add(val);
}
于 2012-04-22T16:17:31.063 に答える
2

リストの使用方法に応じて、別の回答も提供します(作成が速く、実際に使用されたintのみが変換されますが、最初だけでなく常に変換されるため、同じ要素が悪い)。配列の周りに単純なラッパーリストを作成します。

final int[] array = {1, 2, 3};
List list = new AbstractList<Integer>() {

     public Integer get(int index) {
       return array[index];
     }

     public Integer set(int index, Integer value) {
       //or just throw new UnsupportedOperationException("..."); if not needed
       Integer old = array[index];
       array[index] = value;
       return old;
     }

     public int size() {
       return array.length;
     }
};

またはあなたのためにそれを作成する方法で:

static List<Integer> asList(final int[] array) {
  return new AbstractList<Integer>() { ...
             };
}
于 2012-04-22T16:46:32.200 に答える