次のコードを使用して、Integer オブジェクトを含む ArrayList をプリミティブ int[] に変換しようとしていますが、コンパイル時にエラーが発生します。Javaで変換できますか?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
次のコードを使用して、Integer オブジェクトを含む ArrayList をプリミティブ int[] に変換しようとしていますが、コンパイル時にエラーが発生します。Javaで変換できますか?
List<Integer> x = new ArrayList<Integer>();
int[] n = (int[])x.toArray(int[x.size()]);
変換することはできますが、自動的に変換するために組み込まれているものはないと思います:
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;
}
Google Guavaは、 を呼び出すことでこれを行うための巧妙な方法を提供しますInts.toArray
。
List<Integer> list = ...;
int[] values = Ints.toArray(list);
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 が示したように、外部ライブラリを使用する代わりに自分でこれを行うのは非常に簡単です。
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;
}
Dollar の使い方は非常に簡単です。
List<Integer> list = $(5).toList(); // the list 0, 1, 2, 3, 4
int[] array = $($(list).toArray()).toIntArray();
toArray()
中間呼び出しを削除するために DSL を改善する予定です
Apache Commons のような完全に優れたよく使用されているライブラリが既に問題を解決している場合はいつでも、1 回限りのカスタム メソッドを推奨していることに当惑しています。解決策はばかげているとは言えませんが、長期的なメンテナンスとアクセシビリティのためにそのような動作を奨励することは無責任です.
Apache Commonsを使用するだけです
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());
に変換できる場合ArrayList
はFastList
、アダプターを取り除くことができます。
Assert.assertArrayEquals(
new int[]{1, 2, 3, 4, 5},
Lists.mutable.with(1, 2, 3, 4, 5)
.collectInt(i -> i).toArray());
注:私は Eclipse コレクションのコミッターです。
このコードセグメントは私のために働いています、これを試してください:
Integer[] arr = x.toArray(new Integer[x.size()]);
言及する価値があるのは、ArrayList を次のように宣言する必要があることです。
ArrayList<Integer> list = new ArrayList<>();
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());
}
Integer[] arr = (Integer[]) x.toArray(new Integer[x.size()]);
arr
通常のようにアクセスしますint[]
。