修改Arraylist的元素并将其添加到ArrayList的另一个ArrayList

时间:2015-11-02 04:34:08

标签: java arraylist

我正在尝试解决Pascal的三角形问题。我有两个用Java编写的代码片段,第一个创建inner ArrayList几次,对我来说效果很好。

但是在代码的第二个版本中,如果我修改inner ArrayList,它还会修改outer ArrayList并且不会给我预期的结果。任何人都可以解释为什么会发生?

另外,使用inner = new ArrayList<Integer>();语句不是一个好方法,因为我在短函数中使用了几次。我怎么能摆脱它呢?任何解释和建议都会非常感激!

方式1:有效但效率不高!

  public static ArrayList<ArrayList<Integer>> generate(int a) {
        ArrayList<ArrayList<Integer>> outer = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> inner = new ArrayList<Integer>();

        if (a==0) return outer;

        inner.add(1);
        outer.add(inner);

        if(a==1) return outer;

        inner = new ArrayList<Integer>();
        inner.add(1);
        inner.add(1);
        outer.add(inner);

        inner = new ArrayList<Integer>();    
        if (a==2) return outer;


        for (int i=2; i<a; i++){
            inner = new ArrayList<Integer>();
            inner.add(1);
            for(int j=1; j<i; j++){
                inner.add(outer.get(i-1).get(j-1)+outer.get(i-1).get(j));
            }
            inner.add(1);
            outer.add(inner);          
        }

        return outer;          
  }

方式2:不起作用!

  public static ArrayList<ArrayList<Integer>> generate(int a) {
        ArrayList<ArrayList<Integer>> outer = new ArrayList<ArrayList<Integer>>();
        ArrayList<Integer> inner = new ArrayList<Integer>();

        if (a==0) return outer;

        inner.add(1);
        outer.add(inner);
        inner.clear();

        if(a==1) return outer;

        inner.add(1);
        inner.add(1);
        outer.add(inner);
        inner.clear();
        if (a==2) return outer;

        for (int i=2; i<a; i++){
            inner.add(1);
            for(int j=1; j<i; j++){
                inner.add(outer.get(i-1).get(j-1)+outer.get(i-1).get(j));
            }
            inner.add(1);
            outer.add(inner);
            inner.clear();
        }

        return outer;    
  }

1 个答案:

答案 0 :(得分:1)

如果您想在外部ArrayList<Integer>添加多个ArrayList个对象,则必须为每个对象调用new ArrayList<Integer>()。你的第二个版本效率不高。在您的第二个版本中,您清除了所有ArrayList<Integer>,这意味着您的所有列表都是空的。

请记住:

outer.add(inner);
inner.clear();

和此:

inner.clear();
outer.add(inner);

彼此相同。这两组说明都会清空内部ArrayList并将其添加到外部ArrayList