1   import java.io.*;
2   import fi.jyu.mit.ohj2.*;
3   /**
4    * Ohjelma lukee tiedostoa tuotteet.dat, joka on muotoa:
5    * <pre>
6    *   Volvo |  12300 | 1
7    *   Audi  |  55700 | 2
8    *   Saab  |   1500 | 4
9    *   Volvo | 123400 | 1
10   * </pre>
11   * Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden
12   * yhteishinnat ja kappalemäärät sekä koko varaston yhteishinnan
13   * ja kappalemäärän.  Eli em. tiedostosta tulostetaan:
14   * <pre>
15   * -------------------------------------------
16   * Volvo                 135700    2
17   * Audi                  111400    2
18   * Saab                    6000    4
19   * -------------------------------------------
20   * Yhteensä              253100    8
21   * -------------------------------------------
22   *</pre>
23   * @author Vesa Lappalainen
24   * @version 1.0, 09.03.2003
25   */
26  public class LueTRek {
27  
28    /****************************************************************************/
29    /**
30     * Luokka yhden tuotteen tiedoille.
31     */
32    static public class Tuote {
33      private String nimike = "";
34      private double hinta = 0.0;
35      private int kpl = 0;
36  
37      public Tuote() {}
38      public Tuote(String rivi) {
39        try {
40          parse(rivi);
41        } catch (NumberFormatException ex) {
42        }
43      }
44  
45      public void parse(String s) throws NumberFormatException {
46        StringBuffer sb = new StringBuffer(s);
47        nimike = Mjonot.erotaEx(sb,'|',nimike);
48        hinta  = Mjonot.erotaEx(sb,'|',hinta);
49        kpl    = Mjonot.erotaEx(sb,'|',kpl);
50      }
51  
52      public String toPrintString() {
53        return Mjonot.fmt(nimike,-20) + " " + Mjonot.fmt(hinta,7,0) +
54               Mjonot.fmt(kpl,4);
55      }
56  
57      public void ynnaa(Tuote tuote) {
58        hinta += tuote.hinta * tuote.kpl;
59        kpl   += tuote.kpl;
60      }
61  
62      public String getNimike() { return nimike; }
63      public void setNimike(String nimike) { this.nimike = nimike; }
64  
65    }
66  
67    /****************************************************************************/
68    /**
69     * Luokka joka säilyttää kunkin ero tuotteen yhteissumman ja lukumäär'n
70     * sekä kaikkien tuotteiden yhteissumman ja lukumäärän
71     */
72    static public class Tuotteet {
73      private String nimi = "";
74      private int lkm;
75      private Tuote alkiot[];
76      private Tuote yhteensa = new Tuote("Yhteensä");
77  
78      public Tuotteet(String nimi) {
79        this.nimi = nimi;
80        alkiot = new Tuote[10];
81      }
82  
83      public int etsi(String tnimi) {
84        for (int i=0; i<lkm; i++)
85          if ( alkiot[i].getNimike().equalsIgnoreCase(tnimi) ) return i;
86        return -1;
87      }
88  
89      public int lisaa(String tnimi) {
90        if ( alkiot.length <= lkm ) return -1;
91        alkiot[lkm] = new Tuote(tnimi);
92        return lkm++;
93      }
94  
95      public boolean ynnaa(Tuote tuote) {
96        if ( tuote.getNimike().equals("") ) return false;
97        int i = etsi(tuote.getNimike());
98        if ( i < 0 ) i = lisaa(tuote.getNimike());
99        if ( i < 0 ) return false;
100 
101       alkiot[i].ynnaa(tuote);
102       yhteensa.ynnaa(tuote);
103       return true;
104     }
105 
106 
107     public boolean lue() {
108       BufferedReader fi = Tiedosto.avaa_lukemista_varten("tuotteet.dat");
109       if ( fi == null ) return false;
110 
111       try {
112         String rivi;  Tuote tuote = new Tuote();
113         while ( ( rivi = fi.readLine() ) != null ) {
114           try {
115             tuote.parse(rivi);
116             ynnaa(tuote);
117           } catch (NumberFormatException ex) {
118             System.err.println("Rivillä jotakin pielessä " + rivi + "  " +
119                                 ex.getMessage());
120             continue;
121           }
122         }
123       } catch (IOException ex) {
124         System.err.println("Vikaa tiedostoa luettaessa");
125       } finally {
126         try {
127           fi.close();
128         } catch (IOException ex) {
129           System.err.println("Ongelmia tiedoston sulkemisessa");
130         }
131       }
132 
133       return true;
134     }
135 
136     public void tulosta(OutputStream os) {
137       PrintStream out = Tiedosto.getPrintStream(os);
138 
139       out.println(); out.println(); out.println();
140       out.println("-------------------------------------------");
141 
142       for (int i=0; i<lkm; i++)
143         out.println(alkiot[i].toPrintString());
144 
145       out.println("-------------------------------------------");
146       out.println(yhteensa.toPrintString());
147       out.println("-------------------------------------------");
148       out.println(); System.out.println(); System.out.println();
149     }
150 
151   }
152 
153   /****************************************************************************/
154   public static void main(String[] args)  {
155     Tuotteet varasto = new Tuotteet("tuotteet.dat");
156     if ( !varasto.lue() ) {
157       System.err.println("Tuotteita ei saada luetuksi");
158       return;
159     }
160     varasto.tulosta(System.out);
161   }
162 }
163 
164