Java 将int[]转换为List的最佳方法<;整数>;在爪哇?
可能重复:Java 将int[]转换为List的最佳方法<;整数>;在爪哇?,java,generics,collections,Java,Generics,Collections,可能重复: 如何实现此方法: List<Integer> toList(int[] integers) { ??? //return Arrays.asList(integers); doesn't work } List toList(int[]整数){ ??? //返回array.asList(整数);不工作 } 可能在某个地方有一个内置的方法*(正如您所注意到的,数组。asList不会像它期望的那样使用整数[]而不是int[]) 我对Java库不太了解,无法
如何实现此方法:
List<Integer> toList(int[] integers) {
???
//return Arrays.asList(integers); doesn't work
}
List toList(int[]整数){
???
//返回array.asList(整数);不工作
}
可能在某个地方有一个内置的方法*(正如您所注意到的,数组。asList
不会像它期望的那样使用整数[]
而不是int[]
)
我对Java库不太了解,无法告诉您它在哪里。但写自己的很简单:
public static List<Integer> createList(int[] array) {
List<Integer> list = new ArrayList<Integer>(array.length);
for (int i = 0; i < array.length; ++i) {
list.add(array[i]);
}
return list;
}
公共静态列表createList(int[]数组){
列表列表=新的ArrayList(array.length);
对于(int i=0;i
显然,这样做的一个缺点是,你不能一般地这样做。您必须为所需的每个自动装箱原语类型编写一个单独的createList
方法
*如果没有,我真的想知道为什么没有。列出toList(int[]整数){
//将结果的大小初始化为传入数组的长度
//这样就不需要重新分配
ArrayList结果=新的ArrayList(integers.length);
for(整数cur:整数)
{
结果.add(整数.valueOf(cur));
}
返回结果;
}
列出asList(最终整数[]整数){
返回新的AbstractList(){
公共整数get(整数索引){
返回整数[索引];
}
公共整数大小(){
返回整数.length;
}
};
}
不幸的是,我认为没有一种快速的方法可以做到这一点。我相信您必须迭代数组并逐个添加。使用commons-lang3org.apache.commons.lang3.ArrayUtils.toObject()
然后使用java.util.Arrays.asList()
ArrayUtils.toObject()
将复制数组,而array.asList()
将只创建由新数组支持的列表
int[] a = {1, 2, 3};
List<Integer> aI = Arrays.asList(ArrayUtils.toObject(a));
int[]a={1,2,3};
List aI=Arrays.asList(ArrayUtils.toObject(a));
编辑:如果希望通过列表界面添加新元素(调整大小),则此操作无效。如果希望能够添加新元素,则可以使用new ArrayList()
,但这将创建一个副本。导入java.util.Arrays;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class Listing {
public static void main(String[] args) {
int[] integers = {1,2,3,4};
java.util.List<Integer> list = new ArrayList<Integer>();
for (int i=0; i< integers.length; i++)
{
list.add(integers[i]);
}
System.out.println(list);
}
}
导入java.util.ArrayList;
导入java.util.List;
公共类列表{
公共静态void main(字符串[]args){
int[]整数={1,2,3,4};
java.util.List List=new ArrayList();
for(int i=0;i
测试和工作如预期 在我编辑之前,这个问题的第二部分有什么原因吗?@DJClayworth:我想没有。我已经标记了这个问题,并解释了我在提交这个问题时遇到了一些困难。@Merlyn:不是重复的。基元数组与对象数组不同arrays@Alexander:哇。这太糟糕了:)我不能取消投票,所以我将删除我的评论。有两个大问题:(1)列表由数组支持——也就是说,如果数组元素发生变化,列表元素也会发生变化。(2) 对于较大的整数,每次都会返回不同的整数——也就是说,不能期望引用相等。这两种行为可能是问题,也可能不是问题,但它们都是半令人惊讶的行为。在我添加(3)之前,Java真的可以这样做闭包吗?@cHao:3。是的,Java可以做这样的闭包!从技术上讲,这应该被命名为 列表,至少在假设Java在这方面遵循与.NET相同的命名约定时(在实际执行转换时,在同一集合上提供不同类型的视图)。它们是匿名类。@christoff,啊,是的,那么就没有问题了:我以为
add(…)
是在AbstractList
中实现的。我的错,谢谢你的信息!为了提高效率,我可能会推荐新的ArrayList(array.length)
。应该避免Java为了添加元素而必须调整集合的大小。您可以直接使用List xValues=Arrays.asList(新整数[]{150、160、175、165})来实现这一点
@AlexanderPacha显然,它可以处理整数[]
文本,但不能处理现有的int[]
。无法将其放置在OP的方法框架中。
int[] a = {1, 2, 3};
List<Integer> aI = Arrays.asList(ArrayUtils.toObject(a));
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
public class Listing {
public static void main(String[] args) {
int[] integers = {1,2,3,4};
java.util.List<Integer> list = new ArrayList<Integer>();
for (int i=0; i< integers.length; i++)
{
list.add(integers[i]);
}
System.out.println(list);
}
}