我試圖在一個方法中獲取兩個陣列串列元素的總和,其中每個元素的數量不同。到目前為止,我已經能夠添加要添加的元素,但是當列印結果時,它會遺漏數字,因為陣列串列具有不同數量的元素。假設陣列串列 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 結果 = 新的 ArrayList ();
for(int i = 0; i < a.size(); i ) {
result.add(a.get(i) b.get(i));
}
return result;
}
uj5u.com熱心網友回復:
請注意,您有 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;
}
uj5u.com熱心網友回復:
取兩個串列,將每個元素一一添加,如果串列中沒有更多元素,則將總和存盤在新串列中,從較大串列中取出剩余元素并附加到新串列的末尾。
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]
uj5u.com熱心網友回復:
另一種方法可以基于自定義每個串列回傳值。
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;
}
}
}
注意:如果需要該方法簽名包含更多要求和的串列,則一個優點可能是冗長。
uj5u.com熱心網友回復:
您必須確保迭代到更高的索引,并確保您不會遇到不存在索引的問題。
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();
}
uj5u.com熱心網友回復:
您應該比較兩個串列的大小以確定將迭代哪個串列。
public static List<Integer> sum(List<Integer> a, List<Integer> b) {
List<Integer> result;
if (a.size() > b.size()) {
result = new ArrayList<>(a);
for (int i = 0; i < b.size(); i ) {
result.set(i, a.get(i) b.get(i));
}
} else {
result = new ArrayList<>(b);
for (int i = 0; i < a.size(); i ) {
result.set(i, a.get(i) b.get(i));
}
}
return result;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/463739.html
