1   package kalenteri;
2   
3   import java.io.PrintStream;
4   
5   /**
6    * Relaatio-luokka, joka yhdistää yhden harjoituksen moneen sisältöön.
7    * @author Timo Koski
8    *
9    */
10  public class Relaatio {
11      
12      private int id;     // relaation oma id
13      private static int nextId;
14      private int lkm;
15  
16      private int harjId; // harjoituksen id
17      private int[] relaatioTaulu;
18      
19      /* MUODOSTAJAT JA REKISTERÖINTI */
20      /**
21       * Muodostaja.
22       * Kutsuu muodostajaa, joka tekee 5-kokoisen taulukon.
23       * harjId yksilöi relaation harjoitukseen.
24       * @param harjId 
25       */
26      public Relaatio(int harjId) {
27          this(5, harjId);
28      }
29      /**
30       * Muodostaja, joka tekee int-kokoisen taulukon.
31       * harjId yksilöi relaation harjoitukseen.
32       * @param koko 
33       * @param harjId 
34       */
35      public Relaatio(int koko, int harjId) {
36          relaatioTaulu = new int[koko];
37          this.harjId = harjId;
38          rekisteroi();
39      }
40      /**
41       * Rekisteröidään relaatiolle id-numero.
42       * Vrt. luentoesimerkit
43       * @return id
44       */
45      private int rekisteroi() {
46          this.id = nextId;
47          nextId++;
48          return id;
49      }
50  
51      /* GETTERIT */
52      /**
53       * @return harjoituksen ID
54       */
55      public int getHarjId() {
56          return harjId;
57      }
58      /**
59       * @param id
60       */
61      public void setHarjId(int id) {
62          this.harjId = id;
63      }
64      /**
65       * Luodaan uusi relaatioTaulu ilman nollia lopussa.
66       * @return uusiRelaatioTaulu
67       */
68      public int[] getHarjSisallot() {
69          int[] uusiRelaatioTaulu = new int[lkm];
70          for (int i=0;i<lkm;i++) {
71              uusiRelaatioTaulu[i] = relaatioTaulu[i];
72          }
73          return uusiRelaatioTaulu;
74      }
75      
76      /* LISÄÄMINEN, SUURENTAMINEN JA POISTAMINEN */
77      /**
78       * Lisätään taulukkoon sisällön id.
79       * @param id sisällön yksilöivä tunnus
80       */
81      public void lisaa(int id) {
82          if (relaatioTaulu.length <= lkm)
83              suurenna();
84          relaatioTaulu[lkm++] = id;
85      }
86      /**
87       * Kasvattaa taulukkoa viidellä.
88       */
89      public void suurenna() {
90          int[] temp = relaatioTaulu;
91          relaatioTaulu = new int[lkm + 5];
92          this.lkm = 0;
93          for(int i: temp)
94              lisaa(i);
95      }
96      /**
97       * Poistetaan parametrina tuotava sisältö.
98       * @param poistettava 
99       */
100     public void poista(Sisalto poistettava) {
101         for (int i=0;i<lkm;i++) {
102             if (poistettava.equals(relaatioTaulu[i]))
103                 poista(i--);            
104         }
105     }   
106     /**
107      * Poistetaan int-parametrina tuotavasta kohdasta alkio. 
108      * @param poistettava
109      */
110     public void poista(int poistettava) {
111         for(int j=poistettava;j<lkm-1;j++) {
112             relaatioTaulu[j] = relaatioTaulu[j+1];
113         }
114         relaatioTaulu[lkm-1] = 0;
115         lkm--;
116     }
117     /**
118      * @param sisallonId
119      */
120     public void poistaSisalto(int sisallonId) {
121         for (int i=0;i<lkm;i++) {
122             if(relaatioTaulu[i]==sisallonId) {
123                 poista(i);
124                 break;
125             }
126         }
127     }
128 
129     /* TULOSTAMINEN JA TOSTRING */
130     /**
131      * Tulostamismetodi.
132      * Tulostaa parametrina tuotuun PrintStreamiin.
133      * @param os
134      */
135     public void tulosta(PrintStream os) {
136         String erotin = "";
137         for(int i=0;i<lkm;i++) {
138             os.print(erotin + relaatioTaulu[i]);
139             erotin = ", ";
140         }
141         System.out.println("\n");
142     }
143     /**
144      * toString-metodi lisää taulukon sisällön temp-stringgiin.
145      * @return temp
146      */
147     @Override
148     public String toString() {
149         String temp = "";
150         String erotin = "";
151         for(int i=0;i<lkm;i++) {
152             temp += (erotin + relaatioTaulu[i]);
153             erotin = ",";
154         }
155         return temp;
156     }
157     
158     /* PÄÄOHJELMA */
159     /**
160      * Pääohjelma luokan testaamiseen.
161      * @param args
162      * @example
163      * <pre name="test">
164      * Relaatio r = new Relaatio(1);
165      * String tulos = "1, 1, 1, 1";
166      * String tulos2 = "1, 1, 1, 1, 1, 2, 3";
167      * String tulos3 = "1, 1, 1, 1, 1, 3";
168      * r.lisaa(1);
169      * r.lisaa(1);
170      * r.lisaa(1);
171      * r.lisaa(1);
172      * r.toString() === tulos;
173      * r.lisaa(1);
174      * r.lisaa(2);
175      * r.lisaa(3);
176      * r.toString() === tulos2;
177      * r.poista(5);
178      * r.toString() === tulos3;
179      * </pre>
180      */
181     public static void main(String[] args) {
182         Relaatio r = new Relaatio(1);
183         r.lisaa(1);
184         r.lisaa(4);
185         r.lisaa(41);
186         r.tulosta(System.out);
187         r.lisaa(61);
188         r.lisaa(1);
189         r.lisaa(3);
190         r.tulosta(System.out);
191     }
192 }
193