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; } |
(请注意,如果
编辑:根据注释,您可能希望使用列表迭代器来避免使用诸如
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 数组
您还可以通过方法引用显式调用
1 |
还值得一提的是,如果您在列表中有任何
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 |
然而,正如Jon所展示的,您可以很容易地自己完成这项工作,而不是使用外部库。
谷歌番石榴
google guava通过调用
1 2 | List<Integer> list = ...; int[] values = Ints.toArray(list); |
我认为使用列表的迭代器进行迭代是一个更好的主意,因为根据列表的实现,
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,以消除中间的
如果使用Eclipse集合,则可以使用
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()); |
如果您可以将
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); } |
不算太花哨,但是,嘿,它很管用…
此代码段对我有效,请尝试以下操作:
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()); } |
访问