wiki:Tietorakenteet
Last modified 8 years ago Last modified on 2011-06-22 14:41:41

Apuja ohjelmointiin » Taulukot ja listat

Tämä ohje esittelee lyhyesti taulukot ja listat, ja mihin niitä voidaan käyttää. Taulukot ja listat ovat muuttujatyyppejä, joihin voidaan tallentaa useita arvoja. Näitä arvoja kutsutaan taulukon tai listan alkioiksi.

1. Taulukot

Taulukko on ennalta määritellyn kokoinen kokoelma arvoja (alkioita). Jos esimerkiksi haluaisimme peliin neljä pelaajaa, voisimme tehdä neljä attribuuttia

PhysicsObject pelaaja1;
PhysicsObject pelaaja2;
PhysicsObject pelaaja3;
PhysicsObject pelaaja4;

Sama voidaan kuitenkin hoitaa yksittäisellä taulukolla:

PhysicsObject[] pelaajat = new PhysicsObject[4];

Huomaa tyhjät hakasulut [] PhysicsObject-tyypin perässä. Tämä tarkoittaa, että tyyppi on taulukko fysiikkaolioita. Tyyppimerkintää voidaan käyttää myös esimerkiksi aliohjelmien parametreissa ja palautusarvoissa:

int[] PyoristaTaulukko(double[] doubleTaulukko)
{
   // koodi
}

Mutta kuinka ne alkiot saadaan sieltä taulukosta pois? Tähänkin voidaan käyttää hakasulkuja, tällä kertaa tyypin sijaan taulukon nimen perään kirjoitettuna:

int nollasAlkio = lukuTaulukko[0];

Samaan tapaan taulukon alkioille voidaan antaa arvoja:

lukuTaulukko[0] = nollasAlkio;

Jos taulukon koko on 4, seuraava esimerkkikoodi aiheuttaa ohjelman ajon aikana virheen ArgumentOutOfBoundsException (mieti miksi!)

lukuTaulukko[4] = a * b + 2;

Mitä sitten voidaan laittaa taulukkoon?

  • Kokonais- ja liukulukuja (int[] ja double[])
  • Merkkijonoja (string[])
  • Olioita (GameObject[], PhysicsObject[], Image[] jne.)
  • Vektoreita (Vector[])
  • Mitä tahansa mikä kelpaa muuttujan tyypiksi

Esimerkki 1:: Ensimmäisen pelaajan alustaminen

pelaajat[0] = new PhysicsObject(60, 60);
pelaajat[0].X = 20;
Add( pelaajat[0] );

Esimerkki 2: Kaikkien pelaajien alustaminen

Useampien alkioiden käsittelyssä for-silmukka on erityisen käytännöllinen. Seuraava esimerkki luo neljä pelaajaa ja asettaa ensimmäisen X-koordinaatiksi 100, toisen 200 jne.

for ( int i = 0; i < pelaajat.Length; i++ )
{
   pelaajat[i] = new PhysicsObject(60, 60);
   pelaajat[i].X = ( i + 1 ) * 100;
   Add( pelaajat[i] );
}

Esimerkissä indeksinä käytettiin lukua i, joka for-silmukan ansioista sai ensin arvon 0, sitten 1, 2, ja lopulta 3. Silmukan sisältö suoritettiin siis yhteensä neljä kertaa, joka kerta eri i:n arvolla. Taulukon koko saatiin lauseella pelaajat.Length(). Indeksiä käytettiin myös asettamaan pelaajien paikat sadan yksikön päähän toisistaan, alkaen koordinaatista ( 0 + 1 ) * 100 = 100.

2. Listat

Listat ovat muuten kuten taulukoita, mutta niiden kokoa ei ole rajoitettu. Siksi listoja nimitetäänkin joskus dynaamisiksi taulukoiksi. Uusi lista luodaan seuraavasti:

List<string> merkkijonoTaulukko = new List<string>();

Kulmasuluissa <> oleva määre (tässä string) on listan alkioiden tyyppi. Yleisesti kulmasulkuihin kirjoitettuja tyyppisanoja kutsutaan C#-kielessä tyyppiparametreiksi. Lista GameObject-tyyppisistä vihollisista olisi siis

List<GameObject> viholliset = new List<GameObject>();

Kun lista on luotu, sen koko on oletuksena nolla, ja siten mihin tahansa alkioon sijoittaminen aiheuttaa virheen ajon aikana. Alkioita voidaan lisätä listaan käyttämällä listan Add-metodia:

PhysicsObject monsteri = LuoMonsteri();
viholliset.Add( monsteri );

Nyt monsteri-olioon voidaan viitata listan alkiolla 0.

Vector suunta = new Vector( 200, 0 );
viholliset[0].Hit( suunta );

Alkioiden poistamiseen listasta on kaksi tapaa. Jos tiedetään, mitä halutaan poistaa, voidaan käyttää Remove-metodia:

parillisetLuvut.Add( 2 );
parillisetLuvut.Add( 3 );
parillisetLuvut.Add( 4 );

parillisetLuvut.Remove( 3 );   // lista tämän jälkeen: 2, 4

Jos taas tiedetään indeksi, voidaan käyttää RemoveAt-metodia:

parillisetLuvut.Add( 2 );  // indeksiin 0
parillisetLuvut.Add( 3 );  // indeksiin 1
parillisetLuvut.Add( 4 );  // indeksiin 2

parillisetLuvut.RemoveAt( 1 );   // lista tämän jälkeen: 2, 4

Huomaa, että poiston jälkeen listan indeksit muuttuvat! Edellisessä esimerkissä luvun 4 indeksi oli ennen poistoa 2, mutta poiston jälkeen 1. Koska luku 2 on listassa ennen poistettavaa alkiota, sen indeksi pysyy samana.

For-silmukkaa voidaan käyttää myös listoille, mutta on muistettava että alkioiden lukumäärä on listassa Count, ei Length.

for ( int i = 0; i < viholliset.Count; i++ )
{
   viholliset[i] = new GameObject(60, 60);
   viholliset[i].X = ( i + 1 ) * 100;
   viholliset[i].Y = 300;
   Add( viholliset[i] );
}