将 Integer 对象的 ArrayList 转换为 int 数组?

15

1
使用流: nums.stream().mapToInt(x -> x).toArray(); - Shivam Tripathi
4个回答

28
如果你需要原始类型的数组,可以使用Apache Commons ArrayUtils#toPrimitive方法从包装数组中获取原始数组:-
public static int[] toPrimitive(Integer[] array)

您可以这样使用它:-
int[] arr = ArrayUtils.toPrimitive((Integer[])integerArrayList.toArray());

或者,您可以使用 toArray 方法的 1-arg 版本,它接受一个数组并仅返回该类型的数组。这样,您就不必进行 typecasting
List<Integer> myList = new ArrayList<Integer>();
Integer[] wrapperArr = myList.toArray(new Integer[myList.size()]);

// If you want a `primitive` type array
int[] arr = ArrayUtils.toPrimitive(wrapperArr);

然而,如果您接受“包装器类型”数组(这肯定不会给您带来麻烦),那么您就不需要执行最后一步操作。
此外,您还可以创建一个“原始”数组,而无需创建中间的“包装类型”数组。为此,您需要通过循环来编写它:-
int[] arr = new int[myList.size()];

for(int i = 0; i < myList.size(); i++) {
    if (myList.get(i) != null) {
        arr[i] = myList.get(i);
    }
}

它做相同的事。循环数组并创建新的基本数组。而且为这样一个简单的功能添加另一个库是没有意义的。 - Amit Deshpande
@AmitD。至少省去了我们编写循环完成工作的麻烦。 - Rohit Jain

9
你需要迭代并复制它。
int[] intArray = new int[integerArrayList.size()];
for (int i = 0; i < intArray.length; i++) {
    intArray[i] = integerArrayList.get(i);
}

2
你不需要循环,也不需要将类型强制转换为int。只需将声明int更改为Integer。其他代码将使用自动拆箱到int元素(如果需要的话)。
请参考自动装箱
// List adapter for primitive int array
public static List<Integer> asList(final int[] a) {
    return new AbstractList<Integer>() {
        public Integer get(int i) { return a[i]; }
        // Throws NullPointerException if val == null
        public Integer set(int i, Integer val) {
            Integer oldVal = a[i];
            a[i] = val;
            return oldVal;
        }
        public int size() { return a.length; }
    };

}


1

你应该使用ArrayList的toArray(T[] arr)方法,而不是没有参数的ArrayList的toArray()方法。 请参考这里的方法签名。

可以像下面这样实现:

   ArrayList<Integer> al = new ArrayList<>();
        al.add(2);
        al.add(3);
        Integer[] arr = al.toArray(new Integer[al.size()]);
        System.out.println(arr.length);//returns 2

11
他想要创建一个原始的 int 数组,而不是另一个 Integer 类型的数组。这个说法是不正确的。 - JamesB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接