Seuraavaksi kirjoitamme ohjelman, jossa tulee esiin varsin yleinen ongelma: tietueen etsiminen joukosta. Kirjoitamme edellisiä esimerkkejä vastaavan ohjelman, jossa tavallisen tulostuksen sijasta tulostetaan kunkin tuoteluokan yhteistilanne.
import java.io.*;
import fi.jyu.mit.ohj2.*;
/**
* Ohjelma lukee tiedostoa tuotteet.dat, joka on muotoa:
* <pre>
* Volvo | 12300 | 1
* Audi | 55700 | 2
* Saab | 1500 | 4
* Volvo | 123400 | 1
* </pre>
* Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden
* yhteishinnat ja kappalemäärät sekä koko varaston yhteishinnan
* ja kappalemäärän. Eli em. tiedostosta tulostetaan:
* <pre>
* -------------------------------------------
* Volvo 135700 2
* Audi 111400 2
* Saab 6000 4
* -------------------------------------------
* Yhteensä 253100 8
* -------------------------------------------
*</pre>
* @author Vesa Lappalainen
* @version 1.0, 09.03.2003
*/
public class LueTRek {
/****************************************************************************/
/**
* Luokka yhden tuotteen tiedoille.
*/
static public class Tuote {
private String nimike = "";
private double hinta = 0.0;
private int kpl = 0;
public Tuote() {}
public Tuote(String rivi) {
try {
parse(rivi);
} catch (NumberFormatException ex) {
}
}
public void parse(String s) throws NumberFormatException {
StringBuffer sb = new StringBuffer(s);
nimike = Mjonot.erotaEx(sb,'|',nimike);
hinta = Mjonot.erotaEx(sb,'|',hinta);
kpl = Mjonot.erotaEx(sb,'|',kpl);
}
public String toPrintString() {
return Mjonot.fmt(nimike,-20) + " " + Mjonot.fmt(hinta,7,0) +
Mjonot.fmt(kpl,4);
}
public void ynnaa(Tuote tuote) {
hinta += tuote.hinta * tuote.kpl;
kpl += tuote.kpl;
}
public String getNimike() { return nimike; }
public void setNimike(String nimike) { this.nimike = nimike; }
}
/****************************************************************************/
/**
* Luokka joka säilyttää kunkin ero tuotteen yhteissumman ja lukumäär'n
* sekä kaikkien tuotteiden yhteissumman ja lukumäärän
*/
static public class Tuotteet {
private String nimi = "";
private int lkm;
private Tuote alkiot[];
private Tuote yhteensa = new Tuote("Yhteensä");
public Tuotteet(String nimi) {
this.nimi = nimi;
alkiot = new Tuote[10];
}
public int etsi(String tnimi) {
for (int i=0; i<lkm; i++)
if ( alkiot[i].getNimike().equalsIgnoreCase(tnimi) ) return i;
return -1;
}
public int lisaa(String tnimi) {
if ( alkiot.length <= lkm ) return -1;
alkiot[lkm] = new Tuote(tnimi);
return lkm++;
}
public boolean ynnaa(Tuote tuote) {
if ( tuote.getNimike().equals("") ) return false;
int i = etsi(tuote.getNimike());
if ( i < 0 ) i = lisaa(tuote.getNimike());
if ( i < 0 ) return false;
alkiot[i].ynnaa(tuote);
yhteensa.ynnaa(tuote);
return true;
}
public boolean lue() {
BufferedReader fi = Tiedosto.avaa_lukemista_varten("tuotteet.dat");
if ( fi == null ) return false;
try {
String rivi; Tuote tuote = new Tuote();
while ( ( rivi = fi.readLine() ) != null ) {
try {
tuote.parse(rivi);
ynnaa(tuote);
} catch (NumberFormatException ex) {
System.err.println("Rivillä jotakin pielessä " + rivi + " " +
ex.getMessage());
continue;
}
}
} catch (IOException ex) {
System.err.println("Vikaa tiedostoa luettaessa");
} finally {
try {
fi.close();
} catch (IOException ex) {
System.err.println("Ongelmia tiedoston sulkemisessa");
}
}
return true;
}
public void tulosta(OutputStream os) {
PrintStream out = Tiedosto.getPrintStream(os);
out.println(); out.println(); out.println();
out.println("-------------------------------------------");
for (int i=0; i<lkm; i++)
out.println(alkiot[i].toPrintString());
out.println("-------------------------------------------");
out.println(yhteensa.toPrintString());
out.println("-------------------------------------------");
out.println(); System.out.println(); System.out.println();
}
}
/****************************************************************************/
public static void main(String[] args) {
Tuotteet varasto = new Tuotteet("tuotteet.dat");
if ( !varasto.lue() ) {
System.err.println("Tuotteita ei saada luetuksi");
return;
}
varasto.tulosta(System.out);
}
}
|
|
|
|
... Mittakaava ja matka>1:10000 10 cm[RET] Matka maastossa on 1.00 km. Mittakaava ja matka>1:200000 20[RET] Matka maastossa on 4.00 km. Mittakaava ja matka>loppu[RET] Kiitos!
... Mittakaava ja matka>1:10000 10 cm[RET] Matka maastossa on 1.00 km. Mittakaava ja matka>0.20 dm[RET] Matka maastossa on 0.20 km. Mittakaava ja matka>loppu[RET] Kiitos!