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

Compare with Current View Page History

« Previous Version 16 Next »

Denne oppgaven handler om et grensnitt (interface) for person-navn og hvordan slike implementeres og sorteres med grensesnittet Comparator.

I denne oppgaven tar vi utgangspunkt i at en person har et navn (String) bestående av fornavn ("given name") og etternavn ("family name") som sammen gir personens fulle navn ("full name").

Del 1

Definer et grensesnitt Named med følgende metoder:

  • setGivenName(String) og String getGivenName() for å sette og hente fornavn
  • setFamilyName(String) og String getFamilyName() for å sette og hente etternavn
  • setFullName(String) og String getFullName() for å sette og hente personens hele navn. Argumentet til set-metoden skal være fornavn og etternavn skilt med mellomrom. Tilsvarende skal get-metoden returnere fornavn og etternavn skilt med mellomrom.

Del 2

Lag klassene Person1 og Person2 som begge implementerer grensesnittet NamedPerson1-klassen skal ha felter for for- og etternavn (altså givenName og familyName) og en konstruktør som tar inn to tilsvarende argumenter. Person2 skal ha ett felt for fullt navn (fullName) og en konstruktør som tar inn det fulle navnet. Begge skal imidlertid implementere samme logikk, dvs. ha get- og set-metoder for fornavn, etternavn og fullt navn. Man kan anta at brukeren oppretter Person1 og Person2-objekter med gyldige navn, altså trenger man ikke å implementere valideringsmetoder.

Del 3

For å kunne sammenligne Named-objekter, f. eks. for å sortere en kontaktliste, kan du lage en klasse kalt 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 alfabetisk 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 en String med en annen alfabetisk.

Merk: Underveis i denne oppgaven skal det skrives testkode som bruker Collections.sort-metoden på en ArrayList<Named>, 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:

  1. 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.
  2. JExercise-tillegget må være installert. Installer tillegget fra følgende oppdateringsadresse: http://folk.ntnu.no/hal/dev/updatesite.
  3. Åpne JExercise-panelet via Window -> Show View -> Other, og navigere deg fram til JExercise i vinduet som kommer opp, velge det og klikke OK.
  4. Klikke og dra oppgavens testklasse, <oppgavenavn>Test.java fra pakkeoversikten og slippe den i JExercise panelet. 
  5. 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.

Unknown macro: {html}

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>

  • No labels