1   /**
2    * Luokka useiden kartalla olevien paikkojen koordinaattien tallettamiseen.
3    * @author Jukka Mäntylä
4    * @version 1.02, 22.03.2003
5    */
6   public class Kartta2 {
7   
8     public class TaulukkoTaysiException extends Exception { }
9   
10    private Karttapaikka[] paikat;
11    private int lkm;
12    private int hakuindex;
13    private String hakuehto;
14  
15    /**
16     * Etsii nimen perusteella alkiota paikat-taulukosta,
17     * sijoittaa ensimmäisen löytämänsä alkion indeksin
18     * hakuindex-attribuuttiin
19     * @param nimi haettavan karttapaikan nimi
20     * @return Palauttaa true jos löytyy, muutoin false.
21     */
22    private boolean etsi(String nimi) {
23      hakuehto = nimi;
24      for (hakuindex=0; hakuindex<lkm; hakuindex++)
25        if ( hakuehto.equals(paikat[hakuindex].annaNimi()) ) return true;
26      return false;
27    }
28  
29    /**
30     * Hakee viimeisimmän hakuehdon mukaan seuraavaa alkiota
31       * jatkaen viimeksi löydetystä alkiosta.
32     * @return true jos löytyy, muutoin false.
33     */
34    private boolean etsiSeuraava() {
35      while (++hakuindex < lkm) // onko seuraavaa taulukossa?
36            if ( hakuehto.equals(paikat[hakuindex].annaNimi()) ) return true;
37          return false;  
38    }
39  
40    // Muodostaja
41    public Kartta2(int alkiomaksimi) {
42      if ( alkiomaksimi < 1 )
43        paikat = new Karttapaikka[1];
44      else
45        paikat = new Karttapaikka[alkiomaksimi];
46      lkm = 0;
47      hakuindex = 0;
48      hakuehto = "";
49    }
50  
51    /**
52     * Lisää taulukkoon uudeen karttapaikan
53     * @param nimi - lisättävä paikan nimi
54     * @param c - paikan koordinaatit
55     * @throws TaulukkoTaysiException - jos taulukon maksimi ylitetään
56     */
57    public void lisaa(String nimi, Koordinaatti c) throws TaulukkoTaysiException {
58      if (lkm >= paikat.length) throw new TaulukkoTaysiException();
59      paikat[lkm] = new Karttapaikka(nimi,c);
60      lkm++;
61    }
62  
63    /**
64     * Poistaa ensimmäisenä löytämänsä paikan kokonaisuudessaan
65     * @param nimi - poistettavan paikan nimi
66     */
67    public void poista(String nimi) {
68      if ( !etsi(nimi) ) return; // saisi ehkä palauttaa tiedon onnistuiko poisto
69  
70      // siirretään löydetystä paikan jälkeen tulevat viitteet
71      // pykälän verran taaksepäin (voisi tehdä myös esim.
72      // kopioimalla viimeisen alkion poistettavan paikalle)
73      for (int j=hakuindex; j < lkm-1; j++)
74        paikat[j] = paikat[j+1];
75      lkm--;
76      paikat[lkm] = null;  // ettei viimeinen viite ole kahteen kertaan
77  
78    }
79  
80    /**
81     * Antaa ensimmäisenä löytämänsä paikan koordinaatit
82     * @param nimi - kartalla olevan paikan nimi
83     * @return paikan koordinaatit, null jos ei löydy
84     */
85    public Koordinaatti anna(String nimi) {
86      if ( !etsi(nimi) ) return null;
87      return paikat[hakuindex].annaKoordinaatti();
88    }
89  
90    /**
91     * Antaa seuraavan löytämänsä paikan koordinaatit, hakuehto
92     * on sama kuin edellisessä anna-metodin kutsussa
93     * @return paikan koordinaatit, null jos ei löydy
94     */
95    public Koordinaatti annaSeuraava() {
96      if ( !etsiSeuraava() ) return null;
97      return paikat[hakuindex].annaKoordinaatti();
98    }
99  
100   public static void main(String[] args) {
101     Kartta2 asuinalue = new Kartta2(4); // asettaa paikkojen ja samalla
102                                         // koordinaattien maksimimääräksi 4
103     try {
104       Koordinaatti apuc;
105             
106       asuinalue.lisaa("Kabul", new Koordinaatti(34.3, 69.1));
107       asuinalue.lisaa("Hervanta", new Koordinaatti(61.45, 23.85));
108       asuinalue.lisaa("Honolulu", new Koordinaatti(21.19, -157.50));
109       asuinalue.lisaa("Melbourne", new Koordinaatti(-37.45, 144.58));
110 
111       asuinalue.poista("Honolulu");
112       apuc = asuinalue.anna("Melbourne");
113       System.out.println("Melbourne: " + apuc);
114       apuc = null;
115 
116       asuinalue.lisaa("Helsinki", new Koordinaatti(60.15, 24.93));
117       asuinalue.lisaa("Moisio", new Koordinaatti(62.43, 24.93));
118 
119     } catch (TaulukkoTaysiException e) {
120       System.err.println("Taulukko tuli täyteen..");
121     } catch (Exception e) {
122       System.err.println(e.getMessage());
123     }
124   }
125 }
126