如何添加两个元素数量不均匀的数组列表
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;
}
取两个列表,一个一个地添加每个元素,如果在任何一个列表中没有更多元素,则将其存储在 sum 中 new 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));
我正在尝试获取两个数组列表元素的总和,其中每个元素的数量不同,这是一种方法。到目前为止,我已经能够获取要添加的元素,但是当打印结果时,它会遗漏数字,因为数组列表具有不同的元素。假设数组列表 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;
}
取两个列表,一个一个地添加每个元素,如果在任何一个列表中没有更多元素,则将其存储在 sum 中 new 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));