| Tasot.java |
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