Work in progress....
Denne oppgaven hander om et grensnitt (interface) for brett (grid), hvordan slike implementeres og hvordan en kan iterere gjennom et slikt brett ved hjelp av en Iterator.I denne oppgaven tar vi utgangspunkt i en Person-klasse som har et navn (String) bestående av fornavn ("given name") og etternavn ("family name").
- Grid - generelt grensesnitt (og implementasjon) for rutenett og iterator over elementene
-- De får utdelt GridImpl<T> og skal selv definere Grid<T>-grensesnittet og endre GridImpl så den implementerer Grid<T> (dersom vi tror bruk av generics forvirrer dem, så låser vi det til String, men da må testen oppdateres)
-- GridIterator<T> implementerer en Iterator<T> over alle elementene. Klassen kan konfigureres slik at den kan itererer bortover først (rowMajor=true) eller nedover først (rowMajor=false).
Del 1
Definer et grensesnitt Named med metodene
- setGivenName(String) og String getGivenName() for å sette og hente fornavn,
- setFamilyName(String) og String getFamilyName() for å sette og hente etternavn, og
- setFullName(String) og String getFullName() for å hente personens hele navn.
Del 2
Lag en Person-klasse som implementerer grensesnittet Named. Person-klassen kan ha enten ett eller to felter for personnavnet avhengig av hva man finner enklest. Man kan anta at brukeren oppretter Person-objekter med gyldige navn, altså trenger man ikke å implementere valideringsmetoder.
Del 3
For å kunne sammenligne Named-objekter, f. eks. for å sortere en kontaktliste, kan vi lage en klasse NamedComparator som implementerer grensesnittet Comparator. NamedComparator-objektet skal brukes for å sammenligne navn parvis: Først på etternavn, og deretter på fornavn om etternavnene er like. Dette kan gjøres ved å la NamedComparator-klassen implementere metoden int compare(Named named1, Named named2) med følgende logikk:
- Dersom etternavnene er ulike skal metoden
- returnere et negativt heltall om det første etternavnet er leksikografisk ordnet før det andre,
- eller et positivt heltall i motsatt tilfelle.
- Dersom etternavnene er like skal metoden gjøre det samme på fornavnene. Dersom også fornavnene er like skal metoden returnere 0.
- Hint: For å sammenlikne to String-objekter kan man bruke String-klassens innebygde Comparable-metode int compareTo(String streng2). Denne metoden sammenlikner leksikografisk en streng med en annen.
Merk: Underveis i denne oppgaven skal det skrives testkode for å sortere navn i en liste vha. Collections.sort-metoden, for å teste om NamedComparator-klassen har implementert Comparator riktig.
JExercise-testkode for oppgavene finner du her: interfaces/NamedTest.java
JExercise lar deg sjekke din egen kode vha. forhåndslagde JUnit-tester og JExercise-panelet.
Bruk av JExercise:
- Sørg for at jexercise-standalone.jar er lagt til i ditt prosjekts Build Path. Dette må gjøres hver gang du oppretter et nytt prosjekt, og det er derfor lurt å gjenbruke samme prosjekt til alle oppgaver.
- JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
- Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
- Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet.
- Testene kan så kjøres ved å dobbeltklikke på testen som ønskes kjørt.
Ved trøbbel, se først om du finner løsningen i Løsninger på trøbbel med JExercise.
Twitre gjerne om oppgaven når du er ferdig: <a href="https://twitter.com/share" class="twitter-share-button" data-hashtags="jexercise">Tweet</a>
<script>!function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0],p=/^http:/.test(d.location)?'http':'https';if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src=p+'://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js,fjs);}}(document, 'script', 'twitter-wjs');</script>