For å kunne stave ord over en dårlig kommunikasjonslinje er det vanlig å bruke et ord-basert alfabet, hvor første bokstav i ordet tilsvarer bokstaven som sies. Nato har standardisert dette i sitt fonetiske alfabet, som begynner med ”alfa”, ”bravo”, ”charlie”, ”delta”, ”echo”, ”foxtrot”. Dersom ordet ”java” staves med dette alfabetet blir det ”juliet alfa viktor alfa”. Du skal implementere en klasse RadioAlphabet for å konvertere bokstaver og ord vha. denne teknikken. Du velger selv hvordan alfabetet representeres, f.eks. kan en String, String-tabell, List eller Map brukes for å representere alfabetet. Merk at det kan være lurt å lese gjennom hele oppgaven og ta en titt på oppgave 5, før du velger mellom en av disse og evt. andre alternativer. Oppgave a)Først skal du implementere én konstruktør og to metoder, som følger: Konstruktøren skal ta inn ordene i alfabetet som en String og en String som inneholder skilletegnet. Merk at ordene trenger ikke være i alfabetisk rekkefølge, fordi første bokstav i ordet avgjør hvilken bokstav det tilsvarer. F.eks. skal new RadioAlphabet(”alfa-bravo-delta-charlie”, ”-”) gi et objekt som kan oversette bokstavene ’a’-’d’ med Nato-alfabetet. Alfabetet skal kun kunne inneholde ord for bokstaver (altså ikke tall og skilletegn).
Expand |
---|
| Det enkleste er å bruke List/ArrayList eller en Map/HashMap, siden disse har dynamisk størrelse. En Map gir kanskje aller enklest kode (litt mer kompleks konstruktør), men her vises en løsning som bruker List. Lista inneholder kun alfabet-ordene og koden utnytter at første bokstav i ordet er nettopp bokstaven som ordet er oversettelsen av. Det gis 4 poeng for en fornuftig datarepresentasjon og helhetlig bruk av den, 2 for konstruktøren, 1 for hver av converts og convert(char) og 2 for convert(String). Det trekkes poeng dersom kode gjentas, f.eks. for finne posisjonen til et ord i tabellen/lista. Split bør være kjent og gir en enklere konstruktør. Arrays.asList er mindre kjent, så en løkke for å legge til ord er greit. Merk hvordan pos-metoden, som finner hvor ordet for en bokstav er, brukes av flere av de andre metodene. I convert-metoden kan man bruke String +=, StringBuilder.append eller StringBuffer.append. Merk at det kreves egen logikk for å unngå unødvendige blanke tegn, foran inni eller i slutten av String’en. Siden en bokstav ikke nødvendigvis kan oversettes, er det ikke nok å sjekke indeksen for å avgjøre om det skal legges inn mellomrom. Her løses det delvis med en if, delvis med String.trim. Code Block |
---|
public class RadioAlphabet {
private List<String> alphabet;
public RadioAlphabet(String alphabet, String separator) {
this.alphabet = new ArrayList<String>(Arrays.asList(alphabet.split(separator)));
}
private int pos(char c) {
for (int i = 0; i < alphabet.size(); i++) {
if (alphabet.get(i).charAt(0) == c) {
return i;
}
}
return -1;
}
public boolean converts(char c) {
return pos(c) >= 0;
}
public String convert(char c) {
int pos = pos(c);
return pos >= 0 ? alphabet.get(pos) : null;
}
public String convert(String word) {
StringBuffer /* or StringBuilder */ buffer = new StringBuffer();
for (int i = 0; i < word.length(); i++) {
String converted = convert(word.charAt(i));
if (converted != null) {
buffer.append(converted);
buffer.append(' ');
}
}
return buffer.toString().trim();
}
} |
|
Oppgave b)Hvorfor kan ikke disse metodene være deklarert med static-modifikatoren? Expand |
---|
| Med static-modifikatoren vil metodene ikke kunne referere til et bestemt RadioAlphabet-objekt. En kan for så vidt gjøre alfabetet static også, men da vil en bare kunne ha ett globalt alfabet. |
Oppgave c)Hva kalles det når metoder i samme klasse (som convert-metodene) har samme navn? Hva er regelen for å skille dem fra hverandre/velge mellom dem, når de brukes/kalles? Expand |
---|
| At metoder i en klasse kan ha samme navn kalles ”overloading”. For å avgjøre hvilken som skal kalles, brukes de deklarerte typene til argumentene (ikke returverdien). Merk at dette er noe annet enn polymorfi, som handler om at subklasser kan ha ulike implementasjoner av metoder definert i en felles superklasse. |
Oppgave d)Utvid klassen med metodene setWord(String) som endrer ordet som brukes for en bestemt bokstav (første bokstav i ordet), og removeWord(char) som fjerner ordet for en bestemt bokstav fra alfabetet. Merk at setWord skal kun kunne endre ordet for en bokstav som allerede finnes i alfabetet. Expand |
---|
| Her brukes pos-metoden som også ble brukt av convert(char). Merk at setWord ikke skal legge inn et nytt ord, kun erstatte et eksistererende. Code Block |
---|
| public void setWord(String word) {
int pos = pos(word.charAt(0));
if (pos >= 0) {
alphabet.set(pos, word);
}
}
public void removeWord(char c) {
int pos = pos(c);
if (pos >= 0) {
alphabet.remove(pos);
}
} |
Det gis 5 poeng for riktige løsninger. Det trekkes 1 poeng dersom setWord legger til ord. Det trekkes poeng dersom kode gjentas, f.eks. for finne posisjonen til et ord i tabellen/lista. |
|