Arraylist

Iz MaFiRaWiki


ArrayList bomo uporabili za shranjevanje naključnega števila celih števil, prikazali uporabo operacij za dodajanje elementa v seznam in za odstranjevanja elementa iz seznama ter za izpis vseh elementov seznama.

Ogrodje zbirk (vsi razredi in vmesniki) je opisano v paketu java.util, zato moramo na začetku programa napovedati uporabo tega paketa:

import java.util.*; 

Seznam deklariramo kot objekt razreda ArrayList, kateremu v oklepajih <> podamo tip elementov, ki jih hrani (slednje, tako imenovana generična koda, je novost Jave 5.0).

Tip mora biti določen z razredom, saj seznam ArrayList lahko hrani le objekte. V našem primeru, ko gre za cela števila (tip int) smo torej podali razred Integer:

ArrayList<Integer> sez;

Klic konstruktorja ustvari prazen seznam z začetno kapaciteto desetih elementov:

sez = new ArrayList<Integer>();

Nov element dodamo v seznam s pomočjo metode add(), ki doda element na konec seznama. Objekt, ki ga dodajamo, podamo kot argument metode. Zato moramo pred tem iz primitivnega tipa int ustvariti objekt Integer z isto vrednostjo. Če želimo dodati vrednost 5, to naredimo v dveh korakih:

Integer i = new Integer(5);
sez.add(i);
sez.add(i);

ki pa ju lahko tudi združimo:

sez.add(new Integer(5));

Če metodi add() dodamo še en argument, to je pozicijo novega elementa, dosežemo vrivanje elementa v seznam na točno določeno mesto. Število 5 dodamo na prvo mesto v seznamu z naslednjim stavkom:

sez.add(0, new Integer(5));

Pri dodajanju novih elementov v seznam pa lahko uporabimo še eno novost, ki jo prinaša Java 5.0, to je samodejno pretvarjanje primitivnih tipov (boxing/unboxing). To pomeni, da programerju ni potrebno skrbeti za pretvorbo primitivnega tipa int v ovijalni tip Integer, temveč za ustrezno pretvorbo poskrbi kar sam prevajalnik (seveda moramo prevajati s prevajalnikom različne 1.5 ali 5.0). Tako lahko oba stavka za dodajanje elementa zapišemo krajše kot:

sez.add(5);
sez.add(0, 5);

Element na določeni poziciji odstranimo iz seznama z metodo remove(), kateri kot argument podamo pozicijo elementa v seznamu. Prvi element seznama torej odstranimo s stavkom:

sez.remove(0);

Seveda je pred tem smiselno preveriti, ali je v seznamu sploh kakšen element. Metoda isEmpty() vrne true, če je seznam prazen:

if(!sez.isEmpty())
sez.remove(0);

Kadar želimo izbrisati iz seznama vse elemente, lahko uporabimo metodo clear(), ki počisti seznam:

sez.clear();

Za izpis seznama bomo napisali svojo metodo, ki se bo sprehodila preko vseh elementov seznama in izpisovala njihove vrednosti. Naj se metoda imenuje izpisiSeznam, kot argument pa prejme referenco na seznam, katerega elemente želimo izpisati. V našem primeru gre za seznam ArrayList objektov Integer:

public static void izpisiSeznam(ArrayList<Integer> s)

Telo metode sestavlja for zanka, ki gre preko vseh indeksov v seznamu (od 0 do size()) ter za vsakega od indeksov pokliče metodo get(), ki vrne element s podanim indeksom. Vrednost tako dobljenega elementa pretvorimo v niz in jo izpišemo:

for(int i=0; i<s.size(); i++)
System.out.print(s.get(i).toString() + " ");

Seveda se lahko tudi v tej zanki opremo na novosti Jave 5.0 in jo malo poenostavimo. Kot prvo izkoristimo samodejno ovijanje primitivnih tipov in metodo printf, ki omogoča lažje formatiranje izpisa:

for(int i=0; i<s.size(); i++)
System.out.printf(" %d ", s.get(i));

Naslednja uporabna novost Jave 5.0 pa je izboljšana zanka for, ki omogoča enostavnejši (in tudi bolj pregleden) prehod preko vseh elementov zbirke. Zapišemo jo tudi z rezervirano besedo for, kateri v oklepajih sledi tip elementa, znak : in ime zbirke. V našem primeru bi nova for zanka izgledala takole:

for(int i: s)
System.out.printf(" %d ", i);

Zapisano sintakso bi lahko prebrali kot “za vsak element i, ki je tipa int, v zbirki s”. Pri tem moramo opozoriti, da na tak način lahko elemente zbirke le pregledujemo, ne moremo pa jih spreminjati. Še korak naprej k poenostavitvi izpisa elementov seznama po lahko naredimo, če uporabimo preobloženo metodo toString() razreda ArrayList (ta jo podeduje od razreda AbstractCollection). Metoda vrne niz vseh elementov seznama po vrsti, loččenih z vejico, v oglatih oklepajih. Taka predstavitev seznama je za nas povsem primerna, zato jo bomo uporabili pri izpisu:

System.out.println("Seznam vsebuje naslednje elemente: " + s);

Razred ArrayList ima na zalogi še cel kup drugih metod, ki jih tukaj nismo omenili, lahko pa si jih pogledate v JDK dokumentaciji.

Osebna orodja