Lista.java
package datastructureproject.luokat.tietorakenteet;
/**
* Siirtoja sisältävä lista
*/
public class Lista<T> {
private T[] siirrot;
private int seuraavaIndeksi;
@SuppressWarnings("unchecked")
public Lista() {
siirrot = (T[]) new Object[10];
seuraavaIndeksi = 0;
}
public int size() {
return seuraavaIndeksi;
}
public T get(int index) {
return siirrot[index];
}
public T getVika() {
if (isEmpty()) {
return null;
}
return siirrot[seuraavaIndeksi - 1];
}
/**
* Palauttaa viimeksi laitetun olion ja 'poistaa' sen listasta (pienentämällä indeksimittaria).
*
* @return Listan viimeisin olio
*/
public T pop() {
if (isEmpty()) {
return null;
}
//Vähän hassusti kirjoitettu, mutta toimii kyllä:
seuraavaIndeksi--;
return siirrot[seuraavaIndeksi];
}
public boolean isEmpty() {
return seuraavaIndeksi == 0;
}
/**
* Siirron lisääminen listaan.
* @param siirto lisättävä siirto
*/
public void add(T siirto) {
// Tarvittaessa suurennetaan taulukkoa
if (seuraavaIndeksi >= siirrot.length) {
lisaaTilaa(siirrot.length);
}
siirrot[seuraavaIndeksi++] = siirto;
}
/**
* Lisätään toisen listan arvot tähän listaan.
* @param lista lista, jonka arvot halutaan lisätä tähän listaan
*/
public void addAll(Lista<T> lista) {
// Lisätään tarvittaessa tilaa
if (seuraavaIndeksi + lista.size() >= siirrot.length) {
// Ennakoidaan hieman ja lisätään vielä enemmän tilaa kun tarvitaan
lisaaTilaa(lista.size() + siirrot.length / 2);
}
for (int i = 0; i < lista.size(); i++) {
add(lista.get(i));
}
}
/**
* Suurennetaan taulukon kokoa parametrina annettun luvun verran.
* @param koko Kuinka paljon tilaa halutaan lisätä
*/
@SuppressWarnings("unchecked")
private void lisaaTilaa(int koko) {
T[] uusiSiirrot = (T[]) new Object[siirrot.length + koko];
for (int i = 0; i < seuraavaIndeksi; i++) {
uusiSiirrot[i] = siirrot[i];
}
siirrot = uusiSiirrot;
}
}