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