Andmete sisestamine


Andmete lugemine käsurealt

Java rakenduse käivitamisel saab käsureale klassi nime taha kirjutada programmile edastatavaid andmeid.

Näit.        java Euclid 15 6

Käivitatakse Java rakendus Euclid.class, millele antakse ette parameetrid 15 ja 6.

Vastavaks formaalseks parameetriks, mille kaudu informatsioon programmile teatavaks tehakse, on main-meetodi signatuuris olev sõnemassiiv (String[] ). Selle massiivi esimene element vastab esimesele sõnale (antud näites "15"), teine teisele ("6") jne. Tuleb arvestada, et käsurea parameetrid on sõned, s.t. kui meile on vajalikud näiteks arvud, siis me peame rakendama tüübiteisendust sõnest arvuks.

   public static void main (String[] param) {
      int m=15;
      int n=6;
      if (param.length > 1) {
         m=Integer.parseInt (param [0]);
         n=Integer.parseInt (param [1]);
      }
      System.out.println ("SYT (" + m + ", " + n
         + ") = " + syt (m, n));

   } // main


Andmete lugemine dialoogis kasutajaga

D. Ecki õpikus Introduction to Programming Using Java. http://math.hws.edu/javanotes/    on klass TextIO, mille abil on lihtne lugeda andmeid dialoogis kasutajaga. Andmete lugemiseks tuleb pöörduda vastava nimega klassimeetodi poole, mis tagastab vastavat tüüpi väärtuse.

byte b = TextIO.getlnByte();

short k = TextIO.getlnShort();

int i = TextIO.getlnInt();

long l = TextIO.getlnLong();

float f = TextIO.getlnFloat();

double d = TextIO.getlnDouble();

boolean t = TextIO.getlnBoolean();

char c = TextIO.getlnChar();

String s = TextIO.getlnWord();

On olemas ka vastavad meetodid (nende nimes puudub "ln"), mis loevad sisendi ühest reast järjest, s.t. uus lugemine ei toimu uuest reast.
Näiteks sümbolikaupa lugemiseks saab kasutada TextIO.getChar() jne.

Näide:

      double d = 0.;
do {
TextIO.put ("Sisesta positiivne arv ");
d = TextIO.getlnDouble();
} while (d <= 0.);


.

Tuleb olla pisut ettevaatlik, sest need meetodid ei anna reeglina veateateid, vaid lõikavad rea "arusaamatu"  lõpuosa lihtsalt ära.



Java standardvahendite kasutamine on suhteliselt kohmakas. Näiteks rea teksti lugemine dialoogis käib nii:

              import  java.io.*;
....
      try {
         BufferedReader sisse = new BufferedReader
                      (new InputStreamReader (System.in))
;
         System.out.print ("Anna tekst: ");
         String s = sisse.readLine(); // rida teksti ka"es
         System.out.println ("Tippisid: " + s);
      }
      catch (IOException e) {
         System.out.println ("S/V viga: " + e);
      }
.....


Sõned

Objektide hulgas on olulisel kohal sõned (stringid), millega seotud töötlusprogramme leiab klassidest java.lang.String ja java.lang.StringBuffer (ka java.lang.StringBuilder), sõne "hakkimiseks" on hea java.util.StringTokenizer. Sümbolite tasemel töötlusvahendeid leiab mähisklassist java.lang.Character.

Klass StringBuffer on ette nähtud sõnede töötlemiseks, kui on tarvis vahetulemusi salvestada. Kui me näiteks lisame sõnele ühekaupa juurde sümboleid, siis kasutades ainult klassi String vahendeid tekib suurel hulgal erinevaid sõnesid (iga vahetulemus on uus objekt), seda olukorda ei teki sõnepuhvri kasutamise korral.


Sõnetüüpi konstandid kirjutatakse jutumärkide vahele, erisümbolid varjestatakse langjoone abil:
"See on yks rida \n ja see on juba teine rida"

Näide. Loetleda sümbolite 'a' arv etteantud sõnes.


   public static int adeArv (String s) {
      int result = 0;
      if (s != null) {
         for (int i=0; i<s.length(); i++) {
            if (s.charAt (i) == 'a') result++;
         }
      }
      return result;
   } // adeArv


.

Näide. Moodustada sõne järjestikustest tähtedest  'a' kuni 'z'.

      StringBuffer puhver = new StringBuffer();

      for (char c = 'a'; c <= 'z'; c++)
         puhver.append (c);

      String tulemus = puhver.toString();

.


Meetod signatuuriga String toString() on Java klasside üks olulisemaid  isendimeetodeid (umbes niisama olulised on equals, clone, compareTo, ...), mis määrab objekti stringesituse (sisuliselt trükikuju, mida kasutab näiteks print-meetod). Kui te soovite, et teie poolt loodud klassi objektidel oleks "mõistlik" trükikuju, siis realiseerige see toString-meetodi kaudu.

String-klassi klassimeetod valueOf aitab teisendada algtüüpi väärtusi sõneks:

double d = TextIO.getlnDouble();
String arvTekstina = String.valueOf (d);

Vastupidised teisendused leiduvad algtüübile vastavate mähisklasside juures:

double d1 = Double.parseDouble (arvTekstina);


Näide. Sõnade sagedustabeli moodustamine (analüüsime põhjalikumalt hiljem).



import java.util.*;

public class Sagedused {

   public static void main (String[] arg) {
     
      Hashtable stabel = leiaSagedused (arg);
      Object [] om = stabel.keySet().toArray();
      Arrays.sort (om);
      for (int i=0; i<om.length; i++) {
         String sona = (String)om[i];
         int sagedus = ((Integer)stabel.get (sona)).intValue();
         System.out.println (sona + " " + String.valueOf (sagedus));
      }
   } // main

   public static Hashtable leiaSagedused (String[] t) {
      Hashtable result = new Hashtable();
      for (int i=0; i<t.length; i++) {
         StringTokenizer st = new StringTokenizer (t[i]);
         while (st.hasMoreTokens()) {
            String word = st.nextToken();
            if (result.containsKey (word)) {
               int k = ((Integer)result.get (word)).intValue();
               result.put (word, new Integer (k+1));
            } else {
               result.put (word, new Integer (1));
            }
         }
      }
      return result;
   } // leiaSagedused

} // Sagedused




Jaanus Pöial