1 Merkkien ja merkkijonojen käsittelyä Javalla char String Merkkijonon lukeminen käyttäjältä String-luokan metodeja matches-metodi ja esimerkkejä säännöllisistä lausekkeista (engl. regular expressions) 1 char char on tietotyyppi, jota käytetään yhden merkin käsittelyyn char kirjain = 'k'; Merkkejä vertaillaan operaattoreilla (!=, ==) if (kirjain == 'k') { 2
2 String String luokan avulla käsitellään merkkijonoja. Luokasta voidaan luoda muuttujia ja vakioita. String teksti, nayttaminen; final String OTSIKKO = "Ohjelmointi Javalla"; Merkkijonojen käsittelyyn käytetään String-luokan metodeja Merkkijonoja ei vertailla operaattorella (==,!=, >, <). Merkkijonojen vertailuun käytetään metodia if (nayttaminen.equals("pienellä")) tai if (nayttaminen.equalsignorecase("pienellä")) merkkijono, jota vertaillaan vertailumetodi merkkijono, johon vertaillaan 3 public static void main(string[] args) { String teksti, nayttaminen; Scanner input = new Scanner(System.in); Tee ohjelma, jolla voidaan valita, näytetäänkö annettu teksti suurilla vai pienillä kirjaimilla. System.out.print("Kirjoita teksti: "); teksti = input.nextline(); System.out.print("Näytetäänkä suurella vai pienellä: "); nayttaminen = input.nextline(); if (nayttaminen.equals("pienellä")) { teksti = teksti.tolowercase(); else if (nayttaminen.equals("suurella")) { teksti = teksti.touppercase(); System.out.println("Teksti on " + teksti); verrataan, onko merkkijono sama kuin "pienellä" muunnetaan merkkijono pienellä tai suurella kirjoitetuksi 4
3 Merkkijonon lukeminen käyttäjältä Luetaan syöttöpuskurista käyttäjän antama merkkijono String nimi; Scanner input = new Scanner(System.in); System.out.print("Anna nimesi: "); nimi = input.nextline(); Luetaan konsolista koko rivi merkkejä ja rivinvaihto String etunimi, sukunimi; Scanner input = new Scanner(System.in); System.out.print("Anna etu- ja sukunimesi: "); etunimi = input.next(); sukunimi = input.nextline(); Luetaan konsolista yksi sana Luetaan konsolista toinen sana ja rivinvaihto Luetaan syöttöpuskurista luku ja sen jälkeen merkkijono nextlinemetodilla nextint, nextdouble, next jättävät syöttöpuskuriin rivinvaihdon jos syöttöpuskursita ei lueta rivinvaihtoa pois, nextline-metodilla luetusta merkkijonosta tulee tyhjä, sillä nextline lopettaa lukemisen rivinvaihtoon int ika; String nimi; Scanner input = new Scanner(System.in); System.out.print("Anna ikäsi: "); ika = input.nextint(); input.nextline(); System.out.print("Anna nimesi: "); nimi = input.nextline(); Ratkaisu: otetaan konsoliin jäänyt rivinvaihto pois 6
4 String-luokan metodeja mitä metodi palauttaa metodin nimi metodin parametrit eli mitä metodille viedään tietona boolean equals(string str) Vertailee kahta merkkijonoa. Isot ja pienet kirjaimet ovat merkitseviä. String vastaus; if (vastaus.equals("kyllä")) => tutkitaan, onko vastaus-muuttujan sisältönä "kyllä, isot ja pienet kirjaimet ovat merkitseviä merkkijono, mille metodia kutsutaan metodin nimi metodin parametri (teksti "kyllä") 7 boolean equalsignorecase(string str) String trim() int length() Vertailee kahta merkkijonoa. Isot ja pienet kirjaimet eivät ole merkitseviä. String vastaus; if (vastaus.equalsignorecase("kyllä")) => tutkitaan, onko vastaus-muuttujan sisältönä "kyllä, isot ja pienet kirjaimet eivät ole merkitseviä Poistaa tyhjät merkit merkkijonon alusta ja lopusta. String nimi = " Matti "; nimi = nimi.trim(); => nimi-muuttujan sisällöksi tulee "Matti" Palauttaa merkkijonon pituuden. String otsikko = "Merkkijono"; int pituus = otsikko.length(); => otsikko-muuttujan sisältönä olevien merkkien määrä => pituus-muuttujan arvoksi tulee 10
5 String touppercase() String tolowerecase() char charat(int index) int indexof(string str) Muuntaa merkkijonon suurella kirjoitetuksi. String nimi = "matti"; nimi = nimi.touppercase(); => nimi-muuttujan sisällöksi tulee "MATTI" Muuntaa merkkijonon pienellä kirjoitetuksi. nimi = nimi.tolowercase(); => nimi-muuttujan sisällöksi tulee "matti" Paluttaa index-kohdassa olevan merkin. Ensimmäinen merkki on indeksillä 0. String nimi = "matti"; char eka = nimi.charat(0); => eka-muuttujan sisällöksi tulee 'm' Palauttaa parametrina olevan merkkijonon alkamisen merkkijonossa tai -1, jos merkkijonoa ei ole. Ensimmäinen merkki on indeksillä 0. String teksti = "Opi Javaa"; int paikka = teksti.indexof("java"); => paikka on 4, koska teksti "Java" alkaa kohdasta 4 tekstissä "Opi Javaa" paikka = teksti.indexof("c++"); => paikka on -1, koska tekstiä "C++" ei ole merkkijonossa "Opi Javaa" int indexof(string str, int alku) String substring(int alku) String substring(int alku, int loppu) Palauttaa parametrina olevan merkkijonon alkamisen merkkijonossa tai -1, jos merkkijonoa ei ole. Merkkijonoa etsitään parametrina annetusta alkukohdasta lähtien. String teksti = "Opi Javaa"; int paikka = teksti.indexof("java", 5); => paikka on -1, koska kohdasta 5 lähtien ei ole tekstiä "Java. Kohdasta 5 lähtien on teksti "avaa" Palauttaa osamerkkijonon kohdasta alku lähtien. String osa = teksti.substring(4); => osa on "Javaa" Palauttaa osamerkkijonon kohdasta alku lähtien kohtaan loppu-1 saakka String osa = teksti.substring(4,6); => osa on "Ja" 10
6 matches-metodi ja esimerkkejä säännöllisistä lausekkeista matches-metodia käytetään merkkijonon sisällön tutkimiseen. Sillä voidaan tarkastaa, että merkkijono on halutun sisältöinen esim. merkkijono vastaa hetua, päivämäärää tai lukua. boolean matches(string regular_expression) Palauttaa true, jos merkkijono noudattaa annettua säännöllistä lauseketta ja false, jos ei noudata. String hetu = "2412190-123C"; if (hetu.matches("\\d{6[a+-]\\d{3[a-z0-9]")) => Yllä palauttaa true, sillä hetu merkkijono noudattaa matches-metodille annettua sääntöä Malli Esimerkki Käyttöesim. \d{1,3 21 ikä \d{1,10(\.\d{2)? 12.95 hinta [A-ZÅÄÖa-zåäö-]{2,30 Helsinki paikkakunta \d{2\.\d{2\.\d{4 24.12.1990 päivämäärä \d{6[a+-]\d{3[a-z0-9] 241290-123A hetu! matches metodissa kauttaviivojen eteen \ eli \d => \\d 11 Malleja Malli \d Numero \D Muu kuin numero \w Kirjain, numero tai alaviiva \W Muu kuin kirjain, numero tai alaviiva \s White space (eli välilyönti, rivinvaihto tai tabulaattori) \S Muu kuin white space a Merkki a. Mikä tahansa merkki paitsi ei rivinvaihto [] Mikä tahansa hakasulkujen sisällä oleva merkki [^] Merkki, joka ei kuulu hakasulkujen sisällä olevaan merkkijoukkoon 12
7 Lukumääriä Malli * 0-n + 1-n? 0-1 {n {n, {,m {n,m Tasan n Vähintään n Korkeintaan m Vähintään n, korkeintaan m Vaihtoehto () Ryhmittely \ Merkin erikoismerkityksen poisto esim. \. tarkoittaa pistettä,. tarkoittaa mitä tahansa merkkiä 13 Ohjelma kysyy käyttäjältä päivämäärän muodossa kk-pp-vvvv. Jos päivämäärä on oikeaa muotoa, se muunnetaan muotoon pp.kk.vvvv. System.out.print("Anna päivämäärä muodossa kk-pp-vvvv: "); String paivamaara = input.nextline(); tutkitaan, onko annettu päivämäärä haluttua muotoa if (paivamaara.matches("\\d{2-\\d{2-\\d{4")) { String kk = paivamaara.substring(0, 2); String pp = paivamaara.substring(3, 5); String vv = paivamaara.substring(6); otetaan merkkijonosta osamerkkijonoja System.out.println("Päivämäärä on suomalaisessa muodossa " + pp + "." + kk + "." + vv); else { System.out.println("Päivämäärä ei ole muotoa kk-pp-vvvv"); 14