关于java:如何将包含Integers的ArrayList转换为原始int数组?

How to convert an ArrayList containing Integers to primitive int array?

我试图用下面的代码将包含整数对象的arraylist转换为primitive int[],但它抛出了编译时错误。有可能在Java中转换吗?

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


您可以转换,但我认为没有内置的自动转换功能:

1
2
3
4
5
6
7
8
9
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或其中任何元素是null的话,这将引发nullpointerException。)

编辑:根据注释,您可能希望使用列表迭代器来避免使用诸如LinkedList这样的列表带来的严重成本:

1
2
3
4
5
6
7
8
9
10
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;
}


如果您使用的是Java-8,还有另一种方法可以做到这一点。

10

它的作用是:

  • 从列表中获取Stream
  • 通过将每个元素映射到它自己(身份函数)来获得EDCOX1×12 },解开每个EDCOX1 14个对象的EDOCX1·13值保持(自Java 5自动完成)
  • 调用toArray获取int数组

您还可以通过方法引用显式调用intValue,即:

1
int[] arr = list.stream().mapToInt(Integer::intValue).toArray();

还值得一提的是,如果您在列表中有任何null引用,则可以获得NullPointerException。通过向流管道添加过滤条件,可以很容易避免这种情况:

1
2
                       //.filter(Objects::nonNull) also works
int[] arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray();

例子:

1
2
3
4
5
List<Integer> list = Arrays.asList(1, 2, 3, 4);
int[] arr = list.stream().mapToInt(i -> i).toArray(); //[1, 2, 3, 4]

list.set(1, null); //[1, null, 3, 4]
arr = list.stream().filter(i -> i != null).mapToInt(i -> i).toArray(); //[1, 3, 4]


ApacheCommons有一个arrayUtils类,它有一个方法toprimitive()来实现这一点。

1
2
3
4
5
6
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所展示的,您可以很容易地自己完成这项工作,而不是使用外部库。


谷歌番石榴

google guava通过调用Ints.toArray提供了一种很好的方法。

1
2
List<Integer> list = ...;
int[] values = Ints.toArray(list);


我认为使用列表的迭代器进行迭代是一个更好的主意,因为根据列表的实现,list.get(i)的性能可能较差:

1
2
3
4
5
6
7
8
private int[] buildIntArray(List<Integer> integers) {
    int[] ints = new int[integers.size()];
    int i = 0;
    for (Integer n : integers) {
        ints[i++] = n;
    }
    return ints;
}


使用美元应该很简单:

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

我计划改进DSL,以消除中间的toArray()呼叫


如果使用Eclipse集合,则可以使用collectInt()方法从对象容器切换到原始int容器。

1
2
3
4
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,就可以去掉适配器。

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

注意:我是Eclipse集合的提交者。


让我困惑的是,我们鼓励一次性定制方法,只要像ApacheCommons这样一个非常好、使用良好的库已经解决了这个问题。尽管解决方案虽然不荒谬,但由于长期维护和可访问性,鼓励这样的行为是不负责任的。

去阿帕奇公地吧


您可以简单地将其复制到一个数组中:

1
2
3
4
int[] arr = new int[list.size()];
for(int i = 0; i < list.size(); i++) {
    arr[i] = list.get(i);
}

不算太花哨,但是,嘿,它很管用…


此代码段对我有效,请尝试以下操作:

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

arraylist的声明方式如下:

1
ArrayList<Integer> list = new rrayList<>();


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   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());
    }


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

访问arr,如正常int[]