...
Code Block |
---|
package interfaces; public/* 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.
Exercise-panelet
Bruk av Exercise-panelet er obligatorisk for denne øvingen. Du må ha panelet åpent med StringGrid.ex-filen (tests > interfaces > StringGrid.ex) i før du begynner med oppgaven. For mer informasjon/hjelp, se nederst på forrige side, altså hovedsiden for Øving 6.
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. Det er imidlertid nødvendig å implementere en konstruktør som tilsvarer den JExercise-testen forventer:
- StringGridImpl(int rows, int columnCount) - konstruktør som tar inn antall rader som rows og antall kolonner som columnCount.
Du . Du står fritt til å velge hvordan metodene definert av grensesnittet skal implementeres så lenge den de tilfredsstiller den definerte oppførselen. To mulige løsninger for representasjon av rutenettet er Hint: Bruk en enkel ArrayList<String> eller en dobbel ArrayList<ArrayList<String>> der den ytre listen er radene og de indre kolonnene. Wikisiden om todimensjonale matriser kan være lurt å ta en titt på før du går i gang hvis du velger sistnevnte rutenettrepresentasjon. Dersom getElement(int, int)- eller setElement(int, int, String)-metodene kalles med ulovlige verdier for rad eller kolonne (i.e. de er utenfor rutenettet), skal en IllegalArgumentException kastes (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. For å kunne gjøre dette skal vi nå lage en iteratorklasse for StringGrid-grensesnittI denne deloppgaven skal du lage en slik Iterator-implementasjon, kalt StringGridIterator. Denne klassen må implementere grensesnittet Iterator<String>, ha et felt for et objekt av typen StringGrid og støtte metodene definert av grensesnittet ved å iterere gjennom dette objektet. For å kunne velge om en vil iterere over rutenettet bortover først (rowMajor=true) eller nedover først (rowMajor=false) må du også ha et felt boolean rowMajor som holder styr på hvordan rutenettet skal itereressiden 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 boolsk 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 strenger String-objekter igjen i StringGrid-objektet som ikke enda ennå er blitt iterert over (i.emao. sjekk om du har kommet til siste rute i rutenettet).
String next() - returnerer den det neste strengen String-objektet i rutenettet. Hvilken streng String som er den neste til å bli returnert , avhenger av hvordan rutenettet skal itereres (i.emao. om rowMajor=true eller rowMajor=false).
void remove() - denne metoden skal bare kaste utløse et unntak av typen UnsupportedOperationException siden det ikke skal være mulig å fjerne strenger fra rutenettet.
...
String-objekter fra rutenettet.
Del 3 -
...
Som en siste utvidelse, ønsker vi nå å gjøre StringGrid-grensesnittet itererbart. Ved å legge til extends Iterable<String> bak grensesnittnavnet StringGrid tvinger vi alle klasser som implementerer gresesnittet til også å være itererbare. Da skal det være mulig å iterere over implementerede klasse, f.eks. StringGridImpl-klassen du lagde i Del 1, ved å spørre Iterator-objektet om neste streng i rutenettet. Dette modifiserte grensesnittet (som arver fra Iterable<String>), kalt StringGridIterable, er vist i kodeblokken under:
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.
Code Block |
---|
StringGrid stringGrid = ... // her initialiseres stringGrid
// gå gjennom alle elementene i stringGrid
for (String s: stringGrid) {
// gjør noe med s her
} |
Code Block |
---|
package interfaces;
public interface StringGridIterable extends Iterable<String> {
public int getRowCount();
public int getColumnCount();
public String getElement(int row, int column);
public void setElement(int row, int column, String element);
} |
Code Block |
---|
public Iterator<String> iterator() |
som returnerer et Iterator<String>-objekt som skal kunne spørres om neste streng i rutenettet for iterasjon. Du skal nå lage en siste klasse StringGridIterableImpl, hvor du kopierer koden fra StringGridImpl, men skal implementere grensesnittet StringGridIterable i stedet for StringGrid. Dette betyr i praksis at du bare trenger å legge til implementasjon av iterator()-metoden beskrevet over i StringGridIterableImpl-klassen. Her kan det være lurt å ta i bruk StringGridIterator-klassen du laget i Del 2 av denne oppgaven.
JExercise-testkode for del 1 og del 2 finner du her: interfaces/StringGridTest.java. Originalkoden (jextest) for testen finner du her: interfaces/StringGrid.jextestInclude Page | ||||
---|---|---|---|---|
|