You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 13 Next »

Denne oppgaven handler om en meta-iterator som kombinerer par av verdier fra to iteratorer til en ny iterator-sekvens ved hjelp av en gitt binær operasjon.

Meta-iteratorer er iteratorer som bruker andre iteratorer som datakilder. Se lysark om teknikken: Forelesningslysark om meta-iteratorer

BinaryComputingIterator er en Iterator<Double>-implementasjon som henter verdiene fra to andre iteratorer, iterator1 og iterator2, gjør en binær operasjon på de to verdiene og gir ut resultet når next()-metoden blir kalt. Den binære operasjonen gjøres ved hjelp av BinaryOperator<Double>-grensesnittet, som har en apply-metode som lar en beregne resultatet av den binære operasjonen:

  • Double apply(Double t, Double u) - returnerer resultatet av den binære operasjonen (t <operator> u).

Vha. Java 8-syntaks kan en implementasjon av BinaryOperator skrives som (num1, num2) -> <uttrykk>, der <uttrykk> er et Java-uttrykk som brukes num1 og num2.

Hvis BinaryComputerIterator henter verdier fra to iteratorer med hhv. verdiene 1, 2, 3 og 3, 4, 5 og den binære operatoren er (num1, num2) -> num1 + num2, så skal sekvensen en får ut være 4, 6, 8.

For å håndtere tilfellet hvor den ene iteratoren gir ut flere verdier enn den andre, så skal det være mulig å gi standardverdier hhv. default1 og default2 for iterator1 og iterator2, som vil bli brukt for å fylle inn manglende verdier. Hvis BinaryComputerIterator henter verdier fra to iteratorer med hhv. verdiene 6, 3, 0 og 3, 4 og den binære operatoren er (num1, num2) -> num1 - num2 og default2 er 2, så skal sekvensen en får ut være 3, -1, -2.


Exercise-panelet  

Bruk av Exercise-panelet er obligatorisk for denne øvingen. Du må ha panelet åpent med Named.ex-filen (tests > interfacesNamed.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på forrige side, altså hovedsiden for Øving 6.

BinaryComputingIterator

BinaryComputingIterator-klassen har to konstruktører, en med og en uten standardverdier:

  • BinaryComputingIterator(Iterator<Double> iterator1, Iterator<Double> iterator2, BinaryOperator<Double> operator)
  • BinaryComputingIterator(Iterator<Double> iterator1, Iterator<Double> iterator2, Double default1, Double default2, BinaryOperator<Double> operator)

hvor iterator1 og iterator2 er iteratorene som blir kombinert av BinaryComputingIterator, og default1 og default2 er standardverdier for de respektive iteratorene.

Klassen må ha følgende metoder, begge spesifisert av Iterator<Double>-grensesnittet:

  • boolean hasNext() - returnerer true dersom det kan beregnes flere verdier, altså hvis begge iteratorene enten har flere verdier eller har en tilhørende standardverdi. Men merk at hasNext() returnerer uansett false, hvis begge iteratorene er tomme.
  • Double next() - returnerer resultatet av å bruke binæroperasjonen operator på de neste verdiene fra sub-iteratorene, og bruker standardverdier dersom en av iteratorene ikke har flere verdier.

Eksempel

BinaryOperator-implementasjoner kan lett skrive ved hjelp av Java 8 sin funksjonsnotasjon. Dersom man for eksempel vil bruke en addisjonsoperator kan det se slik ut:

Iterator<Double> iterator1 = Arrays.asList(2.0, 3.0).iterator();
Iterator<Double> iterator2 = Arrays.asList(5.0).iterator();
BinaryComputingIterator binaryIterator = new BinaryComputingIterator(iterator1, iterator2, null, 10.0, (x, y) -> x+y);
 
binaryIterator.next();   // 7.0
binaryIterator.hasNext() // true
binaryIterator.next()    // 13.0
binaryIterator.hasNext() // false

Testkode for BinaryComputingIterator er her: interfaces/BinaryComputingIteratorTest.java. Originalkoden (jextest) for testen finner du her: interfaces/BinaryComputingIterator.jextest

  • No labels