Alkarin Alkarin - 6 months ago 23
Java Question

Adding all elements in an ArrayDeque Iteratively

I have an arrayDeque of BigInts which I have implemented as essentially just holding strings IE

BigInt@Instancewhatever = "3476234236734567"


I already have a method to add one BigInt to another which returns a new BigInt, containing a String of the sum of the two BigInts.
IE

BigInt@1 = "4321"
BigInt@2 = "5555"
BigInt@Sum = "9876"


My question is how can I Iterate through this Deque and call add on the BigInts.

I was thinking of using a forloop on the size of the ArrayDeque, but ArrayDeque doesn't really have a
x.get(x.size()-1)
functionality to it like you could with a normal ArrayList.

Edit:For more extrapolation, this is what I am currently working with.
digit is the List format of the string IE
"1,2,3,4","5,5,5,5"
etc

public BigInt times(BigInt operand){

List<Integer> a = this.getDigit();
List<Integer> b = operand.getDigit();
//sum left unused atm
List<Integer> sum = operand.getDigit();
Deque<BigInt> temp = new ArrayDeque<>();
Deque<BigInt> temp1 = new ArrayDeque<>();

if(a.size() > b.size()){
temp1 = multiply(a,b,temp);
//Iterate here?

} else {
temp1 = multiply(b,a,temp);
//Iterate here?
}
return new BigInt(temp1.toString());
}

Answer

ArrayDeque<T> implements Iterable<T>, hence you can use a for-each loop over it:

ArrayDeque<BigInt> deque = new ArrayDeque<BigInt>();
//populate deque

BigInt sum = new BigInt("0");
for(BigInt b : deque) {
    sum = sum.add(b);
}

//sum now holds the sum of the elements in deque.

This assumes your BigInt class has a method add(BigInt b). Either you have implemented it, or perhaps you meant to use BigInteger, the built in class for large ints.

A more advanced way to sum up the elements in the deque is to use stream reduction operations and method references:

ArrayDeque<BigInt> deque = new ArrayDeque<>();
//populate deque...

BigInteger sum = deque.stream().reduce(new BigInt("0"), BigInt::add);