我如何在Java中转换列表<整数>到int[] ?

我很困惑,因为List.toArray()实际上返回一个对象[],它既不能转换为Integer[]也不能转换为int[]。

现在我正在使用一个循环来这样做:

int[] toIntArray(List<Integer> list) {
  int[] ret = new int[list.size()];
  for(int i = 0; i < ret.length; i++)
    ret[i] = list.get(i);
  return ret;
}

有更好的办法吗?

这和上面的问题类似 如何在Java中将int[]转换为Integer[] ?


当前回答

int[] ret = new int[list.size()];       
Iterator<Integer> iter = list.iterator();
for (int i=0; iter.hasNext(); i++) {       
    ret[i] = iter.next();                
}                                        
return ret;                              

其他回答

这个简单的循环总是正确的!没有错误

  int[] integers = new int[myList.size()];
  for (int i = 0; i < integers.length; i++) {
      integers[i] = myList.get(i);
  }

我建议您使用List<?来自Java集合API的>骨架实现。在这种特殊情况下,它似乎很有帮助:

package mypackage;

import java.util.AbstractList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Test {

    // Helper method to convert int arrays into Lists
    static List<Integer> intArrayAsList(final int[] a) {
        if(a == null)
            throw new NullPointerException();
        return new AbstractList<Integer>() {

            @Override
            public Integer get(int i) {
                return a[i]; // Autoboxing
            }
            @Override
            public Integer set(int i, Integer val) {
                final int old = a[i];
                a[i] = val; // Auto-unboxing
                return old; // Autoboxing
            }
            @Override
            public int size() {
                return a.length;
            }
        };
    }

    public static void main(final String[] args) {
        int[] a = {1, 2, 3, 4, 5};
        Collections.reverse(intArrayAsList(a));
        System.out.println(Arrays.toString(a));
    }
}

小心装箱/拆箱的缺点。

我注意到for循环的一些用法,但是在循环中甚至不需要任何东西。我提到这一点只是因为最初的问题是试图找到不那么冗长的代码。

int[] toArray(List<Integer> list) {
    int[] ret = new int[ list.size() ];
    int i = 0;
    for( Iterator<Integer> it = list.iterator();
         it.hasNext();
         ret[i++] = it.next() );
    return ret;
}

如果Java像c++那样允许在for循环中多次声明,我们可以更进一步,执行for(int i = 0, Iterator it…

最后(这部分只是我的观点),如果你想要有一个帮助函数或方法来为你做一些事情,那就把它设置好,然后忘记它。它可以是一行或十条;如果你再也不看它,你就不会知道其中的区别。

不幸的是,由于Java处理原始类型、装箱、数组和泛型的本质,我不相信真的有更好的方法来做到这一点。特别是:

列表> < T。toArray不能工作,因为没有从Integer到int的转换 你不能使用int作为泛型的类型参数,所以它必须是一个特定于int的方法(或者使用反射来做讨厌的把戏)。

我相信有些库已经为所有的基本类型自动生成了这种方法的版本(也就是说,每个类型都复制了一个模板)。它很丑,但恐怕就是这样。

即使Arrays类出现在Java泛型出现之前,如果今天引入它(假设您想使用基本数组),它仍然必须包含所有可怕的重载。

使用lambda你可以这样做(在JDK lambda中编译):

public static void main(String ars[]) {
    TransformService transformService = (inputs) -> {
        int[] ints = new int[inputs.size()];
        int i = 0;
        for (Integer element : inputs) {
            ints[ i++ ] = element;
        }
        return ints;
    };

    List<Integer> inputs = new ArrayList<Integer>(5) { {add(10); add(10);} };

    int[] results = transformService.transform(inputs);
}

public interface TransformService {
    int[] transform(List<Integer> inputs);
}