001    import java.io.*;
002    import fi.jyu.mit.ohj2.*;
003    /**
004     * Ohjelma lukee tiedostoa tuotteet.dat, joka on muotoa:
005     * <pre>
006     *   Volvo |  12300 | 1
007     *   Audi  |  55700 | 2
008     *   Saab  |   1500 | 4
009     *   Volvo | 123400 | 1
010     * </pre>
011     * Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden
012     * yhteishinnat ja kappalemäärät sekä koko varaston yhteishinnan
013     * ja kappalemäärän.  Eli em. tiedostosta tulostetaan:
014     * <pre>
015     * -------------------------------------------
016     * Volvo                 135700    2
017     * Audi                  111400    2
018     * Saab                    6000    4
019     * -------------------------------------------
020     * Yhteensä              253100    8
021     * -------------------------------------------
022     *</pre>
023     * @author Vesa Lappalainen
024     * @version 1.0, 09.03.2003
025     */
026    public class LueTRek {
027    
028      /****************************************************************************/
029      /**
030       * Luokka yhden tuotteen tiedoille.
031       */
032      static public class Tuote {
033        private String nimike = "";
034        private double hinta = 0.0;
035        private int kpl = 0;
036    
037        public Tuote() {}
038        public Tuote(String rivi) {
039          try {
040            parse(rivi);
041          } catch (NumberFormatException ex) {
042          }
043        }
044    
045        public void parse(String s) throws NumberFormatException {
046          StringBuffer sb = new StringBuffer(s);
047          nimike = Mjonot.erotaEx(sb,'|',nimike);
048          hinta  = Mjonot.erotaEx(sb,'|',hinta);
049          kpl    = Mjonot.erotaEx(sb,'|',kpl);
050        }
051    
052        public String toPrintString() {
053          return Mjonot.fmt(nimike,-20) + " " + Mjonot.fmt(hinta,7,0) +
054                 Mjonot.fmt(kpl,4);
055        }
056    
057        public void ynnaa(Tuote tuote) {
058          hinta += tuote.hinta * tuote.kpl;
059          kpl   += tuote.kpl;
060        }
061    
062        public String getNimike() { return nimike; }
063        public void setNimike(String nimike) { this.nimike = nimike; }
064    
065      }
066    
067      /****************************************************************************/
068      /**
069       * Luokka joka säilyttää kunkin ero tuotteen yhteissumman ja lukumäär'n
070       * sekä kaikkien tuotteiden yhteissumman ja lukumäärän
071       */
072      static public class Tuotteet {
073        private String nimi = "";
074        private int lkm;
075        private Tuote alkiot[];
076        private Tuote yhteensa = new Tuote("Yhteensä");
077    
078        public Tuotteet(String nimi) {
079          this.nimi = nimi;
080          alkiot = new Tuote[10];
081        }
082    
083        public int etsi(String tnimi) {
084          for (int i=0; i<lkm; i++)
085            if ( alkiot[i].getNimike().equalsIgnoreCase(tnimi) ) return i;
086          return -1;
087        }
088    
089        public int lisaa(String tnimi) {
090          if ( alkiot.length <= lkm ) return -1;
091          alkiot[lkm] = new Tuote(tnimi);
092          return lkm++;
093        }
094    
095        public boolean ynnaa(Tuote tuote) {
096          if ( tuote.getNimike().equals("") ) return false;
097          int i = etsi(tuote.getNimike());
098          if ( i < 0 ) i = lisaa(tuote.getNimike());
099          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