1   package hirsipuu;
2   
3   import java.io.BufferedReader;
4   import java.io.FileNotFoundException;
5   import java.io.FileReader;
6   import java.io.IOException;
7   import java.util.*;
8   
9   /**
10   * Luokka tasojen kokoelman mallintamiseksi. Tasot osaa palauttaa pyydetyn lukum????r??n
11   * tasoja tulostettavana merkkijonona sek?? lukea tietonsa tiedostosta tasot.dat.
12   * @author Anna-Leena Latvala, Toni Purontaka
13   * @version 0.9, 22.4.2008
14   *
15   */
16  public class Tasot {
17  
18      private Map<Integer,Taso> tasot = new TreeMap<Integer,Taso>();
19      private final static String POLKU = "tasot.dat";
20          
21      
22      /**
23       * Alustaa tasot defaulttitiedostosta.
24       */
25      public Tasot() {
26          lisaaTiedostosta(POLKU);
27      }
28      
29      /**
30       * Alustaa tasot tiedostosta polussa "polku".
31       */
32      public Tasot(String polku) {
33          lisaaTiedostosta(polku);
34      }
35      
36      /**
37       * Lis?? tietorakenteeseen uuden pelaajan.
38       * @param s rivi, josta pelaajan tiedot parsitaan. Jos s alkaa ";", tulkitaan kommentiksi.
39       */
40      private void lisaaTaso(String s) {
41          Taso taso; 
42          if ( s.charAt(0) != ';') {
43               taso = new Taso();
44               taso.parse(s);
45               tasot.put(taso.nro(),taso);  
46            }
47      }
48      
49      /**
50       * Lukee tiedostosta polussa "polku" tasojen tiedot ja luo kokoelman taso-olioita.
51       * Tiedostosta on l?ydytt?v? taso 1 ja kaikki tasot sen ja suurimman numeron v?lilt?;
52       * mik?li tiedosto on ep?kelpo, heitet??n poikkeus
53       * (tai ainakin tullaan my?hemmin heitt?m??n!)
54       * 
55       * @example
56       * <pre name="test">
57       * #THROWS IOException
58       * #import java.io.IOException;
59       * #import fi.jyu.mit.ohj2.VertaaTiedosto;
60       *  VertaaTiedosto.kirjoitaTiedosto("testitasoja.txt",
61       *      "1 | kissoja\n"+
62       *      "2 | koiria\n"+
63       *      "3 | hevosia");
64       *  String tulos ="(1) kissoja\n(2) koiria\n(3) hevosia\n";  
65       *  Tasot tasot = new Tasot("testitasoja.txt");
66       *  tasot.tulostus(3) === tulos;
67       *  VertaaTiedosto.tuhoaTiedosto("testitasoja.txt");
68       * </pre>
69       *
70       */
71      public final void lisaaTiedostosta(String polku) {
72          BufferedReader fi;
73          int yhteensa = koko(); //tutkitaan, ett? tasoihin ei j?? aukkoja
74          
75          try {  //aukaistaan lukija
76            fi = new BufferedReader(new FileReader(polku));
77          } catch (FileNotFoundException ex) {
78            System.err.println("Tiedosto " + polku + " ei aukea!");
79            return;
80          }        
81                 
82          try {
83            String s;
84            while ( ( s = fi.readLine() ) != null) {
85             lisaaTaso(s);
86             }
87           
88            for (int i=1; i<yhteensa; i++) {
89                if (!tasot.containsKey(i)) System.err.println("Huono tasotiedosto!"); //TODO: t?nne poikkeusta heittelem??n
90            }
91           
92          } catch (IOException ex) {
93            System.err.println("Virhe tiedostoa luettaessa!");
94            
95          } finally {  // suljetaan tietovirta
96            try {
97              fi.close(); 
98            } catch (IOException ex) {
99              System.err.println("Tiedostoa ei saa suljettua!");
100           }
101         }
102       }
103         
104     /**
105      * Palauttaa tasoa vastaaavan vihjesanan / aihealueen, jos taso on olemassa.
106      * Muutoin palauttaa null.
107      * @param taso pyydetyn tason numero
108      * @return tason aihealue merkkijonona
109      */   
110     public String annaVihje(int taso) {
111         if (tasot.containsKey(taso)) return tasot.get(taso).kuvaus();
112         return null;
113     }
114         
115     /**
116      * Palauttaa merkkijonona n ensimm?isen tason tiedot, tai jos n on suurempi kuin
117      * tasojen m??r?, niin palautetaan kaikki tasot.
118      * @param n tulosteeseen sis?llytett?vien tasojen lkm
119      * @return merkkijono, jossa tasojen tiedot rivitettyn?.
120      * 
121      * @example
122      * <pre name="test">
123      * Tasot kokoelma = new Tasot();
124      * kokoelma.tulostus(2) === "(1) El?imet\n(2) Alkuaineet\n";  
125      * </pre>
126      */
127     public String tulostus(int n) {
128         String tuloste = "";
129         int i = 1;
130         while (i<=n && tasot.containsKey(i)) {
131             tuloste = tuloste + tasot.get(i).toString() + "\n";
132             i++;
133         }
134         return tuloste;
135     }
136     
137     /**
138      * Antaa tasojen lukum??r?n.
139      * @return tasojen lukum??r?n
140      * 
141      * @example
142      * <pre name="test">
143      * Tasot kokoelma = new Tasot();
144      * kokoelma.koko() === 2;  
145      * </pre>
146      */
147     public int koko(){
148         int i=1,tasojenlkm=0;
149         while(tasot.containsKey(i)){
150             i++;
151             tasojenlkm++; 
152         }
153         return tasojenlkm;
154     }
155     /**
156      * Testip??ohjelma.
157      * @param args ei k?yt?ss?
158      */
159     public static void main(String[] args) {
160         Tasot tasot = new Tasot();
161         System.out.print(tasot.tulostus(5));
162         System.out.print("Tasoja on "+tasot.koko()+" kpl.");
163     }
164 }
165