如何从 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 这样的具体实现作为类型,它会使您的代码 不灵活 并且不必要地冗长。针对接口(ListMap 等)编写代码。这种方法称为 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.