8. Merkkijonot

Merkkijono ja merkki

Merkkijonon tietotyyppi String on tullut tutuksi jo aiemmissa luvuissa. Tämän lisäksi Javassa on tietotyyppi char, joka vastaa yhtä merkkiä. Seuraava koodi määrittelee ja tulostaa char-muuttujan:

char merkki = 'A';
System.out.println(merkki);

Ohjelman tulostus on seuraava:

A

Erona String-muuttujaan verrattuna char-muuttujassa on aina tasan yksi merkki, joka kirjoitetaan heittomerkkien (') sisään.

Merkkijonon koostumus

Merkkijonoon liittyvät seuraavat tärkeät komennot:

Esimerkiksi merkkijono "testi" on muistissa seuraavasti:

kohta01234
merkkitesti

Seuraava ohjelma esittelee komentojen käyttöä:

System.out.print("Anna merkkijono: ");
String merkkijono = input.nextLine();

int pituus = merkkijono.length();
System.out.println("Pituus: " + pituus);

char eka = merkkijono.charAt(0);
System.out.println("1. merkki: " + eka);
char kolmas = merkkijono.charAt(2);
System.out.println("3. merkki: " + kolmas);

System.out.println("Kaikki merkit:");
for (int i = 0; i < merkkijono.length(); i++) {
    char merkki = merkkijono.charAt(i);
    System.out.println("Kohdassa " + i + " on merkki " + merkki);
}

Ohjelman tulostus voi olla seuraava:

Anna merkkijono: testi
Pituus: 5
1. merkki: t
3. merkki: s
Kaikki merkit:
Kohdassa 0 on merkki t
Kohdassa 1 on merkki e
Kohdassa 2 on merkki s
Kohdassa 3 on merkki t
Kohdassa 4 on merkki i

Osa merkkijonosta

Komennolla substring pystyy erottamaan osan merkkijonosta. Komentoa voi käyttää kahdella tavalla:

Seuraavassa esimerkissä merkkijono on muistissa näin:

kohta012345 678
merkkiesimer kki

Erotetaan merkkijonosta kaksi osaa:

String merkkijono = "esimerkki";
String osa1 = merkkijono.substring(3);
System.out.println(osa1);
String osa2 = merkkijono.substring(2, 7);
System.out.println(osa2);

Ohjelman tulostus on seuraava:

merkki
imerk

Huomaa komennon erikoinen toiminta, kun lopetuskohta annetaan: viimeinen mukaan tuleva merkki on yksi merkki ennen lopetuskohtaa!

Haku merkkijonosta

Komento indexOf etsii kohdan, jossa merkkijonon osana on tietty merkki tai merkkijono. Jos kohtia on useita, komento kertoo ensimmäisen kohdan. Jos yhtään kohtaa ei ole, komento tuottaa arvon -1.

Seuraava ohjelma hakee merkkijonosta "esimerkki" käyttäjän antamaa merkkijonoa.

String merkkijono = "esimerkki";
System.out.print("Anna haettava merkkijono: ");
String haettava = input.nextLine();
int kohta = merkkijono.indexOf(haettava);
if (kohta == -1) {
    System.out.println("Haettavaa merkkijonoa ei ole");
} else {
    System.out.println("Haettava merkkijono alkaa kohdassa " + kohta);
}

Esimerkkitulostuksia:

Anna haettava merkkijono: merkki
Haettava merkkijono alkaa kohdassa 3
Anna haettava merkkijono: testi
Haettavaa merkkijonoa ei ole

Merkkikoodit

Javassa jokaista merkkiä vastaa merkkikoodi, joka on kokonaisluku. Esimerkiksi merkkiä 'A' vastaa merkkikoodi 65. Niinpä char-arvolla on kaksi vaihtoehtoista merkintätapaa: merkkiesitys ja koodiesitys.

Seuraavassa taulukossa on osa Javan merkistöstä merkkikoodeineen:

 33  !    34  "    35  #    36  $    37  %    38  &    39  '    40  (    41  )
 42  *    43  +    44  ,    45  -    46  .    47  /    48  0    49  1    50  2
 51  3    52  4    53  5    54  6    55  7    56  8    57  9    58  :    59  ;
 60  <    61  =    62  >    63  ?    64  @    65  A    66  B    67  C    68  D
 69  E    70  F    71  G    72  H    73  I    74  J    75  K    76  L    77  M
 78  N    79  O    80  P    81  Q    82  R    83  S    84  T    85  U    86  V
 87  W    88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _
 96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g   104  h
105  i   106  j   107  k   108  l   109  m   110  n   111  o   112  p   113  q
114  r   115  s   116  t   117  u   118  v   119  w   120  x   121  y   122  z

Merkin merkkikoodin saa selville näin:

char merkki = 'A';
System.out.println("Merkkikoodi: " + (int)merkki);

Vastaavasti merkkikoodin merkin saa selville näin:

int koodi = 65;
System.out.println("Merkki: " + (char)koodi);

Seuraava koodi tulostaa kirjaimet väliltä A–Z:

for (char i = 'A'; i <= 'Z'; i++) {
    System.out.print(i);
}
System.out.println();

Ohjelman tulostus on seuraava:

ABCDEFGHIJKLMNOPQRSTUVWXYZ

Kuten tästä esimerkistä havaitaan, char-arvoja voi käsitellä hyvin samalla tavalla kuin lukuarvoja.