我有一个有N个项目的ArrayList。我想迭代ArrayList,并将ArrayList中的每个项添加到另一个ArrayList中的等效项。我试过这个,但它不起作用:
ArrayList<Integer> arrList1 = new ArrayList<Integer>();
for(String key: myMap.keyValues() {
ArrayList<Integer> dynArrList = getArrayListFromSomewhereElse();
for(Integer i : dynArrList) {
arrList1.set(i, arrList1.get(i) + dynArrList.get(i)); // sum each item
}
}
我得到索引越界异常。我试图初始化arrList1,但没有区别。我也尝试为它设置最小尺寸。
答案 0 :(得分:3)
您没有提供两个整数列表来汇总。您有[{1}}作为加数,结果为dynArrList
。但是你没有第二个加数,它应该告诉你,你还没有真正理解你的问题。您的真实任务不是您认为的,或者您没有正确地确定从哪里获取数据。
所以,假设你有两个arrList1
。尽可能编程到接口。你会如何逐项总结?写一个求和方法,并识别如果这两个列表的大小不同会发生什么。
List<Integer>
确定要添加的内容,并使用此内容。
现在,假设你有分配来计算两个整数数组列表的点积。您可能需要两件事 - 一种方法来对一个列表的元素求和,以及一种获取产品向量的方法。这可能是浪费,因为你可能不需要中间列表,而且你会浪费空间。第一项任务很简单:
public List<Integer> sum(List<Integer> left, List<Integer> right) {
if (left.size() != right.size()) {
// A runtime exception you write saying that you can't add two
// arrays of different sizes.
throw new VectorShapeException(left.size(), right.size());
}
List<Integer> vectorSum = new ArrayList<>();
for (int i = 0; i < left.size(); ++i) {
vectorSum.add(left.get(i) + right.get(i));
}
return vectorSum;
}
第二个很容易;只需复制和重命名:
public int sum(List<Integer> list) {
int total = 0;
for(Integer element: list) {
total += element;
}
return total;
}
但这里有一个乏味的问题。剪切和粘贴以及修改是我没有真正想到的标志。 2参数和和产品方法之间唯一真正的区别是运算符和名称。这导致函数式编程,现在可能太多了。
答案 1 :(得分:1)
索引越界异常来自你的循环:
for(Integer i : dynArrList) {
arrList1.set(i, arrList1.get(i) + dynArrList.get(i));
}
在这种情况下,i
不是列表的索引。无法保证您的任何列表都包含i
个元素。您可能需要一个标准的for
循环:
for(int i = 0; i < dynArrList.size(); i++) {
arrList1.set(i, arrList1.get(i) + dynArrList.get(i));
}
另外,如果您要计算任何类型的总和,您需要确保两个列表具有相同数量的元素,或者您只需要确定两个列表中较短的一个列表。
答案 2 :(得分:0)
如果arrList1上没有任何内容,你如何将元素设置为arrList1.get(i)+ dynArrList.get(i)?必须存在缺少的步骤,其中设置了arrList1值。如示例中所写,使用.add代替.set。
ArrayList<Integer> arrList1 = new ArrayList<Integer>();//has no values and no size
ArrayList<Integer> dynArrList = getArrayListFromSomewhereElse();
for(Integer i : dynArrList) {
arrList1.add(i); // sum each item
}
或使用中间ArrayList来执行合并/最终列表。
ArrayList<Integer> arrList1 = getArrayFromALocation();//may have values and size
ArrayList<Integer> dynArrList = getArrayListFromSomewhereElse();
ArrayList<Integer> mergedList1 = new ArrayList<Integer>();
for(int i =0; i< dynArrList.size(); i++) {//assuming larger
if ( i < arrList1 .size() )
mergedList1.add(new Integer(dynArrList.get(i).intValue()+(arrList1 .get(i).intValue())); // sum each item
else
mergedList1.add(new Integer(dynArrList.get(i).intValue()+0));
}
}
return mergedList1;