I denne oppgaven tar vi utgangspunkt i et StringGrid-grensesnitt som definerer metodene til et rutenett som holder strenger. Et rutenett er firkantet og består av et antall rader og kolonner. Det skal være mulig å spørre rutenettet hvilken streng som er på angitt rad og kolonne i tillegg til å endre strengen på angitt rad og kolonne. Denne oppførselen er oppsummert i det definerte StringGrid-grensesnittet under:
package interfaces; /* An interface with methods for managing the content of a String grid. The grid has a number of rows (the grid's height) and columns (the grid's width). In each cell in the grid there is a String that can be set with the setElement method and read with the getElement method. */ public interface StringGrid { // Returns the number of rows in this StringGrid public int getRowCount(); // Returns the number of columns in this StringGrid public int getColumnCount(); // Returns the String at the given row and column. Throws an IllegalArgumentException if the row or column is out of range public String getElement(int row, int column); // Sets the String at the given row and column. Throws an IllegalArgumentException if the row or column is out of range public void setElement(int row, int column, String element); }
Alle klasser som implementerer StringGrid-grensesnittet må støtte de fire definerte metodene.
Del 1 - StringGrid-grensesnitt og implementerende StringGridImpl-klasse
Lag en StringGridImpl-klasse som implementerer StringGrid-grensesnittet definert over. Merk at grensesnitt ikke kan brukes til å spesifisere konstruktører, så du må selv definere en eller flere egnede konstruktører.
Du står fritt til å velge hvordan metodene definert av grensesnittet skal implementeres så lenge de tilfredsstiller den definerte oppførselen. Hint: Bruk en enkel ArrayList<String> eller en dobbel ArrayList<ArrayList<String>> (se wiki-siden om todimensjonale matriser).
Del 2 - StringGridIterator-klasse
Det er hensiktmessig å kunne iterere over alle elementene i et rutenett som implementerer grensesnittet StringGrid, f.eks. når en bygger en streng i en toString()-metode eller skal sjekke om et spill har blitt avsluttet / vunnet. I denne deloppgaven skal du lage en slik Iterator-implementasjon, kalt StringGridIterator. Denne klassen må implementere grensesnittet Iterator<String>, siden StringGrid inneholder String-objekter. I tillegg til metodene som er definert i Iterator-grensesnittet, må StringGridIterator ha en konstruktør som tar imot hvilken StringGrid det skal itereres over og i hvilken rekkefølge elementene skal returneres i. Disse verdiene må huskes, så koden i Iterator-metodene kan brukes dem til å styre iterasjonen. StringGridIterator-klassen må altså støtte følgende konstruktør / metoder:
- StringGridIterator(StringGrid, boolean) - konstruktør som tar inn StringGrid-objektet som StringGridIterator-klassen skal iterere over i tillegg til en logisk verdi som angir om iterasjonen skal være bortover først (rowMajor=true) eller nedover først (rowMajor=false).
boolean hasNext() - returnerer true så lenge det er flere String-objekter igjen i StringGrid-objektet som ikke ennå er blitt iterert over (mao. sjekk om du har kommet til siste rute i rutenettet).
String next() - returnerer det neste String-objektet i rutenettet. Hvilken String som er den neste, avhenger av hvordan rutenettet skal itereres (mao. om rowMajor=true eller rowMajor=false).
void remove() - denne metoden skal bare kaste et unntak av typen UnsupportedOperationException siden det ikke skal være mulig å fjerne String-objekter fra rutenettet.
Del 3 - Iterable-grensesnittet
Endre StringGrid-grensesnittet slik at det utvider (med extends) Iterable<String>. Dette skal gjøre det mulig å skrive for-setningen under, for å gå gjennom alle elementene i rutenettet.
StringGrid stringGrid = ... // her initialiseres stringGrid // gå gjennom alle elementene i stringGrid for (String s: stringGrid) { // gjør noe med s her }
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>