如何转换列表<;整数>;要在Java中使用int[]吗?
这与这个问题类似: 我是Java新手。如何在Java中将如何转换列表<;整数>;要在Java中使用int[]吗?,java,arrays,collections,Java,Arrays,Collections,这与这个问题类似: 我是Java新手。如何在Java中将列表转换为int[]?我很困惑,因为List.toArray()实际上返回了一个对象[],它可以被转换为下一个整数[]或int[] 现在我正在使用一个循环来实现这一点: int[] toIntArray(List<Integer> list){ int[] ret = new int[list.size()]; for(int i = 0;i < ret.length;i++) ret[i] = list
列表
转换为int[]
?我很困惑,因为List.toArray()
实际上返回了一个对象[]
,它可以被转换为下一个整数[]
或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;
}
int[]toIntArray(列表){
int[]ret=new int[list.size()];
对于(int i=0;i
我确信有更好的方法可以做到这一点。不幸的是,由于Java处理基元类型、装箱、数组和泛型的本质,我不相信有更好的方法。特别是:
不起作用,因为没有从List.toArray
到Integer
int
- 您不能使用
作为泛型的类型参数,因此它必须是一个int
特定的方法(或者使用反射来进行肮脏的欺骗)int
即使该类在泛型进入Java之前出现,但如果它是在今天引入的(假设您想使用基元数组),它仍然必须包含所有可怕的重载。确实没有办法“一行”完成您正在尝试的操作,因为toArray返回一个对象[],并且您无法从对象[]强制转换为int[]或Integer[]到int[]最简单的方法是利用。它有一个方便的ArrayUtils类,可以做您想做的事情。对
Integer
数组使用重载方法
List<Integer> myList;
... assign and fill the list
int[] intArray = ArrayUtils.toPrimitive(myList.toArray(new Integer[myList.size()]));
int[]toIntArray(列表){
int[]ret=new int[list.size()];
int i=0;
for(整数e:list)
ret[i++]=e;
返回ret;
}
对代码稍作修改以避免昂贵的列表索引(因为列表不一定是ArrayList,但可能是链表,随机访问很昂贵)除了Commons Lang之外,您还可以使用的方法执行此操作:
List=。。。
int[]ints=ints.toArray(列表);
这就省去了Commons Lang等效程序需要自己进行的中间数组转换。try-allow():
导入静态com.humaorie.dollar.dollar*
...
列表源=。。。;
int[]ints=$(源).convert().toIntArray();
我建议您使用java collections 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));
}
}
package-mypackage;
导入java.util.AbstractList;
导入java.util.array;
导入java.util.Collections;
导入java.util.List;
公开课考试{
//将int数组转换为列表的Helper方法
静态列表intArrayAsList(最终int[]a){
如果(a==null)
抛出新的NullPointerException();
返回新的AbstractList(){
@凌驾
公共整数get(int i){
返回一个[i];//自动装箱
}
@凌驾
公共整数集(整数i,整数val){
最终整数=a[i];
a[i]=val;//自动取消装箱
返回旧的;//自动装箱
}
@凌驾
公共整数大小(){
返回a.length;
}
};
}
公共静态void main(最终字符串[]args){
int[]a={1,2,3,4,5};
收款。反向(intArrayAsList(a));
System.out.println(Arrays.toString(a));
}
}
小心装箱/拆箱的缺点int[]ret=newint[list.size()];
int[] ret = new int[list.size()];
Iterator<Integer> iter = list.iterator();
for (int i=0; iter.hasNext(); i++) {
ret[i] = iter.next();
}
return ret;
迭代器iter=list.Iterator();
对于(int i=0;iter.hasNext();i++){
ret[i]=iter.next();
}
返回ret;
使用lambda可以做到这一点(在jdk lambda中编译):
publicstaticvoidmain(字符串ars[]){
TransformService TransformService=(输入)->{
int[]ints=新的int[inputs.size()];
int i=0;
for(整数元素:输入){
ints[i++]=元素;
}
返回整数;
};
列表输入=新数组列表(5){add(10);add(10);};
int[]results=transformService.transform(输入);
}
公共接口转换服务{
int[]转换(列表输入);
}
我会在这里再加一个。我注意到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;
}
int[]toArray(列表){
int[]ret=new int[list.size()];
int i=0;
for(Iterator it=list.Iterator();
it.hasNext();
ret[i++]=it.next();
返回ret;
}
不过,最后(这部分只是我的观点),如果你想有一个帮助函数或方法来为你做一些事情,只需设置它,然后忘记它。它可以是一行或十行;如果你再也看不到它,你就不会知道它的区别了。没有人提到Java 8中添加了streams,因此它是这样的:
int[] array = list.stream().mapToInt(i->i).toArray();
//OR
//int[] array = list.stream().mapToInt(Integer::intValue).toArray();
思维过程:
- 简单的
返回Stream#toArray
,因此它不是我们想要的。还有Object[]
Stream#toArray(IntFunction
- 所以现在我们唯一需要弄清楚的是如何将我们的
(将从流
)转换为闪亮的list.Stream()
。我们需要做的就是将IntStream
映射到整数
我们公司int
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)); } }
int[] ret = new int[list.size()]; Iterator<Integer> iter = list.iterator(); for (int i=0; iter.hasNext(); i++) { ret[i] = iter.next(); } return ret;
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); }
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; }
int[] array = list.stream().mapToInt(i->i).toArray(); //OR //int[] array = list.stream().mapToInt(Integer::intValue).toArray();
mapToInt( (Integer i) -> i.intValue() )
mapToInt((Integer i)->i)
mapToInt(i -> i)
int[] arr = list.parallelStream().mapToInt(Integer::intValue).toArray();
mapToInt(Integer::intValue)
mapToInt(i -> i.intValue())
mapToInt(i -> i)
List<Integer> list = Arrays.asList(1, 2, null, 4, 5);
int[] arr = list.parallelStream().filter(Objects::nonNull).mapToInt(Integer::intValue).toArray();
int[] arr = list.parallelStream().map(i -> i == null ? -1 : i).mapToInt(Integer::intValue).toArray();
int[] arr = list.parallelStream().mapToInt(i -> i == null ? -1 : i.intValue()).toArray();
List<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5); int[] ints = LazyIterate.adapt(integers).collectInt(i -> i).toArray(); Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);
MutableList<Integer> integers = Lists.mutable.with(1, 2, 3, 4, 5); int[] ints = integers.asLazy().collectInt(i -> i).toArray(); Assert.assertArrayEquals(new int[]{1, 2, 3, 4, 5}, ints);
public int[] toIntArray(List<Integer> intList){ return intList.stream().mapToInt(Integer::intValue).toArray(); }
int [] ints = list.stream().mapToInt(Integer::intValue).toArray();
int[] integers = new int[myList.size()]; for (int i = 0; i < integers.length; i++) { integers[i] = myList.get(i); }