如何添加两个元素数量不均匀的数组列表

How do I add two arraylists with an uneven amount of elements

我正在尝试获取两个数组列表元素的总和,其中每个元素的数量不同,这是一种方法。到目前为止,我已经能够获取要添加的元素,但是当打印结果时,它会遗漏数字,因为数组列表具有不同的元素。假设数组列表 a 有 5 个元素,数组列表 b 有 3 个元素。数组中缺失的数量应该为 0。因此,如果 a{1, 2, 3, 4, 5} 并且 b{2, 3, 1}。结果应该是 {3, 5, 4, 4, 5}.

 public static ArrayList<Integer> sum(ArrayList<Integer> a, ArrayList<Integer> b)
  {
    ArrayList <Integer> result = new ArrayList <Integer> ();
    
     for(int i = 0; i < a.size(); i++) {
       result.add(a.get(i) + b.get(i));
     }
     return result;
  }  

请注意,您有 2 个不同大小的数组,因此您应该考虑到这一点,并且您的循环不能始终处于 a 大小,因为它可能大于 b 大小然后您尝试访问不存在的元素。 您可以做的是循环遍历两个数组中都存在的元素,然后完成其余部分。建议:

  public static ArrayList<Integer> sum(ArrayList<Integer> a, ArrayList<Integer> b) {
    ArrayList result = new ArrayList();
    int aSize = a.size();
    int bSize = b.size();

    for (int i = 0; i < Math.min(aSize, bSize); i++) { // Loop over elements that exist in both arrays
      result.add(a.get(i) + b.get(i));
    }

    if (aSize > bSize) { // Complete missing from a
      for (int i = aSize - bSize + 1; i < aSize; i++) {
        result.add(a.get(i));
      }
    } else if (bSize > aSize) { // Complete missing from b
      for (int i = bSize - aSize + 1; i < bSize; i++) {
        result.add(b.get(i));
      }
    }
    return result;
  }

取两个列表,一个一个地添加每个元素,如果在任何一个列表中没有更多元素,则将其存储在 sumnew list该列表从更大的列表新列表末尾的追加中获取剩余元素。

import java.util.*;

public class MainSum{
    public static void main(String ... $){
        var out = System.out;
        List<Integer> a = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        List<Integer> b = new ArrayList<>(List.of(2, 3, 1));

        List<Integer> result = MainSum.sum(a, b);

        out.println(result);
    }
    public static List<Integer> sum(List<Integer> a, List<Integer> b){
        List<Integer> result = new ArrayList<>();
        for(int index =0 ;index<a.size() && index< b.size();index++)
            result.add(a.get(index) + b.get(index));
        if( a.size() != b.size())
            result.addAll(a.size()>b.size()?a.subList(b.size(), a.size()):b.subList(a.size(), b.size()));
           return result;
    }
}

输出:

[3, 5, 4, 4, 5]

您必须确保迭代到更高的索引,并确保您不会 运行 遇到不存在索引的问题。

BiFunction<ArrayList<Integer>, Integer, Integer> getSafe =
   (l, i ) -> i < l.size() ? l.get(i) : 0;
for (int i = 0; i < Math.max(list1.size(), list2.size(); i++) {
  result.add(getSafe.apply(list1) + getSafe.apply(list1));
}

或者,如果你想过度设计

,可以使用 Iterator
Iterator<Integer> bothIterator = new Iterator<>() {
 Iterator<Integer> it1 = list1.iterator();
 Iterator<Integer> it2 = list2.iterator();
 public boolean hasNext() {
  return it1.hasNext() || it2.hasNext();
 }
 public Integer next() {
  int result = it1.hasNext() ? it1.next();
  result += it2.hasNext() ? it2.next() : 0;
  return result;
 }
}
int result = 0;
while (bothIterator.hasNext()) {
 result += bothIterator.next();
}

另一种方法可以基于自定义每个列表 return 个值。

public class TestArrSum {

    public static void main(String[] args) 
    {
        List<Integer> a = List.of(1,2,3,4,5); 
        List<Integer> b = List.of(2,3,1);
        List<Integer> result = sum(a,b);
        result.forEach(System.out::println);

    }
    public static List<Integer> sum(List<Integer> a, List<Integer> b)
    {
         List<Integer> result = new ArrayList<Integer>();
         for(int i=0;i<a.size() || i<b.size();i++)
         {
             result.add(getValue(a,i)+getValue(b,i));
         }
         
         return result;
    }
    
    public static int getValue(List<Integer> l,int i)
    {
        try
        {
            return l.get(i);
        }
        catch(ArrayIndexOutOfBoundsException e)
        {
            return 0;
        }
    }
}

注意:如果需要该方法签名包含更多要求和的列表,一个优点可能是冗长。

使用中间数据结构也可以获得相同的结果,后者将转换为列表。

static class MyMap extends HashMap<Integer,Integer>
{
    private static final long serialVersionUID = 1L;
    MyMap()
    {
        super();
    }

    public void putKV(Integer key,Integer value)
    {
        Integer old = this.get(key);
        if(old==null)
        {
            this.put(key, value);
        }
        else
        {
            this.put(key, old+value);
        }
        System.out.println(key+":"+value+":"+this.get(key));
        
    }
    public List<Integer> toList()
    {
        List<Integer> l = new ArrayList<Integer>();
        for(int i=0; i<this.size();i++)
        {
            l.add(this.get(i));
        }
        return l;
    }
}
        

可用作:

MyMap m = new MyMap();
for(int i=0;i<a.size();i++)
{
    m.putKV(i, a.get(i));
}
for(int i=0;i<b.size();i++)
{
    
    m.putKV(i, b.get(i));
}

List<Integer> resultM = m.toList();
resultM.forEach(k->System.out.println(k));