int[]
与 List<Integer>
转换
刷题常见
int[]
转 List<Integer>
// int[] 转 List<Integer>
int[] arr = {1, 2, 3, 4, 5};
List<Integer> list = Arrays.stream(arr).boxed().collect(Collectors.toList());
解释:
Arrays.stream(arr) // IntStream
.boxed() // Stream<Integer>
.collect(Collectors.toList()); // List<Integer>
List<Integer>
转 int[]
// List<Integer> 转 int[]
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
int[] arr = list.stream().mapToInt(x -> x).toArray();
解释:
int[] arr = list.stream() // Stream<Integer>
.mapToInt(x -> x) // IntStream
.toArray(); // int[]
int[][]
与 List<int[]>
转换
注意到 List 接口自带两个 toArray()
方法
- 第一个返回 Object[] 类型,一般不会使用。
- 第二个需要一个泛型参数,因此只能转换对象数组。
对第二个 toArray()
来说,int[]
类型就不能之间转换,因为 int
是基本类型,不属于 T
。然而对二维数组来说就可以使用,二维数组的类型是 int[][]
,二维数组其实可以看成是一维数组,其中每个元素又是一维数组,而一维数组是对象,属于 T
。下图展示了对应关系。
因此二维int
数组可以通过 toArray()
方法转换。
List<int[]>
转 int[][]
// List<int[]> 转 int[][]
List<int[]> list = new ArrayList<>(Arrays.asList(new int[]{1, 10}, new int[]{2, 20}, new int[]{3, 30}));
int[][] arr = list.toArray(new int[0][]); // new int[0][]起到模板作用
参考:Java集合使用注意事项总结
力扣例题
406. 根据身高重建队列
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, (a, b) -> {
if(a[0] == b[0]) return a[1] - b[1];
else return -(a[0] - b[0]);
});
List<int[]> res = new ArrayList<>();
for(int[] person : people){
res.add(person[1], person);
}
return res.toArray(new int[0][]); //List<int[]> 转 int[][]
}
}
int[][]
转 List<int[]>
// int[][] 转 List<int[]>
int[][] arr = {{1, 10}, {2, 20}, {3, 30}};
List<int[]> list2 = Arrays.stream(arr).collect(Collectors.toList());
对象数组与List
转换
Java中除了基本类型就是对象。
以 String
对象为例
List
转对象数组
// List<String> 转 String[]
List<String> list = new ArrayList<>(Arrays.asList("abc", "123", "xyz"));
String[] s = list.toArray(new String[0]);
对象数组转 List
// String[] 转 List<String>
String[] s = {"abc", "123", "xyz"};
List<String> list = Arrays.stream(a).collect(Collectors.toList());
总结
stream
比较通用,toArray()
对基本类型如 int
不适用,实在忘了就老老实实写循环复制一遍。