public static int[] convertListToArray(List<Integer> listResult) {
int[] result = new int[listResult.size()];
int i= 0;
for (int num : listResult) {
result[i++] = num;
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
有没有一种有效的方法将List转换为数组而不显式迭代List?也许可以通过使用以下方法:
Arrays.copyOf(int [] origin , int newLength );
System.arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length);
Run Code Online (Sandbox Code Playgroud)
我知道,有记载的溶液在这里.但是,我特别感兴趣的是一种有效的转换List<Integer>
方式int[]
Don*_*aab 11
如果效率是您最关心的问题,我认为您可以使用您的解决方案,并通过在listResult上使用索引for循环来提高效率RandomAccess
.但是,这会使代码的可读性降低,并且您必须根据用例对其进行基准测试,以确定它是否更有效.
public static int[] convertListToArray(List<Integer> listResult) {
int size = listResult.size();
int[] result = new int[size];
if (listResult instanceof RandomAccess)
{
for (int i = 0; i < size; i++)
{
result[i] = listResult.get(i);
}
}
else
{
int i = 0;
for (int num : listResult) {
result[i++] = num;
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
如果您使用Java 8并且想要编写更少的代码,则可以使用Streams库.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] array = list.stream().mapToInt(i -> i).toArray();
Run Code Online (Sandbox Code Playgroud)
如果您愿意使用第三方库,则Eclipse Collections可以如下所示.
MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
int[] array = list.collectInt(i -> i).toArray();
Run Code Online (Sandbox Code Playgroud)
以下是稍微多一点的代码,但是我可以使用Eclipse Collections来提出最有效的解决方案.
MutableList<Integer> list = Lists.mutable.with(1, 2, 3, 4, 5);
int[] array = new int[list.size()];
list.forEachWithIndex((each, index) -> array[index] = each);
Run Code Online (Sandbox Code Playgroud)
如果需要使用该java.util.List
接口,可以从Eclipse Collections中使用ListIterate实用程序类.
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
int[] array = new int[list.size()];
ListIterate.forEachWithIndex(list, (each, index) -> array[index] = each);
Run Code Online (Sandbox Code Playgroud)
该ListIterate
实用程序将对RandomAccess
列表和非RandomAccess
列表使用不同的迭代代码.
最有效的方法是将Eclipse Collections或另一个支持原始集合的库更改List<Integer>
为a MutableIntList
.
注意:我是Eclipse Collections的提交者.
鉴于从需要转换Integer
到int
,我不认为你会找到的东西比你有什么更有效的,如果我假设你在谈论执行效率。
您可能会发现先转换为Integer[]
,然后循环可能更有效(如下),但您可能也没有。您必须在特定的情况下对其进行测试并查看。
这是一个例子:
int size = listResult.size();
int[] result = new int[size];
Integer[] temp = listResult.toArray(new Integer[size]);
for (int n = 0; n < size; ++n) {
result[n] = temp[n];
}
Run Code Online (Sandbox Code Playgroud)
在 Java 8 中:
int[] anArray = list.stream()
.filter(Objects::nonNull)
.mapToInt(Integer::intValue)
.toArray();
Run Code Online (Sandbox Code Playgroud)