1   /**
2    * TuntiRekisteri pitää kirjaa työntekijöiden tehdyistä työtunneista.
3    * @author Sami Kosonen
4    * @version 1.0, 9.3.2004
5    */
6   public class TuntiRekisteri {
7   
8     public class TaulukkoTaysiException extends Exception { }
9   
10    private Henkilo henkilot[];
11    private int lkm = 0;
12  
13    /**
14     * Konstruktori.
15     * @param maxAlkioita - kuinka isoksi henkilot-taulu alustetaan
16     */
17    public TuntiRekisteri(int maxAlkioita) {
18      if (maxAlkioita <= 0) maxAlkioita = 1;
19      henkilot = new Henkilo[maxAlkioita];
20    }
21  
22    /**
23     * Lisää rekisteriin uuden henkilön.
24     * Jos rekisterissä on jo saman niminen henkilö, lisäystä ei tehdä.
25     * @param henkilo - lisättävä henkilö
26     * @throws TaulukkoTaysiException - jos taulukkoon ei mahdu uutta henkilöä
27     */
28    public void lisaaHenkilo(Henkilo henkilo) throws TaulukkoTaysiException {
29      if (lkm >= henkilot.length) throw new TaulukkoTaysiException();
30      if (henkilo == null) return;
31      if (etsiHenkilo(henkilo.getNimi()) != null) return;
32      henkilot[lkm] = henkilo;
33      lkm++;
34    }
35    
36    /**
37     * Lisää rekisteriin yhdelle henkilölle työtunnit.
38     * @param nimi - kenelle tunnit lisätään
39     * @param tunnit - montako tuntia lisätään
40     */
41    public void lisaaTunnit(String nimi, int tunnit) {
42      Henkilo henkilo = etsiHenkilo(nimi);
43      if (henkilo == null) return;
44      henkilo.lisaaTunnit(tunnit);
45    }
46  
47    /**
48     * Antaa henkilön työtunnit.
49     * @param nimi - kenenkä työtunnit annetaan
50     * @return työtunnit
51     */
52    public int getTunnit(String nimi) {
53      Henkilo henkilo = etsiHenkilo(nimi);
54      if (henkilo == null) return 0;
55      return henkilo.getTunnit();
56    }
57  
58    /**
59     * Poistaa henkilön rekisteristä.
60     * Algoritmi:
61     * Etsitään taulukon alkio, joka osoittaa poistettavaan henkilöön.
62     * Siirretään taulukon viimeinen alkio poistettavan alkion paikalle.
63     * 
64     * @param nimi - poistettavan henkilön nimi
65     */
66    public void poistaHenkilo(String nimi) {
67      int index = 0;
68      while (index < lkm) {
69        if (henkilot[index].getNimi().equals(nimi)) break;
70        index++;
71      }
72     
73      lkm--;
74      
75      henkilot[index] = henkilot[lkm];
76      henkilot[lkm] = null;
77    }
78  
79    /**
80     * Etsii henkilön.
81     * @param nimi - etsittävän henkilön nimi
82     * @return Jos henkilö löytyy, palautetaan viite kyseiseen henkilöön.
83     *         Jos ei löydy, palautetaan null.
84     */
85    protected Henkilo etsiHenkilo(String nimi) {
86      for (int i = 0; i < lkm; i++){
87        if (henkilot[i].getNimi().equals(nimi)) return henkilot[i];
88      }
89      return null;
90    }
91  
92    /**
93     * Testaa TuntiRekisteri-luokkaa.
94     * @param args komentoriviparametrit
95     */
96    public static void main(String args[]) {
97      TuntiRekisteri rekisteri = new TuntiRekisteri(5);
98  
99      try{
100       rekisteri.lisaaHenkilo(new Henkilo("Marjaana"));
101       rekisteri.lisaaHenkilo(new Henkilo("Liisa"));
102       rekisteri.lisaaHenkilo(new Henkilo("Mikko"));
103 
104       rekisteri.lisaaTunnit("Marjaana", 7);
105       rekisteri.lisaaTunnit("Liisa", 6);
106       rekisteri.lisaaTunnit("Mikko", 9);
107 
108       rekisteri.lisaaTunnit("Marjaana", 5);
109 
110       //Piirrä kuva tästä vaiheesta
111 
112       Henkilo matti = new Henkilo("Matti");
113       rekisteri.lisaaHenkilo(matti);
114       matti = null;
115       rekisteri.lisaaTunnit("Matti", 8);
116 
117       rekisteri.poistaHenkilo("Liisa");
118       matti = new Henkilo("Liisa");
119       rekisteri.lisaaHenkilo(matti);
120 
121       rekisteri.lisaaTunnit("Matti", 8);
122 
123       System.out.println("Matin tunnit: " + rekisteri.getTunnit("Matti"));
124       System.out.println("Liisan tunnit: " + rekisteri.getTunnit("Liisa"));
125      
126       rekisteri.lisaaHenkilo(new Henkilo("Ville"));
127       rekisteri.lisaaHenkilo(new Henkilo("Kalle"));
128       System.out.println("Villen tunnit: " + rekisteri.getTunnit("Ville"));
129 
130     } catch(TaulukkoTaysiException e){
131       System.err.println("Taulukko on täynnä!");
132     }
133   }
134 }
135