Java入门者疑问:Pascal三角代码中addAll()为何无法替代add()?
Pascal三角Java代码中addAll()报错的原因及解决方案
先看你写的Pascal三角代码:
class Solution { public List<List<Integer>> generate(int numRows) { List<List<Integer>> l = new ArrayList<List<Integer>>(); ArrayList<Integer> row; int v; for(int i=0;i<numRows;i++) { row = new ArrayList<Integer>(); for(int j=0;j<=i;j++) { if(j==0||j==i) { row.add(1); continue; } v=l.get(i-1).get(j-1)+l.get(i-1).get(j); row.add(v); } l.addAll(row); // 这里报错 } return l; } }
报错原因
你定义的l是List<List<Integer>>,这意味着它是一个只能存放List<Integer>类型元素的列表。而addAll(Collection<? extends E>)方法的作用是:传入一个集合,把这个集合里的每一个元素逐个添加到当前列表中。
你的row是ArrayList<Integer>,它的元素是Integer类型。当你调用l.addAll(row)时,Java会尝试把row里的每个Integer元素放到l里,但l只能接受List<Integer>类型的元素,类型完全不匹配,所以编译器抛出incompatible types的错误。
而add(E e)方法是直接把单个符合类型的元素添加到列表中,row本身就是List<Integer>类型,正好符合l的元素要求,所以替换成l.add(row)就能正常运行。
能不能用addAll()实现需求?
可以,但完全没必要多此一举。如果一定要用addAll(),你需要把row包装成一个包含List<Integer>的集合,比如:
// 用Collections工具类快速生成单元素集合 l.addAll(Collections.singletonList(row));
或者手动创建临时集合:
List<List<Integer>> tempList = new ArrayList<>(); tempList.add(row); l.addAll(tempList);
但这种写法比直接用l.add(row)繁琐得多,没有任何优势,所以推荐直接使用add()方法。
内容的提问来源于stack exchange,提问作者Shruti Tiwari
相关产品推荐
相关产品推荐

