Omien tietorakenteiden ohjelmointi on paitsi hauskaa, myös melko hyödyllistä. Oppii ohjelmoinnin konsteja ilman että tarvitsee kehitellä sen suurempia projekteja. Pyörähän näissä keksitään aina uudelleen, mutta eikö se ole kuitenkin kivaa ajella itse keksimällä pyörällä kuin valmiiksi paketoidulla?
Tässä esimerkissä toteutetaan pino käyttämällä ArrayList-luokkaa, joten tämä toimii myös helppona ja yksinkertaisena johdatuksen ko. luokan käyttöön. Tällä esimerkillä saa myös pintaraapaisun geneerisyydestä.
Pino.java
/*Pino *Tekijä: Juuso Haapanen * **/ import java.util.ArrayList; public class Pino<T> { //ainoa tarvittava instanssimuuttuja private ArrayList<T> pino; /*luo uuden pinon, jonka koko on koko *Alkuehto: koko > 0 */ public Pino(int koko){ pino = new ArrayList<T>(koko); } /*Lisää alkion pinoon. Alkuehto: alkio!=null **/ public void lisaa(T alkio) { pino.add(alkio); } /*hakee ensimmäisen alkion ja poistaa sen muistista. *Alkuehto: !pino.onTyhja(); */ public T eka() { T eka = pino.get(0); //otetaan ensimmäinen alkio pinosta pino.remove(0); //poistetaan ensimmäinen alkio return eka; } //tarkistaa onko pino tyhjä public boolean onTyhja() { return pino.isEmpty(); } }
PinoKok.java
public class PinoKok { public static void main(String... args) { Pino kolikot = new Pino(5); kolikot.lisaa(new String("10 snt")); kolikot.lisaa(new String("20 snt")); kolikot.lisaa(new String("50 snt")); kolikot.lisaa(new String("1 euro")); kolikot.lisaa(new String("2 euroa")); while(! kolikot.onTyhja()) { System.out.println(kolikot.eka()); } } }
Tämähän on jono (ensin sisään, ensin ulos). Pinossa (http://fi.wikipedia.org/wiki/Pino) viimeiseksi lisätty poistuu ensin.
Myös rivi
Pino kolikot = new Pino(5);
pitää muuttaa muotoon
Pino<String> kolikot = new Pino<String>(5);
sillä muuten kääntäjä herjaa virheellisestä koodista.
Mahdoitko kokeilla koodia? Tässä esimerkissä, ainakin minulla viimeiseksi lisätty alkio poistuu ensin :) "kolikot"-pinon voi myös esitellä koodivinkin esittämällä tavalla eikä herjaa mitään. Jos sen esittelee Pino<String> niin siihen ei voi lisätä esimerkiksi Integer-luokan olioita.
Tuo pinon koon määritettely heittää mulla ainakin häränpyllyä :D
Juuso kirjoitti:
Mahdoitko kokeilla koodia? Tässä esimerkissä, ainakin minulla viimeiseksi lisätty alkio poistuu ensin :)
Mahdoin ja kokeilin juuri uudelleen, kun aloin epäillä itseäni.
cs: /prinse/tko/aokkone/tmp>java5 PinoKok
10 snt
20 snt
50 snt
1 euro
2 euroa
cs: /prinse/tko/aokkone/tmp>
Eli näyttäisi aloittavan ensimmäiseksi lisätystä.
Samoin seuraava viittaisi jonoon:
/*Lisää alkion pinoon. Alkuehto: alkio!=null **/ public void lisaa(T alkio) { pino.add(alkio); } /*hakee ensimmäisen alkion ja poistaa sen muistista. *Alkuehto: !pino.onTyhja(); */ public T eka() { T eka = pino.get(0); //otetaan ensimmäinen alkio pinosta pino.remove(0); //poistetaan ensimmäinen alkio return eka; }
Lisääkäsky, pino.add(), lisää viimeiseksi ja poistakäsky, pino.remove(0), poistaa ensimmäisen.
Edelleen väittäisin pinoasi jonoksi.
Juuso kirjoitti:
"kolikot"-pinon voi myös esitellä koodivinkin esittämällä tavalla eikä herjaa mitään. Jos sen esittelee Pino<String> niin siihen ei voi lisätä esimerkiksi Integer-luokan olioita.
Itselläni näyttäisi herjaavan:
cs: /prinse/tko/aokkone/tmp>java5c PinoKok.java
Note: PinoKok.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
cs: /prinse/tko/aokkone/tmp>
Juuso kirjoitti:
Tuo pinon koon määritettely heittää mulla ainakin häränpyllyä :D
En ymmärrä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.