Huom: Tehtävät eivät enää muutu, ellei niissä havaita selviä virheitä.
if (indeksi kunnossa) try {
indeksoi taulukkoa; indeksoi taulukkoa;
else }
hoitele virhe; catch (indeksointivirhe) {
hoitele virhe;
}
Onko tällaiselle tyylille käyttöä? On väitetty, että poikkeuksen
sieppaamisesta generoitava koodi olisi hidasta. Tutki onko näin.
Vertaile kokeellisesti if-lauseen ja vastaavan try-catch-lauseen suoritusaikaa.
Voiko tulosten perusteella antaa suosituksia ja ohjeita siitä,
millasissa tilanteissa poikkeuksia kannattaa käyttää, millaisissa hoitaa
virheet toisin?
(Samantapaisia asioita pohdittiin syksyn 2005 Java-kurssilla, katso lukua
5.1 Poikkeuksista, erityisesti esimerkkiä ihan sivun lopussa.)
Object x;
Integer y;
int i;
Selitä miksi seuraavat ovat sallittuja
x = 1;
y = 1;
System.out.println(x);
System.out.println(y);
i = y;
i = (int)y;
i = y.intValue();
x = y;
mutta seuraavat virheellisiä:
i = x; incompatible types
i = (int)x; inconvertible types
i = x.intValue(); cannot find symbol
y = x; incompatible types
Miten x:n arvo saadaan asetettua i:lle ja y:lle?
public class Pino <T> {
private T[] pino;
private int huippu;
public Pino()
...
public void push(T alkio)
...
public T pop()
...
public boolean empty()
...
Laadi myös ohjelma, joka esittelee geneerisen pinon käyttöä
kokonaislukupinona, merkkijonopinona ja vaikkapa Vector-pinona.
Taulukko-olion geneerinen luonti ei onnistu seuraavaan tapaan:
pino = new T[100];Miksi ei? Mikä mättää? Asia voidaan hoitaa mm. seuraavasti:
pino = (T[]) new Object[100];Pohdi miksi? Mistä on kysymys? Kovasti kääntäjä kyllä varoittelee. Mistä ja miksi? Linkkivinkkejä: Java Forums, A. Langer: Arrays in Java Generics
java.util.Set<E>
metodeilla toteutetaan joukko-operaatiot yhdiste,
leikkaus ja erotus.
[Vastauksessa käytettävät metodit: addAll,
retainAll, removeAll]
java.util
on rajapintaluokka
SortedSet<E>, joka laajentaa rajapintaluokkaa
Set<E>.
Miksi pakkauksessa ei ole rajapintaluokkaa
SortedList<E>, joka
laajentaisi rajapintaluokkaa List<E>? Miten
java.util-pakkauksen rajapintaluokkia olisi muutettava, jos
SortedList<E> haluttaisiin mukaan?
[Vastauksen idea: tavallisessa listassa käyttäjä voi lisätä alkion haluamaansa indeksiin, järjestetyssä listassa tämän ei pitäisi olla mahdollista.]
Laadi järjestetyn listan toteuttava luokka, joka toteuttaa
rajapintaluokan
Collection<E>, muttei rajapintaluokkaa
List<E>.
Luokassa
on oltava ainakin parametriton konstruktori sekä konstruktori, jonka
parametrina voidaan antaa järjestyksen määrittelevä
Comparator<T>-tyyppinen olio. Luokan palauttaman
iteraattorin
tulee
palauttaa listan sisältämät oliot järjestyksessä. Käytä luokan
toteutuksessa
hyväksesi java.util-pakkauksen valmisluokkia.
java.lang.Comparable<T>
tai järjestämistä varten voidaan laatia rajapinnan
java.util.Comparator<T>
toteuttava olio. Millaisissa tilanteissa
kannattaisi käyttää mitäkin tapaa ja miksi? Kannattaisiko joskus käyttää
kumpaakin tapaa?
[Mahdollisia pointteja: compareTo-metodeja voi olla vain
yksi
per olio, Comparator-tyyppisiä oliota taas kuinka monta
tahansa.
compareTo-metodin toimintaa ei voi muuttaa kesken kaiken
(tai
voi, muttei saisi...), Comparator-tyyppisen olion taas voi
helposti korvata toisella.]
Selvitä itsellesi rajapintaluokkien SortedSet<E> ja Comparator<T>, Comparable<T> sekä luokan TreeSet<E> käyttö joukkojen toteuttamisessa. Myös muuhun kalustoon voit joutua perehtymään.
Toteuta yksinkertainen sovellus opiskelijatietojen lisäämiseen ja kyselyyn. Tietorakenteena käytetään jotakin joukkoa.
Selitä millaisia vaatimuksia yhtäsuuruus- ja vertailuoperaatioille on asetettu. Miksi?
Laadi yksinkertainen ohjelma tietokilpailujen toteuttamiseen. Yksi tietokilpailu on yksi kysymys-vastausparien joukko. Sovellus luodaan yksinkertaisesti antamalla nuo parit String-taulukkona konstruktorille, esim:
String[] kysymykset = (
"Mikä on hauki?", "Hauki on kala",
"Kuka on Aku?" , "Ankka",
... );
Tietokilpailu visa = new Tietokilpailu(kysymykset);
visa.kysele();
visa.tulokset();
Voit toki hyväksyä oikeiksi vastaukset pienin tai isoin kirjaimin ja
muillakin tavoin viritellä ohjelmaa.
Oleellista tässä tehtävässä on kuitenkin käyttää toteutustietorakenteena
jotakin assosiaatiolistaa. Rajapintaluokka
Map<K,V>
ja sen toteuttajat voivat olla hyödyllistä luettavaa.
Mieti ja selitä, miten ohjelma ja sen käyttö muuttuisivat, jos ainoan konstruktorin otsikko olisikin:
public Tietokilpailu(Map<K,V> kysymykset);
Takaisin harjoitusten pääsivulle.