2016-05-15 12 views
0

Hinzufügen habe ich eine arrayDeque von BigInts die I Halte Saiten im wesentlichen umgesetzt haben, wie gerade IE [email protected] = "3476234236734567"alle Elemente in einer ArrayDeque iterativ

Ich habe bereits ein Verfahren ein BigInt zum anderen hinzuzufügen, die eine neue BigInt zurückgibt, eine enthaltend String der Summe der beiden BigInts. IE

[email protected] = "4321" 
    [email protected] = "5555" 
    [email protected] = "9876" 

Meine Frage ist, wie kann ich durch diese Deque Iterate und auf den BigInts hinzufügen nennen.

Ich dachte über eine Forloop auf die Größe des ArrayDeque, aber ArrayDeque hat nicht wirklich eine x.get(x.size()-1) Funktionalität, wie Sie mit einer normalen ArrayList könnte.

Edit: Für mehr Extrapolation, das ist, was ich gerade arbeite mit. Ziffer ist die Liste Format der Zeichenfolge 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()); 
} 

Antwort

2

ArrayDeque<T>Iterable<T> implementiert, daher können Sie verwenden eine for-each Schleife über sie:

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. 

dies Ihre BigInt Klasse übernimmt eine hat Methode add(BigInt b). Entweder haben Sie es implementiert, oder vielleicht wollten Sie BigInteger, die eingebaute Klasse für große Ints verwenden.

Eine fortgeschrittenere Art und Weise die Elemente in der Deque aufzusummieren ist Strom Reduktionsoperationen und Verfahren Referenzen zu verwenden:

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

BigInteger sum = deque.stream().reduce(BigInt::add).orElseGet(() -> new BigInt("0")); 
+0

Ich habe tatsächlich eine 'BigInt.add (BigInt b)' Methode implementiert, die sich vom eingebauten 'BigInteger' unterscheidet. Ich habe meinem Beitrag ein wenig mehr Informationen hinzugefügt, so dass ich nicht weiß, ob das irgendetwas in Ihrer Antwort ändern würde. – Alkarin

+0

Ihr erster Block Code ist fast genau, wie ich es zum Funktionieren brachte. Vielen Dank – Alkarin

+0

Wenn Sie 'reduce (BigInt :: add) .oderElseGet (() -> new BigInt (" 0 "))', würden Sie eine weniger 'add()' aufrufen, und die '0' Wert würde nur erstellt, wenn 'deque' leer ist. Gibt Ihnen auch die Flexibilität, 'orElse (null)' oder 'orElseThrow (NoSuchElementException :: new)' (oder einfach 'get()') zu tun, wenn es angebracht ist. – Andreas

1

ArrayDeque implementiert Iterable, so dass man die erweiterte for-Schleife verwenden:

BigInteger sum = BigInteger.ZERO; 
for (BigInteger value : arrayDeque) { 
    sum = sum.add(value); 
} 
Verwandte Themen