web-dev-qa-db-ja.com

Javaの配列(int [])からArrayList(ArrayList <Integer>)を作成する方法

私は質問を見ました: Create ArrayList from array

ただし、次のコードでこのソリューションを試しても、すべての場合にうまく機能しません。

_import Java.util.ArrayList;
import Java.util.Arrays;
import Java.util.Collection;
import Java.util.List;

public class ToArrayList {

    public static void main(String[] args) {
        // this works
        String[] elements = new String[] { "Ryan", "Julie", "Bob" };
        List<String> list = new ArrayList<String>(Arrays.asList(elements));
        System.out.println(list);

        // this works
        List<Integer> intList = null;
        intList = Arrays.asList(3, 5);
        System.out.println(intList);

        int[] intArray = new int[] { 0, 1 };
        // this doesn't work!
        intList = new ArrayList<Integer>(Arrays.asList(intArray));
        System.out.println(intList);
    }
}
_

ここで何が間違っていますか?コードintList = new ArrayList<Integer>(Arrays.asList(intArray));はうまくコンパイルすべきではありませんか?

20
tuxdna

の問題

intList = new ArrayList<Integer>(Arrays.asList(intArray));

プリミティブ配列がObjectから拡張されるため、int[]は単一のObjectインスタンスと見なされます。これは、Objectの配列を送信しているので、Integer[]の代わりにint[]がある場合に機能します。

Integer[] intArray = new Integer[] { 0, 1 };
//now you're sending a Object array
intList = new ArrayList<Integer>(Arrays.asList(intArray));

コメントから:int[](または別のプリミティブ型配列)をメインデータとして使用したい場合は、ラッパークラスで追加の配列を作成する必要があります。この例では:

int[] intArray = new int[] { 0, 1 };
Integer[] integerArray = new Integer[intArray.length];
int i = 0;
for(int intValue : intArray) {
    integerArray[i++] = intValue;
}
intList = new ArrayList<Integer>(Arrays.asList(integerArray));

ただし、既にforループを使用しているので、一時ラッパークラス配列を使用してもかまいません。リストにアイテムを直接追加するだけです。

int[] intArray = new int[] { 0, 1 };
intList = new ArrayList<Integer>();
for(int intValue : intArray) {
    intList.add(intValue);
}
29
Luiggi Mendoza

Java 8を使用すると、1行で実行できます。

        
 int [] intArr = {1、1、2、3、5、8、11}; 
 List <Integer> list = Arrays.stream(intArr).boxed()。collect(Collectors.toList()); 
 list.forEach(System.out :: println); 
10
max

int[]の代わりにInteger[]を使用しているため、機能しません。これを試して:

Integer[] intArray = new Integer[] { 0, 1 };
// this should work now
intList = new ArrayList<Integer>(Arrays.asList(intArray));
7
osorio

問題はオートボクシングに関するものです。 Java自動的にintIntegerに自動的に変換しますが、int[]Integer[]に変換しません。

public static <T> List<T> asList(T... a)

asListは上記のように定義されます。タイプTの可変引数が必要です。つまり、T型のオブジェクトの配列を取ることができます。あなたの場合、Javaはint[]Integer[]に変換できないため、Tではなくint[]としてタイプIntegerを取ります。したがって、List<int[]タイプのリストを取得します。手動で`Integer[]からint[]に変換する必要があります

Joshua Blochの本Effective Javaには、可変引数を使用してピットを説明する優れたアイテムがあり、これもその1つです。

7
Jatin

コレクションはオブジェクトを必要とし、プリミティブはオブジェクトから派生しません。 Integerは許可しますが、intは許可しません。

したがって、プリミティブ型であるIntegerの代わりにラッパークラスintを使用する必要があります。

例:

 Integer[] intArray = new Integer[] { 0, 1 };
 intList = new ArrayList<Integer>(Arrays.asList(intArray));
3
bNd