如何将int 转换为Java中的List <Integer>?
如何将int[]
转换为Java中的List<Integer>
?
当然,我对其他答案感兴趣,而不是一个一个循环地逐个进行。 但是,如果没有其他答案,我会select最好的一个来显示这个function不是Java的一部分。
从int[]
转换为List<Integer>
没有捷径,因为Arrays.asList
不处理装箱,只会创build一个不是你想要的List<int[]>
。 你必须做一个实用的方法。
int[] ints = {1, 2, 3}; List<Integer> intList = new ArrayList<Integer>(); for (int index = 0; index < ints.length; index++) { intList.add(ints[index]); }
同样来自番石榴图书馆 … com.google.common.primitives.Ints:
List<Integer> Ints.asList(int...)
在Java 8中,你可以做到这一点
int[] ints = {1,2,3}; List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());
Arrays.asList不会像其他一些答案所期望的那样工作。
这段代码不会创build10个整数的列表。 它将打印1 ,而不是10 :
int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; List lst = Arrays.asList(arr); System.out.println(lst.size());
这将创build一个整数列表:
List<Integer> lst = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
如果你已经有了整数,那么没有快速的转换方法,你最好用循环。
另一方面,如果你的数组具有对象,而不是原语,Arrays.asList将工作:
String str[] = { "Homer", "Marge", "Bart", "Lisa", "Maggie" }; List<String> lst = Arrays.asList(str);
我会用不同的方法添加另一个答案。 没有循环,但会使用自动装箱function的匿名类:
public List<Integer> asList(final int[] is) { return new AbstractList<Integer>() { public Integer get(int i) { return is[i]; } public int size() { return is.length; } }; }
最小的一段代码是:
public List<Integer> myWork(int[] array) { return Arrays.asList(ArrayUtils.toObject(array)); }
其中ArrayUtils来自commons-lang 🙂
在具有stream的Java 8中:
int[] ints = {1, 2, 3}; List<Integer> list = new ArrayList<Integer>(); Collections.addAll(list, Arrays.stream(ints).boxed().toArray(Integer[]::new));
或与collections家
List<Integer> list = Arrays.stream(ints).boxed().collect(Collectors.toList());
这也是值得检查这个错误报告 ,这是closures的理由“不是缺陷”和以下文本:
“整个数组的自动装箱并不是特定的行为,这对于大型数组来说是非常昂贵的。”
试试这个class级:
class PrimitiveWrapper<T> extends AbstractList<T> { private final T[] data; private PrimitiveWrapper(T[] data) { this.data = data; // you can clone this array for preventing aliasing } public static <T> List<T> ofIntegers(int... data) { return new PrimitiveWrapper(toBoxedArray(Integer.class, data)); } public static <T> List<T> ofCharacters(char... data) { return new PrimitiveWrapper(toBoxedArray(Character.class, data)); } public static <T> List<T> ofDoubles(double... data) { return new PrimitiveWrapper(toBoxedArray(Double.class, data)); } // ditto for byte, float, boolean, long private static <T> T[] toBoxedArray(Class<T> boxClass, Object components) { final int length = Array.getLength(components); Object res = Array.newInstance(boxClass, length); for (int i = 0; i < length; i++) { Array.set(res, i, Array.get(components, i)); } return (T[]) res; } @Override public T get(int index) { return data[index]; } @Override public int size() { return data.length; } }
testing用例:
List<Integer> ints = PrimitiveWrapper.ofIntegers(10, 20); List<Double> doubles = PrimitiveWrapper.ofDoubles(10, 20); // etc
最好的镜头:
** * Integer modifiable fix length list of an int array or many int's. * * @author Daniel De Leon. */ public class IntegerListWrap extends AbstractList<Integer> { int[] data; public IntegerListWrap(int... data) { this.data = data; } @Override public Integer get(int index) { return data[index]; } @Override public Integer set(int index, Integer element) { int r = data[index]; data[index] = element; return r; } @Override public int size() { return data.length; } }
- 支持获取和设置。
- 没有内存数据重复。
- 循环中不浪费时间。
例子:
int[] intArray = new int[]{1, 2, 3}; List<Integer> integerListWrap = new IntegerListWrap(intArray); List<Integer> integerListWrap1 = new IntegerListWrap(1, 2, 3);
如果您打算使用第三方库,这可以在Eclipse Collections中使用 :
int[] a = {1, 2, 3}; List<Integer> integers = IntLists.mutable.with(a).collect(i -> i); Assert.assertEquals(Lists.mutable.with(1, 2, 3), integers);
注意:我是Eclipse集合的提交者。
在Java 8中:
int[] arr = {1,2,3}; IntStream.of(arr).boxed().collect(Collectors.toList());
这是将数组转换为ArrayList的通用方法
<T> ArrayList<T> toArrayList(Object o, Class<T> type){ ArrayList<T> objects = new ArrayList<>(); for (int i = 0; i < Array.getLength(o); i++) { //noinspection unchecked objects.add((T) Array.get(o, i)); } return objects; }
用法
ArrayList<Integer> list = toArrayList(new int[]{1,2,3}, Integer.class);
/* Integer[] to List<Integer> */ Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; List<Integer> arrList = new ArrayList<>(); arrList.addAll(Arrays.asList(intArr)); System.out.println(arrList); /* Integer[] to Collection<Integer> */ Integer[] intArr = { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 }; Collection<Integer> c = Arrays.asList(intArr);