Commit 626302b3 authored by Hallvard Trætteberg's avatar Hallvard Trætteberg
Browse files

Rettelser

parent 1756b17e
......@@ -4,10 +4,12 @@ Dette er en prøve-eksamen, mye basert på [konten fra 2019](https://www.ntnu.no
Det deles ut en god del kode, noe skal bare forstås og noe skal bygges videre på. Vi har prøvd å markere med `// TODO`-kommentarer i koden, hvor det skal skrives mer kode. Bruk gjerne Eclipse sitt **Tasks**-panel for å se etter slike kommentarer, men husk at det ikke nødvendigvis er dekkende for hva som faktisk mangler! Vi har prøvd å redusere mengden skriving og verktøybruk, ut over produkt skriving av kode.
Oppgaven er del i to hoveddeler, den første er mange mindre småoppgaver som kan løses nokså uavhengig av hverandre, den andre er basert på caset fra 2019-konten.
Oppgaven er delt i to hoveddeler, den første er mange mindre småoppgaver som kan løses nokså uavhengig av hverandre, den andre er basert på caset fra 2019-konten.
Koden skal leveres _samlet_, ved at koden som er delt ut skal jobbes videre med, og til slutt pakkes i en zip-fil, som lastes opp. Hvis dere trenger kopi av originalkoden, så må dere ta den selv og legge den utenfor dette kodingsprosjektet.
Teorispørsmål besvares i en egen tekstfil, [svar.md](svar.md). Velg **Markdown Source** nederst til venstre, for å redigere. Du trenger ikke tenke på formattering, men vi har brukt markdown for å lage overskriften.
## Del 1 - småplukk
Denne delen er ment å teste veldig spesifikke ferdigheter. Oppgavene har varierende vanskelighetsgrad, men hver oppgave er nokså liten og skal ikke ta mange minuttene, om en vet hva en skal gjøre. Hvis en merker at en bruker mer tid, så kan det være lurt å bare gå videre.
......
......@@ -102,7 +102,7 @@ public class BikeRental {
}
/**
* @return the bikes that are close to a station (within 30m), but still are rented
* @return the bikes that are close to a station (within 30 meters), but still are rented
*/
private Collection<Bike> getUnreturnedBikes() {
return getRentedBikes().stream().filter(bike -> getStationNearby(bike, 30.0) != null).collect(Collectors.toList());
......
# Bike rental app
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten [BikeRental](BikeRental.java) tilbyr leie av sykler [Bike](Bike.java) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. Syklene har GPS, slik at de hele tiden spores [GeoLocation](GeoLocation.java).
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten [BikeRental](BikeRental.java) tilbyr leie av sykler [Bike](Bike.java) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. Syklene har GPS, slik at de hele tiden spores (med klassen [GeoLocation](GeoLocation.java)).
Den som skal leie sykkel [Person](Person.java) bruker en app for å få oversikt over hvor (ved hvilke stasjoner) det er tilgjengelige sykler. Deretter er det bare å identifisere sykkelen, angi hvor lenge man ønsker å leie den, og en kan sykle av gårde. Når en er ferdig med å bruke sykkelen, må den settes tilbake på en stasjon (ikke nødvendigvis den samme som en tok den fra). Ved hjelp av appen angir man at leieforholdet er avsluttet. Leieprisen blir da beregnet og pengene trukket.
Den som skal leie sykkel, [Person](Person.java), bruker en app for å få oversikt over hvor (ved hvilke stasjoner) det er tilgjengelige sykler. Deretter er det bare å identifisere sykkelen, angi hvor lenge man ønsker å leie den, og en kan sykle av gårde. Når en er ferdig med å bruke sykkelen, må den settes tilbake på en stasjon (ikke nødvendigvis den samme som en tok den fra). Ved hjelp av appen angir man at leieforholdet er avsluttet. Leieprisen blir da beregnet og pengene trukket.
Prisen er basert på påbegynte timer, og merk at en ikke betaler for mer enn faktisk bruk. Hvis man altså angir at en ønsker å leie en sykkel i tre timer, men leverer den tilbake etter en halv time, så betaler en for én times bruk.
......@@ -10,49 +10,59 @@ Det er mulig å utvide leietiden underveis, noe som utløser et lite gebyr. Hvis
Del 1 av oppgaven fokuserer på administrasjon av leieforholdet. Del 2 fokuserer på å gjøre det lettere å bytte måten prisen beregnes. Del 3 handler om en mobil-app for å beregne pris.
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet.
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet. Der det legges opp til at dere skal kommentere valg dere gjør er det naturlig at dere legger inn dette som kommentarer i koden knyttet til metodene eller klassene dere skriver om. Videre er det lagt opp til at du kan (og skal) gjøre naturlige antakelser, men vi ber dere om å gjøre rede for dem.
## Del 1 - BikeRental-, Bike-, og Location-klassene
## Del 1 - GeoLocation-, Bike- og BikeRental-klassene
BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Vi gjør det enkelt og identifiserer stasjonene med et geografisk punkt (GeoLocation, se skjelettet), altså lengde- og breddegrad. GeoLocation brukes også for lagring av posisjonen til syklene.
Du skal i denne delen gjøre endringer i alle disse tre klassene.
- Skriv ferdig double distance(GeoLocation)-metoden i GeoLocation.
**[GeoLocation](GeoLocation.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram:
BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Både stasjonene og syklene er knyttet til geografisk punkt, identifisert ved [GeoLocation](GeoLocation.java) som bruker lengde- og breddegrader.
- Skriv ferdig double distance(GeoLocation)-metoden i [GeoLocation](GeoLocation.java).
**[Bike](Bike.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram: _(NB Hallvard: I skjelettet refererer vi til Location, ikke GeoLocation)_
![Klassediagram](part1.png)
Begge disse assosiasjonene er dynamiske, dvs. både location og renter (låntaker) kan endres. location-koblingen endres (automagisk, du kan bare forholde deg til at location hele tiden oppdateres) når sykkelen beveger seg, mens renter-koblingen endres når leieforhold innledes og avsluttes.
- Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner.
- Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner (konstruktør, get/set).
**[BikeRental](BikeRental.java)**
BikeRental må holde oversikt over alle stasjonene, representert med GeoLocation, og alle syklene (Bike).
[BikeRental](BikeRental.java) må holde oversikt over alle stasjonene, representert med [GeoLocation](GeoLocation.java), og alle syklene ([Bike](Bike.java)).
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven.
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar (i en kode-kommentar) hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven. Du vil også finne en `main`-metode med noen eksempler på stasjoner i Trondheim sentrum, bruk gjerne disse for å teste koden din.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie kan kommer i del 2. `renter`-assosiasjonen i Bike skal holde rede på hvem (Person) som evt. leier en sykkel (Bike). Du bestemmer selv hvor/hvordan du vil representere når leieforholdet starter og når det forventes at sykkelen leveres tilbake. Det viktigste er at informasjonen kan brukes når sykkelen leveres og leien skal beregnes og betales.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie skal derimot skje i slutten av denne delen. Assosiasjonen `renter` i [Bike](Bike.java) skal holde rede på hvem ([Person](Person.java)) som evt. leier en sykkel ([Bike](Bike.java)). Du bestemmer selv hvor/hvordan du vil representere når leieforholdet starter og når det forventes at sykkelen leveres tilbake. Det viktigste er at informasjonen kan brukes når sykkelen leveres og leien skal beregnes og betales.
Skriv metodene under i klassen BikeRental. Disse metodene bygger på representasjonen du valgte over.
Skriv metodene under i klassen [BikeRental](BikeRental.java). Disse metodene bygger på representasjonen du valgte over.
- countAvailableBikesNearby - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
- getStationNearby – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
- getRentedBikes – returnerer alle syklene som er lånt ut
- getUnreturnedBikes – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter) (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
- **countAvailableBikesNearby** - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
- **getStationNearby** – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
- **getRentedBikes** – returnerer alle syklene som er lånt ut
- **getUnreturnedBikes** – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter) (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
Skriv metodene `rentBike` og `returnBike` i klassen BikeRental (se javadoc for detaljene, merk spesielt krav om utløsing av unntak). Disse metodene endrer tilstanden som brukes av de foregående metodene. Velg selv passende unntakstype(r). `LocalDateTime` brukes for å representere tid (erstatter Date i moderne Java).
Skriv metodene `rentBike` og `returnBike` i klassen [BikeRental](BikeRental.java) (se metodedokumetasjonen i kildekoden for detaljene, merk spesielt krav om utløsing av unntak). Disse metodene endrer tilstanden som brukes av de foregående metodene. Velg selv passende unntakstype(r). `LocalDateTime` brukes for å representere tid (erstatter Date i moderne Java).
- rentBike – kalles når en person starter å leie en gitt sykkel
- returnBike – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time)
- **rentBike** – kalles når en person starter å leie en gitt sykkel
- **returnBike** – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time) **Hallvard: det står i metodebeskrivelse at en ikke skal slette leien før ting er betalt, hva betyr dette?**
BikeRental-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid.
[BikeRental](BikeRental.java)-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid. Dette vil også kunne medføre endring i andre klasser!
- Gjør nødvendige endringer av rentBike- og returnBike-metodene i BikeRental, iht. de nye kravene nevnt over, og skriv i tillegg extendRental-metoden. Baser deg på en pris på 10 kr. pr. påbegynte time (som over), 5 kr. pr. forlengelse og 10 kr. pr. for sen forlengelse eller tilbakelevering.
- Gjennomfør endringer av relevante klasser (og introduser nye hvis det er behov).
- Gjør nødvendige endringer av metodene **rentBike** og **returnBike** i BikeRental, iht. de nye kravene nevnt over, og skriv i tillegg metoden **extendRental**.
- Baser deg på en pris på 10 kr. pr. påbegynte time (som over), 5 kr. pr. forlengelse og 10 kr. pr. for sen forlengelse eller tilbakelevering. En sykkel som først leies fra 12:00 - 13:00, utvides 13:05 - 16:00, utvides igjen fra 15:30 - 17:00 og returneres 16:45 skal betale 70 kroner.
## Del 2 - Fleksibel beregning av pris
Det er ønskelig å gjøre håndtering av pris fleksibel, så endringer i liten (eller ingen) grad krever endringer i koden. F.eks. kan det være aktuelt å introdusere abonnement, kortvarige kampanjer og/eller ulike typer fremkomstmidler med egne priser. Koden bør dermed gjøres mer fleksibel.
Velg én eller flere av disse mulighetene, og realiser en løsning som gir en ryddig programstruktur. Du står fritt i utforming av løsningen, men husk at hensikten er å vise at du kan trekke inn en eller flere relevante og mer avanserte teknikker. Du blir ikke vurderte ut fra mengden kode, men god og fornuftig bruk av teknikkene.
Velg én eller flere av disse mulige utvidelsene, og realiser en løsning som gir en ryddig programstruktur. Du står fritt i utforming av løsningen, men husk at hensikten er å vise at du kan trekke inn en eller flere relevante og mer avanserte teknikker. Du blir ikke vurdert ut fra mengden kode, men god og fornuftig bruk av teknikkene.
## Del 3 - Mobil-app
......@@ -62,7 +72,8 @@ Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FX
<img src="bike-rental-app.png" width="500"/>
Prototypen er laget vha. FXML og noe Java, og nå er det din jobb å fullføre den!
Prototypen er laget vha. FXML, se [BikeRental.fxml](BikeRental.fxml), og noe Java, se bl.a. [BikeRentalApp.java](BikeRentalApp.java), og nå er det din jobb å fullføre den!
- Legg først til de Java-elementene (klasser, felt og metoder) som må finnes i koden som implementerer oppførselen (logikken) til appen
- Skriv koden som er nødvendig for å vise frem prisen, når tilsvarende knapp trykkes!
- Du skal _ikke_ implementere noe i forhold til kartet i seg selv. Dette er kun et bilde.
# Bike rental app
Temaet for oppgaven er administrasjon av sykkelutleie. Sykkelutleietjenesten [BikeRental](BikeRental.java) tilbyr leie av sykler [Bike](Bike.java) som plukkes opp og settes tilbake på utvalgte stasjoner spredt rundt omkring. Syklene har GPS, slik at de hele tiden spores (med klassen [GeoLocation](GeoLocation.java)).
Den som skal leie sykkel, [Person](Person.java), bruker en app for å få oversikt over hvor (ved hvilke stasjoner) det er tilgjengelige sykler. Deretter er det bare å identifisere sykkelen, angi hvor lenge man ønsker å leie den, og en kan sykle av gårde. Når en er ferdig med å bruke sykkelen, må den settes tilbake på en stasjon (ikke nødvendigvis den samme som en tok den fra). Ved hjelp av appen angir man at leieforholdet er avsluttet. Leieprisen blir da beregnet og pengene trukket.
Prisen er basert på påbegynte timer, og merk at en ikke betaler for mer enn faktisk bruk. Hvis man altså angir at en ønsker å leie en sykkel i tre timer, men leverer den tilbake etter en halv time, så betaler en for én times bruk.
Det er mulig å utvide leietiden underveis, noe som utløser et lite gebyr. Hvis en utvider leietiden eller leverer sykkelen etter at sykkelen skulle vært levert, så påløper det også et gebyr.
Del 1 av oppgaven fokuserer på administrasjon av leieforholdet. Del 2 fokuserer på å gjøre det lettere å bytte måten prisen beregnes. Del 3 handler om en mobil-app for å beregne pris.
Som nevnt i innledning til oppgavesettet skal all koden leveres samlet. Deloppgavene er laget som en hjelp til å ta én ting om gangen i en naturlig rekkefølge, men du bør se på det som en helhet. Der det legges opp til at dere skal kommentere valg dere gjør er det naturlig at dere legger inn dette som kommentarer i koden knyttet til metodene eller klassene dere skriver om. Videre er det lagt opp til at du kan (og skal) gjøre naturlige antakelser, men vi ber dere om å gjøre rede for dem.
## Bør vi gjøre ferdig Person litt mer? Hvis ikke bør vi si til dem at det må gjøres ting i del 1.
## Del 1 - GeoLocation-, Bike- og BikeRental-klassene
Du skal i denne delen gjøre endringer i alle disse tre klassene.
**[GeoLocation](GeoLocation.java)**
BikeRental-klassen administrerer stasjonene, syklene og utleieforhold. Både stasjonene og syklene er knyttet til geografisk punkt, identifisert ved [GeoLocation](GeoLocation.java) som bruker lengde- og breddegrader.
- Skriv ferdig double distance(GeoLocation)-metoden i [GeoLocation](GeoLocation.java).
**[Bike](Bike.java)**
Bike-klassen skal ha assosiasjoner (koblinger) til Person- (se skjelettet) og GeoLocation-klassene iht. følgende klassediagram: _(NB Hallvard: I skjelettet refererer vi til Location, ikke GeoLocation)_
![Klassediagram](part1.png)
Begge disse assosiasjonene er dynamiske, dvs. både location og renter (låntaker) kan endres. location-koblingen endres (automagisk, du kan bare forholde deg til at location hele tiden oppdateres) når sykkelen beveger seg, mens renter-koblingen endres når leieforhold innledes og avsluttes.
- Skriv felt og metoder for location- og renter-assosiasjonene iht. Java sine kodingskonvensjoner (konstruktør, get/set).
**[BikeRental](BikeRental.java)**
[BikeRental](BikeRental.java) må holde oversikt over alle stasjonene, representert med [GeoLocation](GeoLocation.java), og alle syklene ([Bike](Bike.java)).
- Skriv nødvendige variabel-deklarasjoner (felt) for dette og forklar hva som styrer valget av typer. Hvis du trenger metoder for å konfigurere systemet med stasjoner og sykler, f.eks. for testformål, så skriv gjerne slike, men det er ikke en del av oppgaven. Du vil også finne en main-metode med noen eksempler på stasjoner i Trondheim sentrum, bruk gjerne disse for å teste koden din.
I første omgang kan du forenkle koden for leie og retur av sykler, ved å ikke ta hensyn til annet enn start- og slutt-tidspunkt for leieforholdet. Forlenging av leie skal derimot skje i slutten av denne delen. Assosiasjonen `renter` i [Bike](Bike.java) skal holde rede på hvem ([Person](Person.java)) som evt. leier en sykkel ([Bike](Bike.java)). Du bestemmer selv hvor/hvordan du vil representere når leieforholdet starter og når det forventes at sykkelen leveres tilbake. Det viktigste er at informasjonen kan brukes når sykkelen leveres og leien skal beregnes og betales.
Skriv metodene under i klassen [BikeRental](BikeRental.java). Disse metodene bygger på representasjonen du valgte over.
- **countAvailableBikesNearby** - teller hvor mange ledige sykler det er innen en viss avstand (hjelper en potensiell låner (renter) å finne ut om det er sykler i nærheten)
- **getStationNearby** – finner (lokasjonen til) stasjonen som er nærmest en sykkel og innenfor en viss minimumsavstand (hjelper en låner (renter) å finne ut hvor en sykkel kan settes tilbake)
- **getRentedBikes** – returnerer alle syklene som er lånt ut
- **getUnreturnedBikes** – returnerer alle syklene som er plassert ved en stasjon, men som fortsatt er knyttet til en låner (renter) (brukes når en skal sende varsler til de som har satt fra seg sykkelen, men glemt å angi den som levert)
Skriv metodene `rentBike` og `returnBike` i klassen [BikeRental](BikeRental.java) (se metodedokumetasjonen i kildekoden for detaljene, merk spesielt krav om utløsing av unntak). Disse metodene endrer tilstanden som brukes av de foregående metodene. Velg selv passende unntakstype(r). `LocalDateTime` brukes for å representere tid (erstatter Date i moderne Java).
- **rentBike** – kalles når en person starter å leie en gitt sykkel
- **returnBike** – kalles når en person leverer tilbake sykkelen og betaler for leien (i denne oppgaven skal pris være 10 kr. pr. påbegynte time) **Hallvard: det står i metodebeskrivelse at en ikke skal slette leien før ting er betalt, hva betyr dette?**
[BikeRental](BikeRental.java)-klassen skal utvides til å støtte forlengelse av leie, beregning av gebyrer for forlengelse og for å forlenge eller levere tilbake sykkelen etter angitt tid. Dette vil også kunne medføre endring i andre klasser!
- Gjennomfør endringer av relevante klasser (og introduser nye hvis det er behov).
- Gjør nødvendige endringer av metodene **rentBike** og **returnBike** i BikeRental, iht. de nye kravene nevnt over, og skriv i tillegg metoden **extendRental**.
- Baser deg på en pris på 10 kr. pr. påbegynte time (som over), 5 kr. pr. forlengelse og 10 kr. pr. for sen forlengelse eller tilbakelevering. En sykkel som først leies fra 12:00 - 13:00, utvides 13:05 - 16:00, utvides igjen fra 15:30 - 17:00 og returneres 16:45 skal betale 70 kroner.
## Del 2 - Fleksibel beregning av pris
Det er ønskelig å gjøre håndtering av pris fleksibel, så endringer i liten (eller ingen) grad krever endringer i koden. F.eks. kan det være aktuelt å introdusere abonnement, kortvarige kampanjer og/eller ulike typer fremkomstmidler med egne priser. Koden bør dermed gjøres mer fleksibel.
Velg én eller flere av disse mulige utvidelsene, og realiser en løsning som gir en ryddig programstruktur. Du står fritt i utforming av løsningen, men husk at hensikten er å vise at du kan trekke inn en eller flere relevante og mer avanserte teknikker. Du blir ikke vurdert ut fra mengden kode, men god og fornuftig bruk av teknikkene.
## Del 3 - Mobil-app
Det skal lages en mobil-app for utleietjenesten og i første omgang fokuseres det på beregning av pris. Man skal kunne angi uthentings- og innleveringstidspunkt og få beregnet prisen.
Under ser du et utkast til en mobil-app for sykkelutleietjenesten, basert på FXML. Kartet viser hvor det er sykler, og én stasjon er valgt (og implisitt også en sykkel på stasjonen). Brukeren kan endre antatt tidspunkt for tilbakelevering ved å endre teksten i tekstfeltet eller bruke knappene til høyre for feltet.
<img src="bike-rental-app.png" width="500"/>
Prototypen er laget vha. FXML, se [BikeRental.fxml](BikeRental.fxml), og noe Java, se bl.a. [BikeRentalApp.java](BikeRentalApp.java), og nå er det din jobb å fullføre den!
- Legg først til de Java-elementene (klasser, felt og metoder) som må finnes i koden som implementerer oppførselen (logikken) til appen
- Skriv koden som er nødvendig for å vise frem prisen, når tilsvarende knapp trykkes!
- Du skal _ikke_ implementere noe i forhold til kartet i seg selv. Dette er kun et bilde.
......@@ -29,7 +29,7 @@ public class LambdaUtilities {
}
/**
* Adds n elements from the provided supplier to col
* Adds n elements from the provided supplier to col and returns it.
* @param col
* @param n
* @param supplier
......@@ -55,7 +55,7 @@ public class LambdaUtilities {
}
/**
* Calls cons on all items in all elements
* Calls cons on all items in elements
* @param cons
* @param elements
*/
......@@ -67,11 +67,12 @@ public class LambdaUtilities {
}
/**
* Sums the result of applying op to consecutive elements of nums1 and nums2
* @param op
* @param nums1
* @param nums2
* @return the sum of the result of applying op to consecutive elements of nums1 and nums2
* Sums the result of applying the provided BinaryOperator op to pairs of consecutive elements of nums1 and nums2.
* If one of the sequences is longer than the other, you should drop the remaining elements.
* @param op the operator to apply on pairs of elements
* @param nums1 first set of elements
* @param nums2 second set of elements
* @return the sum of the result of applying op to pairs of consecutive elements of nums1 and nums2
*/
public static double zip(final BinaryOperator<Double> op, final List<Double> nums1, final Collection<Double> nums2) {
final Iterator<Double> it1 = nums1.iterator(), it2 = nums2.iterator();
......@@ -94,7 +95,7 @@ public class LambdaUtilities {
// 2
// 1
forEach(System.out::println, Arrays.asList("3", "2"), Arrays.asList("1"));
// Should print 13.0 (i.e. the sum of the products)
// Should print 13.0, i.e. the sum of the products
System.out.println(zip((n1, n2) -> n1 * n2, Arrays.asList(1.0, 2.5), Arrays.asList(3.0, 4.0)));
}
}
# Småplukk
## Iteratorer
Med mindre noe annet er sagt, så skal klassen implementeres.
### StringBuilderCharacterIterator
## 1 - Iterasjon med iteratorer
### 1.1 - for-each, Iterable og Iterator
Forklar med tekst og kode sammenhengen mellom for-each-syntaksen, altså den på formen `for (<type> <var> : <uttrykk>) ...`, og **Iterable** og **Iterator**-grensesnittene.
Skriv svaret i [svar.md](../../svar.md)-fila.
### 1.2 - StringBuilderCharacterIterator
[StringBuilderCharacterIterator](StringBuilderCharacterIterator.java)-klassen skal implementere en iterator av tegnene (`Character`) inni en `StringBuilder`. Klassen `StringBuilder` er en `String`-aktig klasse med den (viktige) forskjellen at instanser kan endres etter opprettelsen.
Klassen testes av StringBuilderCharacterIteratorTest.
### StringBooleanMetaIterator
### 1.3 - StringBooleanMetaIterator
[StringBooleanMetaIterator](StringBooleanMetaIterator.java)-klassen er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre.
[StringBooleanMetaIterator](StringBooleanMetaIterator.java)-klassen er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, en for `String` og en for `Boolean`, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre. De to iteratorene kan antas å være like lange.
Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er", "ikke", "kult"` og den andre gir ut `true, true, false, true` så skal StringBooleanMetaIterator-instansen gi ut `"meta-iteratorer", "er", "kult"`. Det tredje elementet (`"ikke"`) ble altså utelatt siden den tredje logiske verdien var `false`.
......@@ -18,21 +26,23 @@ Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er",
Klassen testes av StringBooleanMetaIteratorTest.
### EverySecondMetaIterator og EverySecondMetaIteratorTest
### 1.4 - EverySecondMetaIterator og EverySecondMetaIteratorTest
[EverySecondMetaIterator](EverySecondMetaIterator.java) er også en meta-iterator. Den tar inn en annen iterator og slipper gjennom _annenhvert_ element.
Eksempel: Hvis iteratoren den tar inn gir ut `"1", "2", "3", "4"`, så skal EverySecondIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondIteratorTest](EverySecondIteratorTest.java)-testklassen.
Eksempel: Hvis iterator-argumentet gir ut `"1", "2", "3", "4"`, så skal EverySecondIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondMetaIteratorTest](EverySecondMetaIteratorTest.java)-testklassen.
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfellet. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfelle. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Din oppgave er skrive to testmetoder som identifiserer begge feilene (ved at testmetoden utløser unntak på vanlig testmetodevis):
- en testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på
- én testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på
- en annen testmetoden skal identifisere den fundamentale feilen
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
## 2 - Funksjonelle grensesnitt og lambda
## Funksjonelle grensesnitt og lambda
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java) iht. det som står i javadoc-en over metodene. Metodesignaturene (parameter- og retur-typer) skal _ikke_ endres.
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java). `main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
`main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
# Småplukk
## 1 - Iteratorer
Disse oppgavene dreier seg om ulik bruk av iteratorer.
### 1.1 - StringBuilderCharacterIterator
[StringBuilderCharacterIterator](StringBuilderCharacterIterator.java)-klassen skal implementere en iterator av tegnene (Character) inni en `StringBuilder`. `StringBuilder` er en `String`-aktig klasse med den (viktige) forskjellen at instanser kan endres etter opprettelsen. Klassen testes av StringBuilderCharacterIteratorTest.
- Implementer StringBuilderCharacterIterator.
### 1.2 - StringBooleanMetaIterator
Klassen [StringBooleanMetaIterator](StringBooleanMetaIterator.java) er en såkalt meta-iterator, ved at den bruker andre iteratorer som sin kilde av elementer. Akkurat denne meta-iteratoren tar inn to andre iteratorer, hvilke elementer i den første som skal videreformidles eller filtreres bort styres av den andre. Den første itererer over strenger, den andre itererer over boolske verdier.
Eksempel: Hvis den første iteratoren gir ut sekvensen `"meta-iteratorer", "er", "ikke", "kult"` og den andre gir ut `true, true, false, true` så skal StringBooleanMetaIterator-instansen gi ut `"meta-iteratorer", "er", "kult"`. Det tredje elementet (`"ikke"`) ble altså utelatt siden den tredje logiske verdien var `false`.
`main`-metoden er allerede påbegynt med dette som eksempel, bruk den til å teste din egen kode.
Klassen testes av StringBooleanMetaIteratorTest.
- Implementer StringBooleanMetaIterator.
- Du kan forvente at de to sekvensene (strenger og boolske verdier) er like lange.
### 1.3 - EverySecondMetaIterator og EverySecondMetaIteratorTest **(navn endret, la på Meta på begge)**
[EverySecondMetaIterator](EverySecondMetaIterator.java) er også en meta-iterator. Den tar inn en annen iterator og slipper gjennom _annenhvert_ element.
Eksempel: Hvis iteratoren den tar inn gir ut `"1", "2", "3", "4"`, så skal EverySecondMetaIterator-instansen selv gi ut `"1", "3"`. Dette er testet i både `main`-metoden og [EverySecondMetaIteratorTest](EverySecondMetaIteratorTest.java)-testklassen.
Klassen er "ferdig"-implementert i den forstand at den virker for et eksempel-tilfellet. Den har imidlertid en _fundamental_ feil som gjør at den strengt tatt ikke virker riktig for eksemplet, det er bare at testen ikke er grundig nok. Implementasjonen gjør også andre feil som gjør at den kræsjer for andre tilfeller.
Din oppgave er skrive to testmetoder som identifiserer begge feilene (ved at testmetoden utløser unntak på vanlig testmetodevis):
- en testmetode skal identifiserer et annet tilfelle som implementasjonen kræsjer på.
- en annen testmetoden skal identifisere den fundamentale feilen.
Du skal altså _ikke_ rette feilene, men skrive gode testmetoder for å identifisere dem.
## 2 - Funksjonelle grensesnitt og lambda
Her er oppgaven å skrive de manglende metodene i [LambdaUtilities](LambdaUtilities.java). `main`-metoden inneholder eksempler må bruk av metodene. (Vi har ikke laget noen testklasse for dere til denne oppgaven.)
- Implementer metodene beskrevet i [LambdaUtilities](LambdaUtilities.java).
- Over hver metode finner dere en beskriver forventet oppførsel.
\ No newline at end of file
# Svar på teorispørsmål
Her besvares teorispørsmål. Hvis du bruker Eclipse, så velg **Markdown Source** nederst til venstre, for å redigere. Du trenger ikke tenke på formattering, men vi har brukt markdown for å lage overskriften.
### 1.1
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment