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

Compare with Current View Page History

« Previous Version 11 Next »

Denne oppgaven hander om to måter å håndtere sortering av Card-objekter, med grensesnittene Comparable og Comparator.

Vi tar i denne oppgaven utgangspunkt i en Card-klassen fra kortoppgaven om objektstrukturer. Et Card-objekt har en kortfarge (av typen char) og verdi (int), og sortering gjøres på disse verdiene, ved at en først sorterer på kortfarge og så på verdi. Siden Java har sortering innebygget, så trenger vi ikke bry oss om selve sorteringsalgoritmen, men fokuserer her på logikken for sammenligning av Card-objekter.

I både del 1 og 2 skal dere skrive testkode som sorterer kort i en liste vha. Collections.sort-metoden og henholdvis Comparable- og Comparator-logikken, så dere ser at det virker som forventet.

Del 1

La Card-klassen implementere Comparable med følgende sammenligningslogikk

  • compareTo-metoden skal sammenligne et kort med et annet, slik at spar vurderes som høyere enn hjerter, hjerter høyere enn ruter og ruter høyere enn kløver. Ved lik kortfarge skal verdien brukes, altså 1 (ess) er mindre enn 2 er mindre enn 3 osv. til og med 11 (knekt), 12 (dame) og 13 (konge).

Del 2

For å kunne sortere Card-objekter med annen logikk, så kan en bruke grensesnittet Comparator, som er et objekt som kan sammenligne objekter parvise. Implementer en Comparator (dvs. lag en klasse som implements Comparator) kalt CardComparator, som kan konfigureres (stilles inn) til å sortere med ess som høyeste kort og med en bestemt kortfarge som trumf, altså en kortfarge som regnes som høyere enn de andre.

  • CardComparator må ha en konstruktør som tar inn en boolean og en char. boolean-argumentet sier om ess skal regnes som størst (true) eller minst (false) og char-argumentet angir hvilke kortfarge som er trumf. F.eks. skal et CardComparator-objekt laget med new CardComparator(true, ' ') rangere ess høyere enn konge og bruke standard rangering av kortfarger (siden trumf-argumentet ikke er en av kortfargene), og et CardComparator-objekt laget med new CardComparator(false, 'C') rangerer ess lavest og kløver ('C' = clubs) høyest av kortfargene (de andre kortfargene har standard rangering med spar over hjerter over ruter).

Ekstraoppgave

Utvid CardComparator slik at den kan konfigureres med en annen rangering av kortfargene, f.eks. slik at kløver er høyere enn ruter. Merk at denne fortsatt skal overstyres av evt. trumf. Nytten er altså at en kan endre rangeringsrekkefølgen på alle på én gang.

 

JExercise-testkode for del 1 og del 2 finner du her: interfaces/CardComparatorTest.java. Originalkoden (jextest) for testen finner du her: interfaces/CardComparator.jextest


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