Ohjelmointitekniikka (Java) - harjoitukset 2, 28.1.-1.2.

  1. Selvitä seuraavat Java-kokoelmatyyppeihin liittyvät kysymykset:
    1. Javan Collections Framework -kirjasto perustuu paljolti rajapintaluokkiin ja polymorfismiin. Kirjaston arkkitehtuurin tavoitteena on ollut tietorakenneluokkien yleiskäyttöisyys ja toisaalta tietrakenteiden käyttämisen samanlaisuus konkreettisesta toteutustietorakenteesta riippumatta. Luonnostele hieman yksityiskohtaisemmin, miten tämä on toteutettu. Selitä myös, mitä hyötyjä tällaisesta tietorakennekirjaston rakenteesta on ohjelmistotuotannossa. Onko siitä mahdollisesti myös haittoja?
    2. Collections Framework -kirjasto jakautuu kahteen tietorakenteiden päätyyppiin. Mitkä ne ovat? Mitkä ovat näiden tyyppien oleelliset erot? Missä suhteissa ne ovat samanlaisia?
    3. Voiko ArrayList-olioon tallentaa int-arvoja? Miten voi tai miksi ei voi? Miten alkeistyyppien (int, long, double, float, boolean, ...) arvoja tallennetaan kokoelmiin? Mitä on autoboxing?
    4. Mikä konkreettinen kokoelmaluokka soveltuu mukavasti seuraavien tietorakenteiden toteuttamiseen: pino, jono, pakka (=deque = double-ended queue). Ohjelmoi tätä rakennetta käyttäen oma toteutus pakalle luokkana Pakka, jonka operaatiot ovat lisääAlkuun, poistaAlusta, lisääLoppuun, poistaLopusta, isEmpty ja size. Vihje geneerisyyden ohjelmointiin:
         public class Pakka <E> { ...
            ... E ... 
            // täällä E:tä voi käyttää kenttien, muuttujien ja 
            // metodien tyyppinä, antaa parametriksi luotaville 
            // kokoelmaolioille, jne., jne, ...
      

  2. Selvitä seuraavat Java-kokoelmaluokkiin liittyvät kysymykset:
    1. Missä tietorakenteissa sama alkio voi olla useampaan kuin yhteen kertaan?
    2. Missä suhteessa luokat ArrayList ja LinkedList ovat samanlaiset? Missä suhteessa ne eroavat toisistaan?
    3. Missä suhteessa luokat HashSet ja TreeSet ovat samanlaiset? Missä suhteessa ne eroavat toisistaan?
    4. Mikä on pääasiallinen ero luokkien Set ja Map välillä? Mikä on Comparator ja miten sitä käytetään kokoelmatyyppien yhteydessä? Toteuta konkreettinen ohjelmaesimerkki.

  3. Olkoon muuttuja commands määritelty seuraavasti:
       List <String> commands = new ArrayList <String> ();
    
    Sovitaan myös, että sille on asetettu String-merkkijonot indekseihin 0-10.
    1. Miten korvaat indeksin 5 tarkoittaman merkkijonon merkkijonoksi "exit" muuttamatta muiden indeksien osoittamia merkkijonoja?
    2. Miten lisäät rakenteeseen indeksin 5 kohdalle merkkijonon "goto" siten, ettei rakenteesta poisteta yhtään merkkijonoa?
    3. Kirjoita lauseet, jotka tulostavat kaikki commands-muuttujan sisältämät alkiot.
    4. Voiko set- ja add-metodien indeksiparametri olla mikä tahansa kokonaisluku? Onko tilanteessa
         commands.set (index1, "stop");
         commands.add (index2, "halt"); 
      
      olemassa sellaisia index1:n arvoja, jotka eivät kelpaa index2:n arvoiksi? Entä onko olemassa sellaisia index2:n arvoja, jotka eivät kelpaa index1:n arvoiksi?

  4. Selvitä seuraavat iteraattoreihin liittyvät kysymykset:
    1. Tietorakenne on joukko tietoalkioita oganisoituina jollakin periaatteella sekä joukko operaatioita alkioiden tutkimiseen ja muuttamiseen. Selitä miksi Java-kokoelmissa tarvitaan erillisiä iteraattoriolioita tietorakenteen alkioiden käsittelyyn. Mikseivät tietorakenteiden omat operaatiot riitä?
    2. Millä kokoelmien tietorakenneluokilla on metodi Iterator <E>-olion luontiin Millä kokoelmien tietorakenneluokilla on metodi ListIterator <E>-olion luontiin Joillakin tietorakenteilla ei ole iteraattoreita. Aiheuttaako tämä puute joitakin ongelmia? Anna esimerkkejä.
    3. Kun jonkin metodin on määrä käydä läpi syystä tai toisesta jonkin kokoelman alkiioita, metodille voi antaa parametrina joko kokoelmaluokan ilmentymän itsensä tai vain tuon ilmentymän iteraattorin. Kumpi on parempi tapa? Miksi? Jos parempi löytyi, onko tilanteita, joissa "huonompi" silti on parempi?
    4. Kirjoita seuraava for-each-toisto tavallisena for-toistona:
         for (Double element : numberList) 
            System.out.println (element + "");