如何从 ArrayList 列表中创建一个新的 ArrayList 列表?
How to make a new List of ArrayList from a List of ArrayList?
又是一个初学者提出的愚蠢问题。
我有一个List<ArrayList<Boolean>> isExpenseByMonth
,内容如下:
[[true, true, true, false, false, false], [true, true, false, false, false], [true, true, true, false, false, false]]
.
我需要将布尔值“转换”为整数(true = -1,false = 1)并将它们放置到一个新的 List<ArrayList<Integer>> boolToIntByMonth
中,这样它看起来像这样(ArrayList<Integer>
s 的大小应与 ArrayList<Boolean>
s):
相同
[[-1, -1, -1, 1, 1, 1], [-1, -1, 1, 1, 1], [-1, -1, -1, 1, 1, 1]]
到目前为止,我尝试使用以下代码:
ArrayList<Integer> boolToInt = new ArrayList<>();
//List<ArrayList<Integer>> boolToIntByMonth = new ArrayList<>();
for (ArrayList<Boolean> arr : isExpenseByMonth) {
for (boolean b : arr) {
if (b) {
boolToInt.add(-1);
//boolToIntByMonth.add(boolToInt);
} else {
boolToInt.add(1);
//boolToIntByMonth.add(boolToInt);
}
}
}
但我能得到的最好的是这个(一个 ArrayList<Integer>
具有正确的值和顺序):
[-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, -1, 1, 1, 1]
如有任何帮助,我们将不胜感激。
您的代码几乎包含所有需要的构建块。缺少的关键部分是在外循环的每次迭代中创建一个新的 ArrayList<Integer>
,如下所示:
ArrayList<ArrayList<Integer>> boolToIntByMonth = new ArrayList<>();
for (ArrayList<Boolean> arr : isExpenseByMonth) {
ArrayList<Integer> boolToInt = new ArrayList<>();
boolToIntByMonth.add(boolToInt);
for (boolean b : arr) {
if (b) {
boolToInt.add(-1);
} else {
boolToInt.add(1);
}
}
}
然后您可以将 boolToIntByMonth
用作 List<ArrayList<Integer>>
:
List<ArrayList<Integer>> result = boolToIntByMonth;
为了在外部 for
循环的每一步迭代中创建一个 嵌套列表 (List<List<T>>
),您必须创建一个 new List
并在内部 for
循环中用当前月份的数据填充它。此 列表 需要添加到生成的 嵌套列表 中。
List<List<Integer>> intByMonth = new ArrayList<>();
for (List<Boolean> arr : isExpenseByMonth) {
List<Integer> nextMonth = new ArrayList<>();
for (boolean b : arr) {
nextMonth.add(b ? -1 : 1);
}
intByMonth.add(nextMonth);
}
注:
- 不要使用像
ArrayList
这样的具体实现作为类型,它会使您的代码 不灵活 并且不必要地冗长。针对接口(List
、Map
等)编写代码。这种方法称为 Dependency inversion principle.
这是一种方法。
- 流式传输列表的原始列表
- 然后流式传输每个列表并将布尔值映射到所需的值。
- 创建列表列表
List<List<Boolean>> lists = List.of(
List.of(true, true, true, false, false, false),
List.of(true, true, false, false, false),
List.of(true, true, true, false, false, false));
List<List<Integer>> result = lists.stream()
.map(list -> list.stream().map(v -> v ? -1 : 1)
.toList())
.toList();
result.forEach(System.out::println);
打印
[-1, -1, -1, 1, 1, 1]
[-1, -1, 1, 1, 1]
[-1, -1, -1, 1, 1, 1]
注意 v ? -1 or 1
表示如果 v
为真,则使用 -1
否则使用 1
.
又是一个初学者提出的愚蠢问题。
我有一个List<ArrayList<Boolean>> isExpenseByMonth
,内容如下:
[[true, true, true, false, false, false], [true, true, false, false, false], [true, true, true, false, false, false]]
.
我需要将布尔值“转换”为整数(true = -1,false = 1)并将它们放置到一个新的 List<ArrayList<Integer>> boolToIntByMonth
中,这样它看起来像这样(ArrayList<Integer>
s 的大小应与 ArrayList<Boolean>
s):
[[-1, -1, -1, 1, 1, 1], [-1, -1, 1, 1, 1], [-1, -1, -1, 1, 1, 1]]
到目前为止,我尝试使用以下代码:
ArrayList<Integer> boolToInt = new ArrayList<>();
//List<ArrayList<Integer>> boolToIntByMonth = new ArrayList<>();
for (ArrayList<Boolean> arr : isExpenseByMonth) {
for (boolean b : arr) {
if (b) {
boolToInt.add(-1);
//boolToIntByMonth.add(boolToInt);
} else {
boolToInt.add(1);
//boolToIntByMonth.add(boolToInt);
}
}
}
但我能得到的最好的是这个(一个 ArrayList<Integer>
具有正确的值和顺序):
[-1, -1, -1, 1, 1, 1, -1, -1, 1, 1, 1, -1, -1, -1, 1, 1, 1]
如有任何帮助,我们将不胜感激。
您的代码几乎包含所有需要的构建块。缺少的关键部分是在外循环的每次迭代中创建一个新的 ArrayList<Integer>
,如下所示:
ArrayList<ArrayList<Integer>> boolToIntByMonth = new ArrayList<>();
for (ArrayList<Boolean> arr : isExpenseByMonth) {
ArrayList<Integer> boolToInt = new ArrayList<>();
boolToIntByMonth.add(boolToInt);
for (boolean b : arr) {
if (b) {
boolToInt.add(-1);
} else {
boolToInt.add(1);
}
}
}
然后您可以将 boolToIntByMonth
用作 List<ArrayList<Integer>>
:
List<ArrayList<Integer>> result = boolToIntByMonth;
为了在外部 for
循环的每一步迭代中创建一个 嵌套列表 (List<List<T>>
),您必须创建一个 new List
并在内部 for
循环中用当前月份的数据填充它。此 列表 需要添加到生成的 嵌套列表 中。
List<List<Integer>> intByMonth = new ArrayList<>();
for (List<Boolean> arr : isExpenseByMonth) {
List<Integer> nextMonth = new ArrayList<>();
for (boolean b : arr) {
nextMonth.add(b ? -1 : 1);
}
intByMonth.add(nextMonth);
}
注:
- 不要使用像
ArrayList
这样的具体实现作为类型,它会使您的代码 不灵活 并且不必要地冗长。针对接口(List
、Map
等)编写代码。这种方法称为 Dependency inversion principle.
这是一种方法。
- 流式传输列表的原始列表
- 然后流式传输每个列表并将布尔值映射到所需的值。
- 创建列表列表
List<List<Boolean>> lists = List.of(
List.of(true, true, true, false, false, false),
List.of(true, true, false, false, false),
List.of(true, true, true, false, false, false));
List<List<Integer>> result = lists.stream()
.map(list -> list.stream().map(v -> v ? -1 : 1)
.toList())
.toList();
result.forEach(System.out::println);
打印
[-1, -1, -1, 1, 1, 1]
[-1, -1, 1, 1, 1]
[-1, -1, -1, 1, 1, 1]
注意 v ? -1 or 1
表示如果 v
为真,则使用 -1
否则使用 1
.