【问题标题】:Java code snippet not working as expected: Using ArrayList<ArrayList<Integer>>Java 代码片段未按预期工作:使用 ArrayList<ArrayList<Integer>>
【发布时间】:2021-10-31 13:06:09
【问题描述】:

目前newResult 正在获取值:[[0, 0, 1], [0, 0, 1], [0, 0, 1], [0, 0, 1]]

我正在尝试获取[[0, 0], [1, 0], [0, 1], [1, 1]] 基本上,作为一个基本情况,结果,我把[[0], [1]] 然后我尝试向其中添加元素,通过将结果复制到 newResult 两次,然后在前半部分附加 0 并在后半部分附加 1。

我也在使用clone(),但无法解决问题

import java.util.ArrayList;

public class ArrayListNestedTest {
    public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        ArrayList<ArrayList<Integer>> newResult = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> zero = new ArrayList<Integer>();
        zero.add(0);
        ArrayList<Integer> one = new ArrayList<Integer>();
        one.add(0);
        result.add(zero);
        result.add(one);
        ArrayList<ArrayList<Integer>> tmp1 = new ArrayList<ArrayList<Integer>>();
        ArrayList<ArrayList<Integer>> tmp2 = new ArrayList<ArrayList<Integer>>();
        tmp1 = (ArrayList<ArrayList<Integer>>) result.clone();
        tmp2 = (ArrayList<ArrayList<Integer>>) result.clone();
        newResult.addAll(tmp1);
        newResult.addAll(tmp2);
        newResult.get(0).add(0);
        newResult.get(1).add(0);
        newResult.get(2).add(1);
        newResult.get(3).add(1);
        System.out.println("Hi");
    }
}

谢谢

【问题讨论】:

  • 在声明列表时使用抽象类型和推断类型,即List&lt;List&lt;Integer&gt;&gt; result = new ArrayList&lt;&gt;();。永远不要使用clone();使用复制构造函数List&lt;List&lt;Integer&gt;&gt; tmp1 = new ArrayList&lt;&gt;(result); 复制一个列表(注意这是一个浅拷贝)。你真的需要调试你的代码;见stackoverflow.com/questions/25385173
  • 我还没有完全分析你的代码,但你是否意识到克隆并没有进行深度克隆。因此对于嵌套列表,包含的列表将是相同的对象。你应该复制它们。
  • 我认为你正在努力解决这个问题。考虑从 0 迭代到 3,将该数字转换为二进制,然后将二进制数字转换为列表中的元素,然后收集这些列表(您可以在 1 行中完成整个任务)。
  • @Bohemian :是的,建议的替代方案似乎更有趣且更直接。会试试的。
  • 我相信,如果你的代码缩进得当,会有更多的人有兴趣分析它。您的 IDE 可以为您完成。

标签: java arraylist collections


【解决方案1】:

请更简要地描述您的任务。看起来你做了太多的动作。例如:一定要克隆吗?

感谢@Holger 的评论。我已将初始化器new ArrayList&lt;Integer&gt;(){{add(0);}} 的双花括号更改为new ArrayList&lt;&gt;(Arrays.asList(0)),因为it is strongly discouraged

简单的解决方案可能是这个:

    List<List<Integer>> newResult = new ArrayList<>();
    newResult.add(new ArrayList<>(Arrays.asList(0)));
    newResult.add(new ArrayList<>(Arrays.asList(1)));
    newResult.add(new ArrayList<>(Arrays.asList(0)));
    newResult.add(new ArrayList<>(Arrays.asList(1)));

    newResult.get(0).add(0);
    newResult.get(1).add(0);
    newResult.get(2).add(1);
    newResult.get(3).add(1);

    System.out.println(newResult);

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 2018-08-26
    • 1970-01-01
    • 2011-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    相关资源
    最近更新 更多