Java 将一个ArrayList的每个元素添加到另一个ArrayList的每个元素

Java 将一个ArrayList的每个元素添加到另一个ArrayList的每个元素,java,arraylist,Java,Arraylist,我有一个ArrayList,它有N个项。我希望遍历ArrayList,并将ArrayList中的每个项添加到另一个ArrayList中的等效项。我试过这个,但不起作用: ArrayList<Integer> arrList1 = new ArrayList<Integer>(); for(String key: myMap.keyValues() { ArrayList<Integer> dynArrList = getArrayListFromSo

我有一个ArrayList,它有N个项。我希望遍历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
    }
}
ArrayList arrList1=new ArrayList();
for(字符串键:myMap.keyValues(){
ArrayList dynArrList=GetArrayList fromSomewhere();
用于(整数i:dynArrList){
arrList1.set(i,arrList1.get(i)+dynArrList.get(i));//对每个项求和
}
}

我获得索引越界异常。我尝试初始化arrList1,但没有任何区别。我还尝试为其设置最小大小。

索引越界异常来自您的循环:

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));
}
for(int i=0;i

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

索引越界异常来自循环:

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));
}
for(int i=0;i

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

您没有提供两个整数列表来求和。您有
dynArrList
作为加数,还有
arrList1
的结果。但是你没有第二个加数,这应该告诉你你还没有真正理解你的问题。或者你真正的任务不是你认为的,或者你没有正确地确定你从哪里获得数据

因此,假设您有两个
List
s。尽可能在界面上编程。您将如何逐项求和?编写求和方法,并识别如果两个列表的大小不同会发生什么

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;
}
公共列表总和(左列表、右列表){
if(left.size()!=right.size()){
//您编写的运行时异常表示无法添加两个
//不同大小的数组。
抛出新的VectorShapeException(left.size(),right.size());
}
List vectorSum=new ArrayList();
对于(int i=0;i
确定要添加的内容,并使用此选项

现在,假设您有计算两个整数数组列表的点积的任务。您可能需要两件事——一个是求一个列表元素之和的方法,另一个是求乘积向量的方法。这可能是浪费,因为您可能不需要中间列表,而且会浪费空间。第一个任务很简单:

public int sum(List<Integer> list) {
    int total = 0;
    for(Integer element: list) {
        total += element;
    }
   return total;
}
公共整数和(列表){
int-total=0;
for(整型元素:列表){
总+=元素;
}
返回总数;
}
第二个很简单;只需复制和重命名内容:

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));
}
公共列表产品(左列表、右列表){
if(left.size()!=right.size()){
//您编写的运行时异常表示不能将两个相乘
//不同大小的数组。
抛出新的VectorShapeException(left.size(),right.size());
}
List vectorProd=new ArrayList();
对于(int i=0;i

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

您没有向su提供两个整数列表m在一起。你有
dynArrList
作为加数,你有
arrList1
作为结果。但是你没有第二个加数,这应该告诉你你还没有真正理解你的问题。或者你真正的任务不是你认为的,或者你没有正确地确定你从哪里获得数据

因此,假设您有两个
List
s。尽可能在界面上编程。您将如何逐项求和?编写求和方法,并识别如果两个列表的大小不同会发生什么

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;
}
公共列表总和(左列表、右列表){
if(left.size()!=right.size()){
//您编写的运行时异常表示无法添加两个
//不同大小的数组。
抛出新的VectorShapeException(left.size(),right.size());
}
List vectorSum=new ArrayList();
对于(int i=0;i
确定要添加的内容,并使用此选项

现在,假设您有计算两个整数数组列表的点积的任务。您可能需要两件事——一个是求一个列表元素之和的方法,另一个是求乘积向量的方法。这可能是浪费,因为您可能不需要中间列表,而且会浪费空间。第一个任务很简单:

public int sum(List<Integer> list) {
    int total = 0;
    for(Integer element: list) {
        total += element;
    }
   return total;
}
公共整数和(列表){
int-total=0;
for(整型元素:列表){
总+=元素;
}
返回总数;
}
塞科