Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Code Block
package interfaces;

public interface StringGrid 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);
}

Legg merke til at StringGrid-grensesnittet arver fra (extends) Iterable<String>-klassen hvilket betyr at det skal være mulig å iterere over klassen ved å spørre Iterator-objektet om neste streng i rutenettetAlle klasser som implementerer StringGrid-grensesnittet må støtte de fire definerte metodene.

Del 1 - StringGrid-grensesnitt og implementerende StringGridImpl-klasse

 Lag Lag en StringGridImpl-klasse som implementerer StringGrid-grensesnittet . Denne klassen må støtte alle metodene som er definert i grensesnittet i tillegg til metoden 

 

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 definert over. Du står fritt til å velge hvordan metodene definert av grensesnittet skal implementeres så lenge den tilfredsstiller den definerte oppførselen. To mulige løsninger for representasjon av rutenettet er 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. 

Del 2 - StringGridIterator-klasse

Iterator-objektet som returneres av iterator()-metoden i StringGridImpl-klassen itererer over StringGridImpl-klassen på én bestemt måte. Det er hensiktmessig å kunne iterere over 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-grensesnitt, 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) skal du nå lage en StringGridIterator-klasse som implementerer grensesnittet Iterator<String>. Den må må du også ha et felt boolean rowMajor som holder styr på hvordan rutenettet skal itereres. 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 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 igjen i StringGrid-objektet som ikke enda er blitt iterert over (i.e. sjekk om du har kommet til siste rute i rutenettet).

  • String next() - returnerer den neste strengen i rutenettet. Hvilken streng som er den neste til å bli returnert avhenger av hvordan rutenettet skal itereres (i.e. 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 strenger fra rutenettet.

Iterator-objektet som returneres av iterator()-metoden i StringGridImpl-klassen itererer over StringGridImpl-klassen på én bestemt måte.

Del 3 - StringGridIterable-grensesnitt og implementerende StringGridIterableImpl-klasse

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:

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);
}
Klasser som implementerer StringGridIterable-grensesnittet må nå støtte alle metodene som er definert i grensesnittet i tillegg til metoden 

 

Code Block
public Iterator<String> iterator()

som returnerer et Iterator<String>-objekt som skal kunne spørres om neste streng i rutenettet for iterasjon. 

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

...