Transcript File

Chapter 7
Arrays (Nizovi)
Nizovi
• Nizovi su objekti koji nam pomazu
da organizujemo velike kolicine
informacija
• U glavi 7 razmatramo:








Deklaraciju i koristenje niza
Provjeru granica i kapaciteta
Nizove koji sadrze reference na objekte
Liste promjenljive duzine koje sadrze
parametre
Visedimenzionalne nizove
Klasu ArrayList
Poligone i izlomljene linije
Dogadjaje misa i dogadjaje tastature
© 2004 Pearson Addison-Wesley. All rights reserved
7-2
Pregled
Deklarisanje i koristenje nizova
Nizovi objekata
Liste promjenljive duzine
koje sadrze parametre
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tastature
© 2004 Pearson Addison-Wesley. All rights reserved
7-3
Nizovi
• Niz je uredjena lista vrijednosti
Svaka vrijednost ima numericki indeks
Cio niz ima
jedinstveno ime
0
scores
1
2
3
4
5
6
7
8
9
79 87 94 82 67 98 87 81 74 91
Niz duzine N je indeksiran od nule do N-1
Ovaj niz sadrzi 10 vrijednosti koje su indeksirane od 0 do 9
© 2004 Pearson Addison-Wesley. All rights reserved
7-4
Nizovi
• Pojedinacna vrijednost u nizu se navode
koristeci ime niza iza kojeg slijedi indeks u
uglastim zagradama
• Na primjer, izraz
scores[2]
referise vrijednost 94 (3-ca vrijednost u nizu)
• Taj izraz predstavlja mjesto za cuvanje cijelog
broja i moze se koristiti kad god se koristi
cjelobrojna varijabla
© 2004 Pearson Addison-Wesley. All rights reserved
7-5
Nizovi
• Na primjer, elementu niza moze se dodijeliti
vrijednost, moze se odstampati ili koristiti u
racunu:
scores[2] = 89;
scores[prvi] = scores[prvi] + 2;
mean = (scores[0] + scores[1])/2;
System.out.println (“Vrh = " + scores[5]);
© 2004 Pearson Addison-Wesley. All rights reserved
7-6
Nizovi
• Vrijednosti sadrzane u nizu nazivaju se elementi
niza
• Niz sadrzi vise vrijednosti istog tipa – tip elementa
• Tip elementa moze biti prost tip ili referenca
objekta
• Dakle, mozemo kreirati niz cijelih, niz karaktera, niz
objekata tipa String, niz objekata tipa Coin, itd.
• U Javi, sam niz je objekat koji mora biti instanciran
© 2004 Pearson Addison-Wesley. All rights reserved
7-7
Nizovi
• Drugi nacin opisa niza scores:
scores
© 2004 Pearson Addison-Wesley. All rights reserved
79
87
94
82
67
98
87
81
74
91
7-8
Deklaracija nizova
• Niz scores mogao bi biti deklarisan na slijedeci
nacin:
int[] scores = new int[10];
• Tip varijable scores je int[] (niz cijelih)
• Primijetimo da tip niza ne odredjuje njegovu
duzinu, ali svaki objekat tog tipa ima odredjenu
duzinu
• Referentna varijabla scores postavlja se na
new array objekat koji moze sadrzati 10 cijelih
© 2004 Pearson Addison-Wesley. All rights reserved
7-9
Deklaracija nizova
• Neki drugi primjeri deklaracije nizova:
float[] cijene = new float[500];
boolean[] flags;
flags = new boolean[20];
char[] kodovi = new char[1750];
© 2004 Pearson Addison-Wesley. All rights reserved
7-10
Koristenje nizova
• Verzija for petlje moze se koristiti kao iterator kod
obrade elemenata niza
for (int score : scores)
System.out.println (score);
• Ovo vrijedi samo kada obradjujemo sve elemente
niza od vrha (najmanji indeks) do dna (najveci
indeks)
• Vidi BasicArray.java (strana 372)
© 2004 Pearson Addison-Wesley. All rights reserved
7-11
Provjera granica
• Kada je niz kreiran on ima fiksiranu duzinu
• Indeks koji se koristi kao referenca mora
odredjivati ispravnu vrijednost
• To znaci, indeks mora biti u rasponu od 0 do N-1
• Java interpreter javlja
ArrayIndexOutOfBoundsException ako je neki
indeks niza van granica
• Ovo se naziva automatska provjera granica
© 2004 Pearson Addison-Wesley. All rights reserved
7-12
Provjera granica
• Na primjer, ako niz codes ima 100 vrijednosti, on
moze biti indeksiran koristeci brojeve od 0 do 99
• Ako vrijednost count iznosi 100, tada ce slijedeca
referenca prouzrokovati javljanje greske:
System.out.println (codes[count]);
• Uobicajeno je uvesti off-by-one gresku kada se
koriste nizovi
problem
for (int index=0; index <= 100; index++)
codes[index] = index*50 + epsilon;
© 2004 Pearson Addison-Wesley. All rights reserved
7-13
Provjera granica
• Svaki niz objekat ima javnu (public) konstantu
zvanu length koja sadrzi duzinu niza
• Ona se poziva koristeci ime niza:
scores.length
• Primijetimo da length sadrzi broj elemenata, a ne
najveci indeks
• Vidi ReverseOrder.java (strana 375)
• Vidi LetterCount.java (strana 376)
© 2004 Pearson Addison-Wesley. All rights reserved
7-14
Alternativna sintaksa za niz
• Zagrade za tip niza mogu se povezati sa tipom
elementa ili sa imenom niza
• Dakle, slijedece dvije deklaracije su ekvivalentne:
float[] prices;
float prices[];
• Prvi format je uglavnom citljiviji i trebalo bi ga
koristiti
© 2004 Pearson Addison-Wesley. All rights reserved
7-15
Lista za inicijalizaciju
• Lista za inicijalizaciju moze biti koristena za
inicijalizaciju i popunjavanje niza u jednom koraku
• Vrijednosti su ogranicene zagradama i odvojene
zarezima
• Primjeri:
int[] units = {147, 323, 89, 933, 540,
269, 97, 114, 298, 476};
char[] letterGrades = {'A', 'B', 'C', 'D', ’F'};
© 2004 Pearson Addison-Wesley. All rights reserved
7-16
Lista za inicijalizaciju
• Kada se koristi lista za inicijalizaciju tada:
 Operator new se ne koristi
 Vrijednost duzine se ne navodi
• Duzina niza je odredjena brojem clanova u listi za
inicijalizaciju
• Lista za inicijalizaciju moze biti koristena samo
prilikom deklaracije niza
• Vidi Primes.java (strana 381)
© 2004 Pearson Addison-Wesley. All rights reserved
7-17
Nizovi kao parametri
• Cio niz moze se predati kao parametar nekoj
metodi
• Slicno svakom drugom objektu, referenca na niz
se prenosi, cineci da aktuelni parametar i formalni
parametar postaju aliasi jedan drugog
• Dakle, mijenjajuci neki elemenat niza u metodi
mijenja i original
• Pojedinacni elemenat niza moze se takodje predati
metodi, u kom slucaju je tip formalnog parametra
isti kao tip elementa
© 2004 Pearson Addison-Wesley. All rights reserved
7-18
Pregled
Deklaracija i koristenje nizova
Nizovi objekata
Liste promjenljive duzine koje sadrze
parametre
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tastature
© 2004 Pearson Addison-Wesley. All rights reserved
7-19
Nizovi objekata
• Elementi niza mogu biti reerence na objekte
• Slijedeca deklaracija rezervise prostor za cuvanje
5 referenci na objekte tipa String
String[] words = new String[5];
• Ona sama NE kreira objekte tipa String
• Inicijalno niz objekata sadrzi null reference
• Svaki objekat u nizu mora biti instanciran zasebno
© 2004 Pearson Addison-Wesley. All rights reserved
7-20
Nizovi objekata
• Niz words nakon sto je inicijalno deklarisan:
words
-
• Na ovom mjestu, slijedece reference moraju javiti
NullPointerException:
System.out.println (words[0]);
© 2004 Pearson Addison-Wesley. All rights reserved
7-21
Niz objekata
• Nakon sto su neki objekti tipa String kreirani i
sacuvani u nizu:
“friendship”
words
“loyalty”
“honor”
-
© 2004 Pearson Addison-Wesley. All rights reserved
7-22
Nizovi objekata
• Zapamtimo da objekti tipa String mogu biti
kreirani koriscenjem literala
• Slijedeca deklaracija kreira niz objekata zvani
verbs i puni ga sa cetiri objekta String koji su
kreirani pomocu literala
String[] verbs = {"play", "work", "eat", "sleep"};
© 2004 Pearson Addison-Wesley. All rights reserved
7-23
Nizovi objekata
• Slijedeci primjer kreira niz objekata tipa Grade,
svaki sa predstavljanjem stringa i sa numerickom
donjom medjom
• Vidi GradeRange.java (strana 384)
• Vidi Grade.java (strana 385)
• Pogledajmo sada primjer koji upravlja kolekcijom
CD objekata
• Vidi Tunes.java (strana 387)
• Vidi CDCollection.java (strana 388)
• Vidi CD.java (strana 391)
© 2004 Pearson Addison-Wesley. All rights reserved
7-24
Nizovi objekata
• UML diagram za program Tunes:
Tunes
CDCollection
- collection : CD[]
- count : int
- totalCost : double
+ main (args : String[]) :
void
+ addCD (title : String, artist : String,
cost : double, tracks : int) : void
+ toString() : String
- increaseSize() : void
CD
- title : String
- artist : String
- cost : double
- tracks : int
1
*
+ toString() : String
© 2004 Pearson Addison-Wesley. All rights reserved
7-25
Argumenti komandne linije
• Signatura metode main pokazuje da ona uzima
jedan niz objekata tipa String kao parametre
• Ove vrijednosti dolaze kao argumenti comandne
linije koji se zadaju pri pozivu interetera
• Na primjer, slijedeci poziv interpretera predaje tri
objekta tipa String u main:
> java StateEval pennsylvania texas arizona
• Ovi stringovi se cuvaju na poljima indeksa 0-2 niza
parametara metode main
• Vidi NameTag.java (strana 393)
© 2004 Pearson Addison-Wesley. All rights reserved
7-26
Pregled
Deklarisanje i koristenje nizova
Nizovi objekata
Liste promjenljive duzine sa parametrima
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tastature
© 2004 Pearson Addison-Wesley. All rights reserved
7-27
Liste promjenljive duzine sa
parametrima
• Pretpostavimo da zelimo kreirati metodu koja
obradjuje razlicite kolicine informacija pri razlicitim
pozivima
• Na primjer, definisimo metodu zvanu average koja
vraca srednju vrijednost skupa cijelih parametara
// jedan poziv usrednjava tri vrijednosti
mean1 = average (42, 69, 37);
// drugi poziv usrednjava sedam vrijednosti
mean2 = average (35, 43, 93, 23, 40, 21, 75);
© 2004 Pearson Addison-Wesley. All rights reserved
7-28
Parametarske liste promjenljive
duzine
• Mogli smo definisati preopterecenu verziju metode
average
 Losa strana: mi trebamo odvojenu verziju metode za
svaki broj parametara
• Mogli bi definisati metod koji prihvata jedan niz
cijelih
 Losa strana: treba kreirati niz i ubaciti cijele brojeve prije
svakog poziva metode
• Umjesto toga, Java uvodi pogodan nacin za
kreiranje parametarske lise promjenljive duzine
© 2004 Pearson Addison-Wesley. All rights reserved
7-29
Parametarske liste promjenljive
duzine
• Koristeci specijalnu sintaksu u listi formalnih
parametara, mozemo definisati metod koji prihvata
proizvoljan broj parametara istog tipa
• Za svaki poziv, parametri se automatski stavljaju u
jedan niz radi lakse obrade
Indicira promjenljivu duzinu parametarske
liste
public double average (int ... list)
{
// sta bilo
}
Tip
Ime
Elementa
niza
© 2004 Pearson Addison-Wesley. All rights reserved
7-30
Parametarske liste promjenljive
duzine
public double average (int ... list)
{
double result = 0.0;
if (list.length != 0)
{
int sum = 0;
for (int num : list)
sum += num;
result = (double)num / list.length;
}
return result;
}
© 2004 Pearson Addison-Wesley. All rights reserved
7-31
Parametarske liste promjenljive
duzine
• Tip parametra moze biti proizvoljan prosti tip ili tip
objekta
public void printGrades (Grade ... grades)
{
for (Grade letterGrade : grades)
System.out.println (letterGrade);
}
© 2004 Pearson Addison-Wesley. All rights reserved
7-32
Parametarske liste promjenljive
duzine
• Metod koji moze prihvatiti promjenljiv broj
parametara moze takodje prihvatiti i druge
parametre
• Slijedeci metod prihvata neki int, objekat tipa
String, kao i promjenljiv broj double vrijednosti u
jedan niz zvani nums
public void test (int count, String name,
double ... nums)
{
// whatever
}
© 2004 Pearson Addison-Wesley. All rights reserved
7-33
Parametarske liste promjenljive
duzine
• Promjenljivi broj parametara mora biti zadnji od
formalnih argumenata
• Pojedinacna metoda ne moze prihvatiti dva skupa
sa promjenljivim brojem parametara
• Konstruktor se takodje moze postaviti da prihvata
promjenljiv broj parametara
• Vidi VariableParameters.java (strana 396)
• Vidi Family.java (strana 397)
© 2004 Pearson Addison-Wesley. All rights reserved
7-34
Pregled
Deklarisanje i koristenje nizova
Nizovi i objekti
Parametarske liste promjenljive duzine
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tipke
© 2004 Pearson Addison-Wesley. All rights reserved
7-35
Dvodimenzionalni nizovi
• Jednodimenzionalni niz sadrzi listu elemenata
• Dvodimenzionalni niz mozemo shvatiti kao tabelu
sa redovima i kolonama
one
dimension
two
dimensions
© 2004 Pearson Addison-Wesley. All rights reserved
7-36
Dvodimenzionalni nizovi
• Da budemo precizni, u Javi je dvodimenzionalni
niz jedan niz nizova
• Dvodimenzionalni niz je deklarisan navodjenjem
duzine svake dimenzije posebno:
int[][] scores = new int[12][50];
• Elemenat niza se navodi koristeci dvije vrijednosti
indeksa:
value = scores[3][6]
• Niz koji se cuva u jednom redu moze biti odredjen
koriscenjem jednog indeksa
© 2004 Pearson Addison-Wesley. All rights reserved
7-37
Dvodimenzionalni nizovi
Izraz
tabela
Tip
int[][]
Opis
tabela[5]
int[]
Niz cijelih brojeva
tabela[5][12]
int
Cio broj
2D niz cijelih brojeva, ili
niz nizova cijelih
brojeva
• Vidi TwoDArray.java (strana 399)
• Vidi SodaSurvey.java (strana 400)
© 2004 Pearson Addison-Wesley. All rights reserved
7-38
Visedimenzionalni nizovi
• Neki niz moze imati vise dimenzija – ako on ima
vise od jedne dimenzije, on se naziva
visedimenzionalni niz
• Svaka dimenzija dijeli prethodnu na odredjeni broj
elemenata
• Svaka dimenzija ima vlastitu konstantu length
• Posto je svaka dimenzija neki niz referenci nizova,
nizovi u jednoj dimenziji mogu imati razne duzine
 Ovi se ponekad nazivaju neporavnati nizovi (ragged
arrays)
© 2004 Pearson Addison-Wesley. All rights reserved
7-39
Pregled
Deklarisanje i koristenje nizova
Nizovi i objekti
Parametarske liste promjenljive duzine
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tipke
© 2004 Pearson Addison-Wesley. All rights reserved
7-40
Klasa ArrayList
• Klasa ArrayList je dio paketa java.util
• Slicno nizu, ona moze sadrzati listu vrijednosti i
referenci od kojih svaka koristi jedan indeks
• Ipak, ne moze se koristiti sintaksa sa uglastim
zagradama za neki objekat tipa ArrayList
• Stavise, neki objekat ArrayList raste i skuplja se
po potrebi, prilagodjavajuci svoj kapacitet prema
potrebi
© 2004 Pearson Addison-Wesley. All rights reserved
7-41
Klasa ArrayList
• Elementi mogu biti ubaceni ili izbaceni iz liste
jednim pozivom metode
• Kada je jedan elemenat ubacen, ostali elementi se
“razmicu" da naprave mjesto
• Slicno, kada je jedan elemenat izbacen, lista se
“zbija" da zatvori prazninu
• Indeksi elemenata se prilagodjavaju na
odgovarajuci nacin
© 2004 Pearson Addison-Wesley. All rights reserved
7-42
Klasa ArrayList
• ArrayList sadrzi reference na klasu Object, koja
joj dozvoljava da cuva bilo koju vrstu objekta
• Vidi Beatles.java (strana 405)
• Mozemo takodje definisati neki objekat tipa
ArrayList da prihvata poseban tip objekta
• Slijedeca deklaracija kreira objekat ArrayList
koji cuva samo objekte Family
ArrayList<Family> reunion = new ArrayList<Family>
• Ovo je primjer generisanja, koji ce dalje biti
definisan u glavi 12
© 2004 Pearson Addison-Wesley. All rights reserved
7-43
Efikasnost ArrayList
• Klasa ArrayList je implementirana koristeci niz
• Nizom se manipulise tako da indeksi ostaju
neperkidni u toku dodavanja ili uklanjanja
elemenata
• Ako se elementi dodaju i uklanjaju sa kraja liste,
ovaj postupak je dovoljno efikasan
• Ali ako se elementi ubacuju i uklanjaju sa cela ili iz
sredine liste, preostali elementi su siftani
© 2004 Pearson Addison-Wesley. All rights reserved
7-44
Pregled
Deklarisanje i koristenje nizova
Nizovi objekata
Liste promjenljive duzine sa parametrima
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tipke
© 2004 Pearson Addison-Wesley. All rights reserved
7-45
Poligoni i izlomljena linije
• Nizovi mogu biti korisni u grafickoj obradi
• Na primjer, oni mogu biti koristeni za cuvanje liste
koordinata
•
polygon je visestrani, zatvoren oblik
• Izlomljena linija je slicna poligonu osim sto krajnje
tacke nisu sastavljene, a ne moze biti ni ispunjena
• Vidi Rocket.java (strana 409)
• Vidi RocketPanel.java (strana 410)
© 2004 Pearson Addison-Wesley. All rights reserved
7-46
Klasa Polygon
• Klasa Polygon moze takodje biti koristena za
definisanje i crtanje poligona
• Ona je dio paketa java.awt
• Verzije preopterecenih metoda Polygon i
fillPolygon uzimaju pojedinacni objekat tipa
Polygon kao parametar umjesto niza koordinata
• Objekat Polygon inkapsulira koordinate poligona
© 2004 Pearson Addison-Wesley. All rights reserved
7-47
Pregled
Deklarisanje i koristenje nizova
Nizovi objekata
Liste promjenljive duzine sa parametrima
Dvodimenzionalni nizovi
Klasa ArrayList
Poligoni i izlomljene linije
Dogadjaji misa i dogadjaji tipke
© 2004 Pearson Addison-Wesley. All rights reserved
7-48
Dogadjaji misa (Mouse Events)
• Dogadjaji koji se odnose na misa podijeljeni su na mouse
events (dogadjaje misa) i mouse motion events (dogadjaje
kretanja misa)
• Dogadjaji misa:
mouse pressed
Mis je pritisnut na doli
mouse released
Baton misa je pusten
mouse clicked
Baton misa je pritisnut na doli i pusten
bez pokretanja misa izmedju operacija
mouse entered
Pokazivac misa je pomjeren na (preko)
neke komponente
mouse exited
Pokazivac misa je pomjeren van neke
komponente
© 2004 Pearson Addison-Wesley. All rights reserved
7-49
Dogadjaji misa
• Dogadjaji kretanja misa:
mouse moved
Mis je pokrenut
mouse dragged
Mis je pokrenut dok je mis pritisnut na
doli
• Slusaoci za dogadjaj misa su kreirani koristeci
interfejse MouseListener i
MouseMotionListener
• Objekat MouseEvent se salje odgovarajucoj
metodi kada se desi dogadjaj misa
© 2004 Pearson Addison-Wesley. All rights reserved
7-50
Dogadjaj misa
• Za dati program, mi mozemo voditi racuna samo o
jednom ili dva dogadjaja misa
• Da bismo zadovoljili implementaciju
implementaciju slusaoca, moramo uvesti prazan
metod za neiskoristene dogadjaje
• Vidi Dots.java (strana 413)
• Vidi DotsPanel.java (strana 414)
© 2004 Pearson Addison-Wesley. All rights reserved
7-51
Dogadjaj misa
• Rubberbanding je vizualni efekat u kome je neki
oblik “prosiren" kada je vucen pomocu misa
• U slijedecem primjeru liije se neprekidno ponovo
crtaju kada je mis vucen
• Vidi RubberLines.java (strana 417)
• Vidi RubberLinesPanel.java (strana 418)
© 2004 Pearson Addison-Wesley. All rights reserved
7-52
Dogadjaj tipke
• Dogadjaj tipke (key event) se generise kada
korisnik kuca na tastaturi
key pressed
Tipka na tastaturi je pritisnuta na doli
key released
Tipka na tastaturi je pustena
key typed
Tipka na tastaturi je pritisnuta na doli i
pustena
• Slusaoci za dogadjaje tipke su kreirani preko
implementacije interfejsa KeyListener
• Objekat KeyEvent je poslan odgovarajucoj metodi
kada se desi dogadjaj tipke
© 2004 Pearson Addison-Wesley. All rights reserved
7-53
Dogadjaj tipke
• Komponenta koja generise dogadjaj tipke je ona
koja trenutno ima fokus na tastaturi (keyboard
focus)
• Konstante u klasi KeyEvent mogu biti koristene za
odredjivanje koja je tipka pritisnuta
• Slijedeci primjer “premjesta" sliku strelice kada
korisnik ukucava tipke sa strelicama
• Vidi Direction.java (strana 421)
• Vidi DirectionPanel.java (strana 422)
© 2004 Pearson Addison-Wesley. All rights reserved
7-54
Zakljucak
• U glavi 7 smo diskutovali:






Deklaraciju i koristenje niza
Provjeru granica i kapaciteta
Nizove koji sadrze reference na objekte
Liste promjenljive duzine sa parametrima
Visedimenzionalne nizove
Klasu ArrayList
 Poligone i izlomljene linije
 Dogadjaje misa i dogadjaje tastature
© 2004 Pearson Addison-Wesley. All rights reserved
7-55