| Harrastukset.java |
1 package kerho;
2
3 import java.util.*;
4
5 /**
6 * Kerhon harrastukset, joka osaa mm. lisätä uuden harrastuksen
7 *
8 * @author Vesa Lappalainen
9 * @version 1.0, 22.02.2003
10 */
11 public class Harrastukset implements Iterable<Harrastus> {
12 // private boolean muutettu = false;
13 private String tiedostonNimi = "";
14 private String bakNimi = "";
15 private String kokoNimi = "";
16
17 /**
18 * Taulukko harrastuksista
19 */
20 private final Collection<Harrastus> alkiot = new ArrayList<Harrastus>();
21
22
23 /**
24 * Harrastusten alustaminen
25 */
26 public Harrastukset() {
27 // toistaiseksi ei tarvitse tehdä mitään
28 }
29
30
31 /**
32 * Lisää uuden harrastuksen tietorakenteeseen. Ottaa harrastuksen omistukseensa.
33 * @param har lisättävä harrastus. Huom tietorakenne muuttuu omistajaksi
34 */
35 public void lisaa(Harrastus har) {
36 alkiot.add(har);
37 }
38
39
40 /**
41 * Lukee jäsenistön tiedostosta. Kesken.
42 * @param tied tiedoston nimen alkuosa
43 * @throws SailoException jos lukeminen epäonnistuu
44 */
45 public void lueTiedostosta(String tied) throws SailoException {
46 tiedostonNimi = tied + ".har";
47 kokoNimi = "Kelmien kerho";
48 }
49
50
51 /**
52 * Tallentaa jäsenistön tiedostoon. Kesken.
53 * @throws SailoException jos talletus epäonnistuu
54 */
55 public void talleta() throws SailoException {
56 // TODO: täydennä lukeminen
57 }
58
59
60 /**
61 * Palauttaa Kerhon koko nimen
62 * @return Kerhon koko nimi merkkijononna
63 */
64 public String getKokoNimi() { return kokoNimi; }
65
66
67 /**
68 * Palauttaa kerhon harrastusten lukumäärän
69 * @return harrastusten lukumäärä
70 */
71 public int getLkm() { return alkiot.size(); }
72
73
74 /**
75 * Palauttaa tiedoston nimen, jota käytetään tallennukseen
76 * @return tallennustiedoston nimi
77 */
78 public String getTiedostonNimi() { return tiedostonNimi; }
79
80
81 /**
82 * Palauttaa varakopiotiedoston nimen
83 * @return varakopiotiedoston nimi
84 */
85 public String getBakNimi() { return bakNimi; }
86
87
88 /**
89 * Tekee nykyisestä tiedostosta varakopiotiedoston. Kesken.
90 * @param bak_tark tarkennin varakopioiedostoille
91 * @return onnistuiko (true) vai ei (false)
92 */
93 public boolean teeBak(String bak_tark) { bakNimi = bak_tark; return true; }
94
95
96 /**
97 * Iteraattori kaikkien harrastusten läpikäymiseen
98 * @return harrastusiteraattori
99 *
100 * @example
101 * <pre name="test">
102 * #PACKAGEIMPORT
103 * #import java.util.*;
104 *
105 * Harrastukset harrasteet = new Harrastukset();
106 * Harrastus pitsi21 = new Harrastus(2); harrasteet.lisaa(pitsi21);
107 * Harrastus pitsi11 = new Harrastus(1); harrasteet.lisaa(pitsi11);
108 * Harrastus pitsi22 = new Harrastus(2); harrasteet.lisaa(pitsi22);
109 * Harrastus pitsi12 = new Harrastus(1); harrasteet.lisaa(pitsi12);
110 * Harrastus pitsi23 = new Harrastus(2); harrasteet.lisaa(pitsi23);
111 *
112 * Iterator<Harrastus> i2=harrasteet.iterator();
113 * i2.next() === pitsi21;
114 * i2.next() === pitsi11;
115 * i2.next() === pitsi22;
116 * i2.next() === pitsi12;
117 * i2.next() === pitsi23;
118 * i2.next() === pitsi12; #THROWS NoSuchElementException
119 *
120 * int n = 0;
121 * int jnrot[] = {2,1,2,1,2};
122 *
123 * for ( Harrastus har:harrasteet ) {
124 * har.getJasenNro() === jnrot[n]; n++;
125 * }
126 *
127 * n === 5;
128 *
129 * </pre>
130 */
131 public Iterator<Harrastus> iterator() {
132 return alkiot.iterator();
133 }
134
135
136 /**
137 * Luokka tietyn jäsen harrastusten iteroimiseksi
138 *
139 * @example
140 * <pre name="test">
141 * #PACKAGEIMPORT
142 * #import java.util.*;
143 *
144 * Harrastukset harrasteet = new Harrastukset();
145 * Harrastus pitsi21 = new Harrastus(2); harrasteet.lisaa(pitsi21);
146 * Harrastus pitsi11 = new Harrastus(1); harrasteet.lisaa(pitsi11);
147 * Harrastus pitsi22 = new Harrastus(2); harrasteet.lisaa(pitsi22);
148 * Harrastus pitsi12 = new Harrastus(1); harrasteet.lisaa(pitsi12);
149 * Harrastus pitsi23 = new Harrastus(2); harrasteet.lisaa(pitsi23);
150 * Harrastus pitsi51 = new Harrastus(5); harrasteet.lisaa(pitsi51);
151 *
152 * Iterator<Harrastus> i2=harrasteet.iterator(2);
153 * i2.next() === pitsi21;
154 * i2.next() === pitsi22;
155 * i2.next() === pitsi23;
156 * i2.next() === pitsi12; #THROWS NoSuchElementException
157 *
158 * int n = 0;
159 * for (Iterator<Harrastus> i = harrasteet.iterator(2); i.hasNext(); ) {
160 * i.next().getJasenNro() === 2; n++;
161 * }
162 *
163 * n === 3;
164 *
165 * Iterator<Harrastus> i3=harrasteet.iterator(3);
166 * i3.hasNext() === false;
167 * i3.next() === pitsi12; #THROWS NoSuchElementException
168 *
169 * Iterator<Harrastus> i4=harrasteet.iterator(4);
170 * i4.next() === pitsi12; #THROWS NoSuchElementException
171 *
172 * Iterator<Harrastus> i5=harrasteet.iterator(5);
173 * i5.next() === pitsi51;
174 * i5.next() === pitsi51; #THROWS NoSuchElementException
175 * </pre>
176 *
177 * @example
178 * <pre name="test">
179 * // Testataan erikoistapauksia
180 * Harrastukset harrasteet = new Harrastukset();
181 * Iterator<Harrastus> i;
182 *
183 * i = harrasteet.iterator(2); // Iteroidaan tyhjään joukoon
184 * i.next() === null; #THROWS NoSuchElementException
185 * i = harrasteet.iterator(2);
186 * i.hasNext() === false;
187 *
188 * Harrastus pitsi21 = new Harrastus(2); harrasteet.lisaa(pitsi21);
189 * i = harrasteet.iterator(1); // Iteroidaan harrastusta jota ei ole
190 * i.next() === null; #THROWS NoSuchElementException
191 * i = harrasteet.iterator(1);
192 * i.hasNext() === false;
193 *
194 * i = harrasteet.iterator(2); // Iteroidaan 1. olevaa
195 * i.next() === pitsi21;
196 * i.next() === null; #THROWS NoSuchElementException
197 *
198 * i = harrasteet.iterator(2); // Iteroidaan 1. olevaa hasNext():in kanssa
199 * i.hasNext() === true; // hasNext ekalla kertaa
200 * i.next() === pitsi21;
201 * i.hasNext() === false;
202 * i.next() === null; #THROWS NoSuchElementException
203 *
204 * Harrastus pitsi31 = new Harrastus(3); harrasteet.lisaa(pitsi31);
205 * i = harrasteet.iterator(1); // Iteroidaan 2. alkion joukosta olematonta
206 * i.next() === null; #THROWS NoSuchElementException
207 * i = harrasteet.iterator(1); // Kokeillaan olematonta hasNext():in kanssa
208 * i.hasNext() === false;
209 *
210 * i = harrasteet.iterator(2); // Iteroidaan ei viimeisenä olevaa
211 * i.next() === pitsi21;
212 * i.next() === null; #THROWS NoSuchElementException
213 *
214 * i = harrasteet.iterator(2); // 1. hasNext():in avulla
215 * i.hasNext() === true;
216 * i.next() === pitsi21;
217 * i.hasNext() === false;
218 * i.next() === null; #THROWS NoSuchElementException
219 *
220 * i=harrasteet.iterator(3); // Iteroidaan viimeisenä olevaa
221 * i.hasNext() === true;
222 * i.next() === pitsi31;
223 * i.hasNext() === false;
224 * // i.next() === null; #THROWS NoSuchElementException // NOPMD ei tykkää
225 * </pre>
226 */
227 public class HarrastuksetIterator implements Iterator<Harrastus> {
228 private final int jasenNro;
229 private final Iterator<Harrastus> iter = alkiot.iterator();
230 private Harrastus har;
231
232
233 /**
234 * Alustetaan iteraattori käymään läpi tietyn jäsenen harrastukset
235 * @param vnro viitenumero jäseneen
236 */
237 public HarrastuksetIterator(int vnro) {
238 jasenNro = vnro;
239 }
240
241
242 /**
243 * Tutkitaan onko vielä halutun jäsenen harrastuksia jäljellä.
244 * @return true jos jäsenen harrastuksia on vielä
245 * @see java.util.Iterator#hasNext()
246 */
247 public boolean hasNext() {
248 while ( true ) {
249 har = null; // NOPMD: tarkoituksella null
250 if ( !iter.hasNext() ) return false;
251 har = iter.next();
252 if ( har.getJasenNro()== jasenNro ) return true;
253 }
254 }
255
256
257 /**
258 * Palautetaan jäsenen seuraava harrastus.
259 * @return jäsenen seuraava harrastus
260 * @throws NoSuchElementException jos harrastuksia ei enää ole
261 * @see java.util.Iterator#next()
262 */
263 public Harrastus next() throws NoSuchElementException {
264 if ( har != null ) {
265 Harrastus pal = har;
266 har = null; // NOPMD: tarkoituksella null
267 return pal;
268 }
269 while ( true ) {
270 Harrastus har = iter.next();
271 if ( har.getJasenNro() == jasenNro ) return har;
272 }
273 }
274
275
276 /**
277 * Tuhoamista ei ole toteutettu
278 * @throws UnsupportedOperationException aina
279 * @see java.util.Iterator#remove()
280 */
281 public void remove() throws UnsupportedOperationException {
282 throw new UnsupportedOperationException("Me ei poisteta");
283 }
284
285 }
286
287
288 /**
289 * Palautetaan tietyn jäsenen harrastuksia käsittelevä iteraattori
290 * @param vnro tutkittavan jäsenen viitenumero
291 * @return valitun jäsenen harrastusten iteraattori
292 */
293 public Iterator<Harrastus> iterator(int vnro) {
294 return new HarrastuksetIterator(vnro);
295 }
296
297
298 /**
299 * Testiohjelma harrastuksille
300 * @param args ei käytössä
301 */
302 public static void main(String[] args) {
303 Harrastukset harrasteet = new Harrastukset();
304 Harrastus pitsi1 = new Harrastus();
305 pitsi1.vastaaPitsinNyplays(2);
306 Harrastus pitsi2 = new Harrastus();
307 pitsi2.vastaaPitsinNyplays(1);
308 Harrastus pitsi3 = new Harrastus();
309 pitsi3.vastaaPitsinNyplays(2);
310 Harrastus pitsi4 = new Harrastus();
311 pitsi4.vastaaPitsinNyplays(2);
312
313 harrasteet.lisaa(pitsi1);
314 harrasteet.lisaa(pitsi2);
315 harrasteet.lisaa(pitsi3);
316 harrasteet.lisaa(pitsi2);
317 harrasteet.lisaa(pitsi4);
318
319 System.out.println("============= Harrastukset testi =================");
320
321 { // Testataan toimiiko iteraattori ilman hasNextiä
322 Iterator<Harrastus> i2=harrasteet.iterator(2);
323 Harrastus har = i2.next();
324 System.out.print(har.getJasenNro() + " ");
325 har.tulosta(System.out);
326 har = i2.next();
327 System.out.print(har.getJasenNro() + " ");
328 har.tulosta(System.out);
329 har = i2.next();
330 System.out.print(har.getJasenNro() + " ");
331 har.tulosta(System.out);
332 }
333
334 for (Iterator<Harrastus> i=harrasteet.iterator(2); i.hasNext(); ) {
335 Harrastus har = i.next();
336 System.out.print(har.getJasenNro() + " ");
337 har.tulosta(System.out);
338 }
339
340 }
341
342 }
343
344
345