我正在尝试解决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;
}
答案 0 :(得分:1)
如果您想在外部ArrayList<Integer>
添加多个ArrayList
个对象,则必须为每个对象调用new ArrayList<Integer>()
。你的第二个版本效率不高。在您的第二个版本中,您清除了所有ArrayList<Integer>
,这意味着您的所有列表都是空的。
请记住:
outer.add(inner);
inner.clear();
和此:
inner.clear();
outer.add(inner);
彼此相同。这两组说明都会清空内部ArrayList
并将其添加到外部ArrayList
。