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 typesMiten 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.