Takaisin kurssin pääsivulle

Kurssikoe 4.7.

Tällä sivulla ovat kurssikokeen 4.7. tehtävät ratkaisuineen. Tehtävät voi usein ratkaista monella eri tavalla, jotka saattavat poiketa paljonkin malliratkaisuista.

Tehtävä 1

Tee metodi laskeSanat, joka palauttaa parametrina annetussa tiedostossa olevien sanojen määrän. Tiedoston jokaisella rivillä on yksi tai useampi sana. Voit olettaa, että sanat muodostuvat kirjaimista abcdefghijklmnopqrstuwvxyzåäö ja samalla rivillä jokaisen sanan välissä on yksi välilyönti. Metodin määrittelyn tulisi olla seuraava:

public int laskeSanat(String tiedostonimi) {
    ...
}

Seuraava koodi testaa metodin toimintaa:

System.out.println(laskeSanat("sanat.txt"));

Oletetaan, että tiedoston sanat.txt sisältö on seuraava:

apina banaani cembalo
apina
banaani banaani banaani cembalo
cembalo apina

Nyt koodin tulostuksen tulisi olla seuraava:

10

Ratkaisu

public int laskeSanat(String tiedostonimi) {
    int maara = 0;
    try {
        Scanner lukija = new Scanner(new File(tiedostonimi));
        while (lukija.hasNextLine()) {
            String rivi = lukija.nextLine();
            String[] sanat = rivi.split(" ");
            maara += sanat.length;
        }
    } catch (Exception e) {
        System.out.println("Virhe tiedoston lukemisessa!");
    }
    return maara;
}

Tehtävä 2

Merkkijonon alkuosa on merkkijono, joka saadaan ottamalla tietty määrä merkkejä merkkijonon alusta. Esimerkiksi merkkijonon "testi" kaikki alkuosat ovat "t", "te", "tes", "test" ja "testi". Tee metodi haeAlkuosat, joka palauttaa parametrina annetun merkkijonon kaikki alkuosat ArrayList-rakenteessa. Metodin määrittelyn tulisi olla seuraava:

public ArrayList<String> haeAlkuosat(String merkkijono) {
    ...
}

Seuraava koodi testaa metodin toimintaa:

System.out.println(haeAlkuosat("testi"));
System.out.println(haeAlkuosat("Uolevi"));

Koodin tulostuksen tulisi olla seuraava:

[t, te, tes, test, testi]
[U, Uo, Uol, Uole, Uolev, Uolevi]

Ratkaisu

public static ArrayList<String> haeAlkuosat(String merkkijono) {
    ArrayList<String> tulos = new ArrayList<String>();
    String alkuosa = "";
    for (int i = 0; i < merkkijono.length(); i++) {
        alkuosa += merkkijono.charAt(i);
        tulos.add(alkuosa);
    }
    return tulos;
}

Tehtävä 3

Tee luokka DNA, jonka tietosisältönä on DNA-ketjun sisältävä merkkijono. DNA-ketju muodostuu merkeistä A, C, G ja T. Lisää luokkaan seuraavat metodit:

Seuraava koodi testaa luokkaasi:

DNA a = new DNA("GWÄCATAXA");
System.out.println(a);
System.out.println(a.pituus());
System.out.println(a.kuuluu("ATA"));
System.out.println(a.kuuluu("ATC"));
System.out.println(a.vaarinpain());
System.out.println(a.vaarinpain().vaarinpain());

Koodin tulostuksen tulisi olla seuraava:

GCATAA
6
true
false
AATACG
GCATAA

Ratkaisu

public class DNA {
    private String ketju;

    public DNA(String ketju) {
        String tulos = "";
        for (int i = 0; i < ketju.length(); i++) {
            char merkki = ketju.charAt(i);
            if ("ACGT".indexOf(merkki) >= 0) {
                tulos += merkki;
            }
        }
        this.ketju = tulos;
    }

    public String toString() {
        return ketju;
    }

    public int pituus() {
        return ketju.length();
    }

    public boolean kuuluu(String osa) {
        return ketju.contains(osa);
    }

    public DNA vaarinpain() {
        String tulos = "";
        for (int i = 0; i < ketju.length(); i++) {
            tulos = ketju.charAt(i) + tulos;
        }
        return new DNA(tulos);
    }
}

Tehtävä 4

Täydennä luokkaa DNA niin, että se toteuttaa rajapinnan Comparable<DNA>. Sinun ei tarvitse kirjoittaa uudestaan tehtävän 3 koodia, vaan riittää ilmoittaa lisättävät osat. Rajapinnan toteuttaminen vaatii, että luokkaan lisätään seuraava metodi:

Tässä DNA-ketjujen järjestys määritellään niin, että lyhyempi ketju tulee ennen pidempää ketjua. Jos ketjut ovat yhtä pitkiä, järjestyksen ratkaisee aakkosjärjestys. Siis ketju CGT tulee ennen ketjua AGTTAC ja ketju CTTA tulee ennen ketjua GATG.

Tee vielä lyhyt luokkaa DNA käyttävä koodi, joka havainnollistaa, mitä hyötyä rajapinnan Comparable<DNA> toteuttamisesta on.

Ratkaisu

Luokan alkuriviä muutetaan seuraavasti:

public class DNA implements Comparable<DNA> {

Lisäksi luokkaan lisätään seuraava metodi:

    public int compareTo(DNA toinen) {
        if (ketju.length() == toinen.ketju.length()) {
            return ketju.compareTo(toinen.ketju);
        } else {
            return ketju.length() - toinen.ketju.length();
        }
    }

Tämän jälkeen DNA-olioita sisältävän listan voi järjestää seuraavasti:

ArrayList<DNA> lista = new ArrayList<DNA>();
lista.add(new DNA("CGAA"));
lista.add(new DNA("TAA"));
lista.add(new DNA("AAATTA"));
lista.add(new DNA("GAAG"));
Collections.sort(lista);
System.out.println(lista);

Tehtävä 5

Esittele lyhyesti Javan tietorakenteet ArrayList ja TreeSet. Mainitse molemmista tietorakenteista jokin hyvä puoli ja jokin huono puoli.

Ratkaisu

ArrayList on taulukko, jonka koko kasvaa sitä mukaa kuin siihen lisätään uusia alkioita. TreeSet on järjestyksessä oleva joukko.

ArrayList säilyttää alkiot lisäysjärjestyksessä, mutta siitä hakeminen on hidasta. TreeSet ei salli samaa alkiota monta kertaa eikä muista alkioiden lisäysjärjestystä, mutta siitä hakeminen on nopeaa.

Takaisin kurssin pääsivulle