Kirjautuminen

Haku

Tehtävät

Keskustelu: Koodit: Java: Pino

Juuso [26.07.2006 00:14:55]

#

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());
		}
	}
}

A-P [07.08.2006 14:12:13]

#

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.

Juuso [18.08.2006 22:04:46]

#

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

A-P [20.08.2006 23:51:37]

#

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ä.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta