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

Compare with Current View Page History

« Previous Version 2 Next »

Denne oppgaven handler om en FeatureList-klasse, som representerer en såkalt feature vector. Dette er enkelt sagt er et sett med ord/navn med hvert sitt tilhørende (desimal)tall.

Bakgrunn

En feature vector (norsk: egenskapsvektor?) knytter et sett med navngitte "dimensjoner" til hvert sitt (desimal)tall, slik at en kombinasjon av egenskaper kan representeres som et punkt i et N-dimensjonalt rom. En slik vektor brukes i mange anvendelser, f.eks. til å representere evner. En figur i et spill kan f.eks. ha tallverdier for kløkt, smidighet, utholdenhet osv., tilsvarende evnevektoren (kløkt: 10, smidighet: 15, utholdenhet: 5). Hvis figuren utfører visse (trenings)oppgaver, så vil evnene endre/utvikle seg. Trikset da er å knytter en tilsvarende evnevektor til oppgaven, så en kan beregne figurens nye evneprofil ved å legge samme de to vektorene: ny evnevektor = gammel evnevektor + oppgavevektor.

Slike vektorer brukes i mange fagområder for klassifisering og beregninger, og i denne oppgaven skal du lage en FeatureList-klasse som representerer og opererer på slike vektorer.

FeatureList-klassen

FeatureList-klassen har en del grunnleggende metoder for å hente ut informasjon om hvilke dimensjoner eller egenskapsnavn og verdier vektoren har. I tillegg har den en del metoder for å endre på innholdet, både legge til dimensjoner og verdier og endre eksisterende verdier:

Grunnleggende metoder:

  • FeatureList() - konstruktøren initialiserer objektet slik at det fra starten er helt tomt, dvs. uten egenskaper (navn og verdier).
  • boolean hasFeature(String featureName) - returnerer true dersom egenskapen (dimensjonen) med det gitt navnet finnes, og false ellers.
  • Collection<String> getFeatureNames() - returnere alle egenskapsnavnene (dimensjonene) på én gang.
  • double getFeatureVaue(String featureName) - returnerer verdien for den angitte egenskapen (dimensjonen). Hvis den angitte egenskapen ikke finnes, så kan programmet enten kræsje (utløse unntak) eller returnere 0.0, som er den (implisitte) verdien for manglende egenskaper.

I tillegg kan det være lurt å lage en toString()-metode, som returnerer en String på formen som er angitt over.

CardDeck-objekter inneholder initielt et visst antall kort av de fire kortfargene S', 'H', 'D' og 'C'. Klassen inneholder standardmetoder for å lese hvor mange og hvilke kort og to metoder for endre tilstand.

Konstruktør:

  • CardDeck(int n) - fyller kortstokken med de n første kortene av hver kortfarge, totalt n * 4 kort, med spar 1 som første kort (indeks nr. 0), spar 2 som andre (nr. 1), spar 3 som tredje (nr. 2), spar 4 som fjerde (nr. 3), ..., hjerter 1 som fjortende (nr. 13), hjerter 2 som femtende (nr. 4) osv. i.e. først alle spar, så hjerter, så ruter og så kløver, alle i stigende rekkefølge. 

Lesemetoder:

  • getCardCount() - returnerer hvor mange Card-objekter som CardDeck-objektet inneholder
  • getCard(int n) - returnerer kort nr. n eller utløser et IllegalArgumentException hvis n ikke er gyldig

Endringsmetoder:

  • deal(CardHand, int n) - flytter n kort fra kortstokken (CardDeck-objektet) til korthånda (CardHand-objektet, som er første argument), ved å ta ett og ett kort med høyeste gyldige indeks, fjerne det fra CardDeck-objektet og legge det til CardHand-objektet
  • shufflePerfectly() - stokker kortstokken ved å dele den i to like store deler og flette de to delene perfekt, slik at kortet på toppen forblir på toppen og kortet på bunnen forblir på bunnen (se http://en.wikipedia.org/wiki/Out_shuffle)

CardHand-objekter inneholder initielt ingen kort, og klassen inneholder de samme standardmetodene som CardDeck, altså getCardCount() og getCard(int), for å lese hvor mange og hvilke kort den inneholder. I tillegg har den to metoder for å endre tilstand:

  • addCard(Card) - legger argumentet til dette CardHand-objektet
  • play(int n) - returnerer og fjerner kort nr. n (første kort har nr. 0) fra dette CardHand-objektet (som om det ble spilt ut)

 

JExercise-testkode for denne oppgaven finner du her: objectstructures/CardTest.java, objectstructures/CardDeckTest.java og objectstructures/CardHandTest.java. jextest-koden finner du her: objectstructures/Card.jextest, objectstructures/CardDeck.jextest og objectstructures/CardHand.jextest.

.ex for bruk med Exercise-panelet finner du her: Card.ex.


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