381

次のコードを使用して、Integer オブジェクトを含む ArrayList をプリミティブ int[] に変換しようとしていますが、コンパイル時にエラーが発生します。Javaで変換できますか?

List<Integer> x =  new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
4

19 に答える 19

256

変換することはできますが、自動的に変換するために組み込まれているものはないと思います:

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    for (int i=0; i < ret.length; i++)
    {
        ret[i] = integers.get(i).intValue();
    }
    return ret;
}

integers(いずれかまたはその中のいずれかの要素が である場合、これは NullPointerException をスローすることに注意してくださいnull。)

編集: コメントによると、リスト イテレータを使用して、次のようなリストの厄介なコストを回避することができますLinkedList

public static int[] convertIntegers(List<Integer> integers)
{
    int[] ret = new int[integers.size()];
    Iterator<Integer> iterator = integers.iterator();
    for (int i = 0; i < ret.length; i++)
    {
        ret[i] = iterator.next().intValue();
    }
    return ret;
}
于 2009-04-05T08:04:08.163 に答える
83

グーグルグアバ

Google Guavaは、 を呼び出すことでこれを行うための巧妙な方法を提供しますInts.toArray

List<Integer> list = ...;
int[] values = Ints.toArray(list);
于 2011-12-17T20:31:12.767 に答える
67

Apache Commons には ArrayUtils クラスがあり、これにはまさにこれを行うメソッド toPrimitive() があります。

import org.apache.commons.lang.ArrayUtils;
...
    List<Integer> list = new ArrayList<Integer>();
    list.add(new Integer(1));
    list.add(new Integer(2));
    int[] intArray = ArrayUtils.toPrimitive(list.toArray(new Integer[0]));

ただし、Jon が示したように、外部ライブラリを使用する代わりに自分でこれを行うのは非常に簡単です。

于 2009-04-05T09:00:32.240 に答える
42

list.get(i)リストの実装によってはパフォーマンスが低下する可能性があるため、リストの反復子を使用して反復する方が良いと思います。

private int[] buildIntArray(List<Integer> integers) {
    int[] ints = new int[integers.size()];
    int i = 0;
    for (Integer n : integers) {
        ints[i++] = n;
    }
    return ints;
}
于 2011-04-02T20:56:34.497 に答える
7

Dollar の使い方は非常に簡単です。

List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4  
int[] array = $($(list).toArray()).toIntArray();

toArray()中間呼び出しを削除するために DSL を改善する予定です

于 2010-02-01T20:14:28.760 に答える
4

Apache Commons のような完全に優れたよく使用されているライブラリが既に問題を解決している場合はいつでも、1 回限りのカスタム メソッドを推奨していることに当惑しています。解決策はばかげているとは言えませんが、長期的なメンテナンスとアクセシビリティのためにそのような動作を奨励することは無責任です.

Apache Commonsを使用するだけです

于 2010-04-30T13:22:41.257 に答える
3

Eclipse Collectionsを使用している場合は、メソッドを使用してcollectInt()、オブジェクト コンテナーからプリミティブ int コンテナーに切り替えることができます。

List<Integer> integers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
MutableIntList intList =
  ListAdapter.adapt(integers).collectInt(i -> i);
Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, intList.toArray());

に変換できる場合ArrayListFastList、アダプターを取り除くことができます。

Assert.assertArrayEquals(
  new int[]{1, 2, 3, 4, 5},
  Lists.mutable.with(1, 2, 3, 4, 5)
    .collectInt(i -> i).toArray());

注:私は Eclipse コレクションのコミッターです。

于 2013-08-29T10:32:24.340 に答える
0

このコードセグメントは私のために働いています、これを試してください:

Integer[] arr = x.toArray(new Integer[x.size()]);

言及する価値があるのは、ArrayList を次のように宣言する必要があることです。

ArrayList<Integer> list = new ArrayList<>();
于 2016-02-14T04:15:45.347 に答える
-4
   List<Integer> list = new ArrayList<Integer>();

    list.add(1);
    list.add(2);

    int[] result = null;
    StringBuffer strBuffer = new StringBuffer();
    for (Object o : list) {
        strBuffer.append(o);
        result = new int[] { Integer.parseInt(strBuffer.toString()) };
        for (Integer i : result) {
            System.out.println(i);
        }
        strBuffer.delete(0, strBuffer.length());
    }
于 2013-05-02T11:09:00.960 に答える
-7
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);

arr通常のようにアクセスしますint[]

于 2011-09-14T19:26:06.903 に答える