从数组创建列表列表
Create a list of List from an Array
如何从数组中创建列表列表,例如:
int[] arr = {3, 1, 5, 8, 2, 4}
。
这样 List 中的列表只有两个元素,例如:
[[3,1], [5,8], [2,4]]
.
到目前为止,我已经尝试了下面的代码,但它 return 只列出了一个元素,我不知道哪里出错了。
class ListList {
public static List<List<Integer>> listOfList(int[] num){
List<List<Integer>> arrList = new ArrayList<>();
for(int i = 0 ; i<num.length;i++){
List<Integer> list = new ArrayList<>();
if(list.size() !=2){
list.add(num[i]);
}
arrList.add(list);
}
return arrList;
}
}
结果:[[3], [1], [5], [8], [2], [4]]
.
您在每次迭代中创建一个空列表,然后检查它是否 size != 2
(当然是)并添加 1 个元素,最后将包含 1 个元素的列表添加到结果列表中,结果列表不是你需要什么。
将列表创建移出循环并向其添加元素。当它size == 2
时,将当前列表添加到结果列表并创建一个新列表。
class ListList {
public static List<List<Integer>> listOfList(int[] num) {
List<List<Integer>> arrList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < num.length; i++) {
if(list.size() == 2) {
arrList.add(list);
list = new ArrayList<>();
}
list.add(num[i]);
}
if(list.size() != 0) {
arrList.add(list);
}
return arrList;
}
}
如果您的输入大小可以是奇数,那么您也可以将长度为 1 的列表添加到结果列表中。如果您不想,请添加附加检查。
如果你确定列表中的值是偶数,你可以这样做。
- 创建列表列表。
- 一次拿两个,把每个放在一个单独的列表中
- 将该列表添加到列表列表
int [] arr ={3, 1, 5, 8, 2, 4};
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < arr.length; i+=2) {
List<Integer> temp = Arrays.asList(arr[i], arr[i+1]);
list.add(temp);
}
System.out.println(list);
打印
[[3, 1], [5, 8], [2, 4]]
如果列表的长度为奇数,请将分配更改为
List<Integer> temp = arr.length - i >= 2 ? Arrays.asList(arr[i], arr[i+1]) :
Arrays.asList(arr[i]);
这里是对 提出的想法的不同看法。
- 流式传输索引。
- 使用整数数学分组,映射到列表
- 和return作为列表集合的值。
int groupSize = 2;
Collection<List<Integer>> result =
IntStream.range(0, arr.length)
.mapToObj(Integer::valueOf)
.collect(Collectors.groupingBy(
i -> i / groupSize,
Collectors.mapping(i -> arr[i],
Collectors.toList())))
.values();
试试这个:
public static List<List<Integer>> listOfList(int[] num){
List<List<Integer>> arrList = new ArrayList<>();
for (int i = 0; i < num.length; i += 2) {
if (num.length > i + 1) {
arrList.add(List.of(num[i], num[i+1]));
} else {
arrList.add(List.of(num[i]));
}
}
return arrList;
}
在您的示例中,您总是在循环中创建一个新列表,因此大小始终为 0 而不是 2。
这是一个通用的:
var arr = new int[] {3, 1, 5, 8, 2, 4};
var batchSize = 2;
List<List<Integer>> lists = IntStream.range(0, arr.length)
.mapToObj(index -> Map.entry(index, arr[index]))
.collect(Collectors.groupingBy(e -> e.getKey() / batchSize))
.values().stream()
.map(entries -> entries.stream().map(Map.Entry::getValue).toList())
.toList();
System.out.println(lists);
输出:
[[3, 1], [5, 8], [2, 4]]
您基本上是在创建索引-> 值的映射,然后按 batchSize 进行分组以进行拆分
如何从数组中创建列表列表,例如:
int[] arr = {3, 1, 5, 8, 2, 4}
。
这样 List 中的列表只有两个元素,例如:
[[3,1], [5,8], [2,4]]
.
到目前为止,我已经尝试了下面的代码,但它 return 只列出了一个元素,我不知道哪里出错了。
class ListList {
public static List<List<Integer>> listOfList(int[] num){
List<List<Integer>> arrList = new ArrayList<>();
for(int i = 0 ; i<num.length;i++){
List<Integer> list = new ArrayList<>();
if(list.size() !=2){
list.add(num[i]);
}
arrList.add(list);
}
return arrList;
}
}
结果:[[3], [1], [5], [8], [2], [4]]
.
您在每次迭代中创建一个空列表,然后检查它是否 size != 2
(当然是)并添加 1 个元素,最后将包含 1 个元素的列表添加到结果列表中,结果列表不是你需要什么。
将列表创建移出循环并向其添加元素。当它size == 2
时,将当前列表添加到结果列表并创建一个新列表。
class ListList {
public static List<List<Integer>> listOfList(int[] num) {
List<List<Integer>> arrList = new ArrayList<>();
List<Integer> list = new ArrayList<>();
for(int i = 0; i < num.length; i++) {
if(list.size() == 2) {
arrList.add(list);
list = new ArrayList<>();
}
list.add(num[i]);
}
if(list.size() != 0) {
arrList.add(list);
}
return arrList;
}
}
如果您的输入大小可以是奇数,那么您也可以将长度为 1 的列表添加到结果列表中。如果您不想,请添加附加检查。
如果你确定列表中的值是偶数,你可以这样做。
- 创建列表列表。
- 一次拿两个,把每个放在一个单独的列表中
- 将该列表添加到列表列表
int [] arr ={3, 1, 5, 8, 2, 4};
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < arr.length; i+=2) {
List<Integer> temp = Arrays.asList(arr[i], arr[i+1]);
list.add(temp);
}
System.out.println(list);
打印
[[3, 1], [5, 8], [2, 4]]
如果列表的长度为奇数,请将分配更改为
List<Integer> temp = arr.length - i >= 2 ? Arrays.asList(arr[i], arr[i+1]) :
Arrays.asList(arr[i]);
这里是对
- 流式传输索引。
- 使用整数数学分组,映射到列表
- 和return作为列表集合的值。
int groupSize = 2;
Collection<List<Integer>> result =
IntStream.range(0, arr.length)
.mapToObj(Integer::valueOf)
.collect(Collectors.groupingBy(
i -> i / groupSize,
Collectors.mapping(i -> arr[i],
Collectors.toList())))
.values();
试试这个:
public static List<List<Integer>> listOfList(int[] num){
List<List<Integer>> arrList = new ArrayList<>();
for (int i = 0; i < num.length; i += 2) {
if (num.length > i + 1) {
arrList.add(List.of(num[i], num[i+1]));
} else {
arrList.add(List.of(num[i]));
}
}
return arrList;
}
在您的示例中,您总是在循环中创建一个新列表,因此大小始终为 0 而不是 2。
这是一个通用的:
var arr = new int[] {3, 1, 5, 8, 2, 4};
var batchSize = 2;
List<List<Integer>> lists = IntStream.range(0, arr.length)
.mapToObj(index -> Map.entry(index, arr[index]))
.collect(Collectors.groupingBy(e -> e.getKey() / batchSize))
.values().stream()
.map(entries -> entries.stream().map(Map.Entry::getValue).toList())
.toList();
System.out.println(lists);
输出:
[[3, 1], [5, 8], [2, 4]]
您基本上是在创建索引-> 值的映射,然后按 batchSize 进行分组以进行拆分