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