Java 如何将int[]数组转换为列表?
我希望此代码显示Java 如何将int[]数组转换为列表?,java,arrays,collections,Java,Arrays,Collections,我希望此代码显示true: int[] array = {1, 2}; System.out.println(Arrays.asList(array).contains(1)); 我认为没有一个方法调用可以使用。像这样试试 List<Integer> list = new ArrayList<Integer>(); for (int index = 0; index < array.length; index++) { list.add(array
true
:
int[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));
我认为没有一个方法调用可以使用。像这样试试
List<Integer> list = new ArrayList<Integer>();
for (int index = 0; index < array.length; index++)
{
list.add(array[index]);
}
List List=new ArrayList();
for(int index=0;index
数组.asList(array)将生成一个int[]
的单例列表
如果将int[]
更改为Integer[]
,它将按照您的预期工作。我不知道这是否对你有帮助
Arrays.asList(ArrayUtils.toObjectArray(array))
(ArrayUtils
来自)
但是,如果您只想调用contains
,则不需要这样做。只需使用数组。binarySearch(..)(首先对数组排序)此
System.out.println(Arrays.asList(array).contains(array));
返回true
当删除泛型并转换varargs时,该方法实际上等于Arrays.ofList(Object[])
类型的方法(它是相同方法的二进制等效JDK 1.4版本)
原语数组是对象
(另请参见),但不是对象[]
,因此编译器认为您使用的是varargs版本,并围绕int数组生成一个对象数组。您可以通过添加一个额外步骤来说明发生了什么:
int[] array = {1, 2};
List<int[]> listOfArrays = Arrays.asList(array);
System.out.println(listOfArrays.contains(1));
以下是使用int值调用Arrays.asList()
的一些好方法和坏方法:
// These versions use autoboxing (which is potentially evil),
// but they are simple and readable
// ints are boxed to Integers, then wrapped in an Object[]
List<Integer> good1 = Arrays.asList(1,2,3);
// here we create an Integer[] array, and fill it with boxed ints
List<Integer> good2 = Arrays.asList(new Integer[]{1,2,3});
// These versions don't use autoboxing,
// but they are very verbose and not at all readable:
// this is awful, don't use Integer constructors
List<Integer> ugly1 = Arrays.asList(
new Integer(1),new Integer(2),new Integer(3)
);
// this is slightly better (it uses the cached pool of Integers),
// but it's still much too verbose
List<Integer> ugly2 = Arrays.asList(
Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3)
);
// And these versions produce compile errors:
// compile error, type is List<int[]>
List<Integer> bad1 = Arrays.asList(new int[]{1,2,3});
// compile error, type is List<Object>
List<Integer> bad2 = Arrays.asList(new Object[]{1,2,3});
//这些版本使用自动装箱(这可能是有害的),
//但它们简单易读
//整数被装箱为整数,然后包装在对象[]中
List good1=Arrays.asList(1,2,3);
//这里我们创建一个整数[]数组,并用装箱整数填充它
List good2=Arrays.asList(新整数[]{1,2,3});
//这些版本不使用自动装箱,
//但它们非常冗长,根本不可读:
//这很糟糕,不要使用整数构造函数
List ugly1=Arrays.asList(
新整数(1)、新整数(2)、新整数(3)
);
//这稍微好一点(它使用缓存的整数池),
//但还是太冗长了
List ugly2=Arrays.asList(
Integer.valueOf(1)、Integer.valueOf(2)、Integer.valueOf(3)
);
//这些版本会产生编译错误:
//编译错误,类型为List
List bad1=Arrays.asList(新的int[]{1,2,3});
//编译错误,类型为List
List bad2=Arrays.asList(新对象[]{1,2,3});
参考资料:
- >>>
但要用一种简单的方式实际解决您的问题: Apache Commons/Lang(请参阅)和中有一些库解决方案:
- 检查整数数组是否包含给定的整数
- 从整数数组创建整数列表
Arrays.asList(array)
在原语数组中,您会得到一个包含一个对象的列表实例:一个int值数组!正如@Bozho在他的回答中所建议的那样,您必须首先将原语数组转换为对象数组。您对
数组的理解似乎是错误的。asList(T…a)
。你不会是第一个对它的工作原理做出假设的人
试一下
System.out.println(Arrays.asList(1, 2).contains(1));
在这种情况下,自动装箱无法按您希望的方式工作。以下代码可能有点冗长,但执行将int数组转换为列表的任务:
List<Integer> list = new ArrayList<Integer>(array.length);
for (int value : array) {
list.add(value);
}
List List=newarraylist(array.length);
for(int值:数组){
列表。添加(值);
}
如果只想检查数组是否包含特定元素,只需在数组上迭代并搜索元素即可。这将需要o(n/2)。所有其他解决方案都不那么有效。任何将数组复制到列表的方法都必须在数组上迭代,因此此操作只需要n个原子赋值 以下代码显示为真:
Integer[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));
(您的版本失败,因为Int不是being对象,但Int[]是一个对象。因此,您将使用一个元素being集合调用asList(T…a),因为集合a是不可能的。)这是将数组转换为List的方法。只要记住这个列表是不可变的。尝试输出列表的内容,您将看到它包含1和2value@Shervin:你自己试试看,你会发现它不是。也许我们可以添加ArrayUtils是apache commons的一部分:对不起,我是时间旅行盲。现在是:Arrays.asList(ArrayUtils.toObject(array))
Integer[]
也是一个对象。我知道,但它也是一个object[]
,这是一个更好的匹配方式,即用甜蜜的painint[]刺痛的对象不能转换为object[](请参阅),而是转换为object。任何将数组复制到list的方法都必须在数组上迭代,而数组不是trueArrays.asList()
使用提供的数组来支持列表,因此它只会在搜索时迭代,正如您所建议的那样,这是非常古老的代码。关于这个问题的更现代的版本,请参见《罗布班的答案》
Integer[] array = {1, 2};
System.out.println(Arrays.asList(array).contains(1));