Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Excerpt

Denne oppgaven handler om en meta-iterator som reduserer kombinerer par av verdier fra to iteratorer til en enkelt verdi 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

Du skal lage en ny klasse BinaryComputingIterator, som er en Iterator<Double>-implementasjon som henter verdiene fra to andre iteratorer, gjør en binær operasjon på de to verdiene og gir ut resultet når  implementasjon av det innebygde Iterator<Double>-grensesnittet. Konstruktøren til BinaryComputingIterator skal ta inn to iteratorer og en binær operator, samt to valgfrie standardverdier. Når next()-metoden til BinaryComputingIterator blir kalt. Dette gjøres , skal en verdi hentes fra hver av de to iteratorene, den binære operasjonen utføres på disse to verdiene og resultatet returneres. Den binære operasjonen skal spesifiseres ved hjelp av det innebygde BinaryOperator<Double>-grensesnittet, som representerer en uspesifisert binær operasjon. Grensesnittet 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 <op> u).

Det skal være mulig å gi standardverdier som vil bli brukt dersom iteratorene har ulikt antall verdier, default1 og default2. Disse skal brukes når en iterator har flere verdier, men den andre iteratoren ikke har flere verdier.

 

. Hvordan en kan opprette funksjonelle grensesnitt kan du lese mer om på wikisiden om dette.

BinaryComputingIterator

Klassen skal ha 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 hvor iterator1 og iterator2 er iteratorene som blir kombinert av BinaryComputingIterator, og og default1 og  og default2 er  er standardverdier for de respektive iteratorene. Klassen har må ha følgende metoder, begge spesifisert av av Iterator<Double>-grensesnittet: Hvordan en lager en BinaryOperator klasse kan du se mer om lenger ned i oppgaveteksten. 

  • boolean hasNext() - returnerer true dersom minst én av iteratorene har flere verdier, og false dersom ingen av iteratorene har flere verdier. Dersom kun én iterator har flere verdier returnerer metoden kun true dersom det er definert en standardverdi for den tomme iteratoren.
  • Double next() - 

 

JExercise-testkode for BinaryComputing 

  •  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.

Husk at ved hjelp av 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. default1og 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.

 Eksempel 

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

 

Code Block
Iterator<Double> iterator1 = Arrays.asList(2.0, = new 3.0).iterator();
Iterator<Double> iterator2 = Arrays.asList(5.0).iterator();

BinaryOperator<Double> addition = (a, b) -> a + b;
 
// Opprett en ny BinaryComputingIterator som tar inn iterator1 og iterator2 og utfører addisjon på verdiene.
BinaryComputingIterator binaryIterator = new BinaryComputingIterator(iterator)

 

iterator1, iterator2, null, 10.0, addition);
 
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

Include Page
Bunntekst for JExerciseExercise-oppgaverøvinger
Bunntekst for JExerciseExercise-oppgaverøvinger