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
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
Cio niz ima jedinstveno ime Svaka vrijednost ima numericki indeks Nizovi Niz je uredjena lista vrijednosti scores Cio niz ima jedinstveno ime Svaka vrijednost ima numericki indeks 0 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
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
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
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
Nizovi Drugi nacin opisa niza scores: 79 87 94 82 67 98 81 74 91 © 2004 Pearson Addison-Wesley. All rights reserved
int[] scores = new int[10]; 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
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
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
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
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
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
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
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
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
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
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
String[] words = new String[5]; 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
System.out.println (words[0]); 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
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
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
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
Nizovi objekata UML diagram za program Tunes: * Tunes CDCollection CD + main (args : String[]) : void CDCollection - collection : CD[] - count : int - totalCost : double + addCD (title : String, artist : String, cost : double, tracks : int) : void + toString() : String - increaseSize() : void CD - title : String - artist : String - cost : double - tracks : int * 1 © 2004 Pearson Addison-Wesley. All rights reserved
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
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
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
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
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 Elementa Ime niza © 2004 Pearson Addison-Wesley. All rights reserved
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
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
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
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
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
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
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
Dvodimenzionalni nizovi Izraz Tip Opis tabela int[][] 2D niz cijelih brojeva, ili niz nizova cijelih brojeva tabela[5] int[] Niz cijelih brojeva tabela[5][12] int Cio broj Vidi TwoDArray.java (strana 399) Vidi SodaSurvey.java (strana 400) © 2004 Pearson Addison-Wesley. All rights reserved
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
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
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
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
ArrayList<Family> reunion = new ArrayList<Family> 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
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
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
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
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
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
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
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
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
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
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
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
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