0

我有一个包含 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,但没有任何区别。我还尝试为其设置最小尺寸。

4

3 回答 3

3

您没有提供两个整数列表来相加。你有dynArrList一个加数,你有arrList1结果。但是你没有第二个加数,它应该告诉你你还没有真正理解你的问题。要么你的真正任务不是你想象的那样,要么你没有正确地确定你从哪里获取数据。

所以,假设你有两个List<Integer>s。尽可能对接口编程。您将如何逐项求和?编写一个 sum 方法,并识别如果两个列表的大小不同会发生什么。

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;
}

第二个很容易;只需复制并重命名即可:

public List<Integer> product(List<Integer> left, List<Integer> right) {
    if (left.size() != right.size()) {
        // A runtime exception you write saying that you can't multiply two
        // arrays of different sizes.
        throw new VectorShapeException(left.size(), right.size());
    }
    List<Integer> vectorProd = new ArrayList<>();
    for (int i = 0; i < left.size(); ++i) {
        vectorProd.add(left.get(i) * right.get(i));
    }
    return vectorProd;
}

public int dotProduct(List<Integer> left, List<Integer> right) {
    return sum(product(left, right));
}

但是这里有一个乏味的问题。剪切、粘贴和修改是我没有真正思考的标志。2 参数 sum 和 product 方法之间唯一真正的区别是运算符和名称。这导致了函数式编程,现在这可能太多了。

于 2013-04-24T18:27:22.793 回答
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));
}

此外,如果您要计算任何类型的总和,您需要确保两个列表具有相同数量的元素,或者您只计算两个列表中较短者的长度。

于 2013-04-24T17:53:48.097 回答
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;
于 2013-04-24T18:37:25.367 回答