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.
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
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; }
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]
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; }
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:
public DNA(String ketju)
public String toString()
public int pituus()
public boolean kuuluu()
public DNA vaarinpain()
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
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); } }
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:
public int compareTo(DNA toinen)
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.
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);
Esittele lyhyesti Javan tietorakenteet ArrayList ja TreeSet. Mainitse molemmista tietorakenteista jokin hyvä puoli ja jokin huono puoli.
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.