Kako podesiti pametne telefone i računare. Informativni portal
  • Dom
  • Greške
  • Biblioteka za rad sa java nizovima. Višedimenzionalni i asimetrični nizovi

Biblioteka za rad sa java nizovima. Višedimenzionalni i asimetrični nizovi

  • Java,
  • Algoritmi
    • Tutorial

    Mislim da će malo onih koji se spremaju za prvi intervju, prilikom prijavljivanja za prvi posao (pre)junior programera, negativno odgovoriti na ovo pitanje. Ili barem sumnjate u pozitivan odgovor. Naravno, tako jednostavna struktura podataka sa direktnim pristupom indeksu - bez trikova! Ne, u nekim jezicima kao što su JavaScript ili PHP, nizovi su, naravno, implementirani na vrlo zanimljiv način i u suštini su mnogo više od pukog niza. Ali ne govorimo o tome, već o „tradicionalnoj“ implementaciji nizova u obliku „čvrste oblasti memorije“. U ovom slučaju, na osnovu indeksa i veličine jednog elementa, adresa se jednostavno izračunava i pristupa se odgovarajućoj vrijednosti. Šta je tu tako teško?
    Hajde da to shvatimo. Na primjer, u Javi. Tražiti od nesuđenog kandidata da kreira niz cijelih brojeva n x n. Osoba samouvjereno piše nešto poput:
    int g = novi int[n][n];
    Odlično. Sada tražimo da inicijalizirate elemente niza nečim. Bar u jedinicama, barem kao zbir indeksa. Dobijamo:
    for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Čak i češće pišu
    for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    što je takođe povod za razgovor, ali sada pričamo o nečem drugom. Pokušavamo saznati šta čovjek zna i vidjeti kako razmišlja. Stoga mu skrećemo pažnju na činjenicu da se vrijednosti nalaze simetrično i tražimo od njega da uštedi na iteracijama petlje. Naravno, zašto prolaziti kroz sve vrijednosti indeksa kada možete proći samo kroz donji trokut? Subjekt se obično lako slaže i mudro naglašavajući glavnu dijagonalu pažljivo napiše nešto poput:
    for(int i = 0; i< n; i++) { g[i][i] = 2* i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } }
    Umjesto g[i][i] = 2* i; često se piše g[i][i] = i + i; ili g[i][i] = i<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Koliko će brže raditi program?. Uobičajeno rezonovanje je sljedeće: skoro 2 puta manje izračunavanja indeksa; gotovo 2 puta manje izračunavanja vrijednosti (zbrajanje); isti broj zadataka. To znači 30 posto brže.Ako osoba ima dobru matematičku pozadinu, onda čak možete vidjeti tačan broj sačuvanih operacija i razumniju procjenu efikasnosti optimizacije.
    Sada je vrijeme za glavni udarac. Pokrećemo obje verzije koda na nekoj dovoljno velikoj vrijednosti n(oko nekoliko hiljada), na primjer, ovako.

    Vremenski kontrolisan kod

    class A ( public static void main(String args) (int n = 8000; int g = new int[n][n]; long st, en; // jedan st = System.nanoTime(); for(int i = 0;i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nOne time " + (en - st)/1000000.d + " msc"); // two st = System.nanoTime(); for(int i = 0; i < n; i++) { g[i][i] = i + i; for(int j = 0; j < i; j++) { g[j][i] = g[i][j] = i + j; } } en = System.nanoTime(); System.out.println("\nTwo time " + (en - st)/1000000.d + " msc"); } }


    šta vidimo? Optimizirana verzija radi 10-100 puta sporije! Sada je vrijeme da posmatramo reakciju kandidata na poziciju. Kakva će biti reakcija na neobičnu (tačnije, uobičajenu u praksi programera) stresnu situaciju. Ako lice optuženog pokazuje uzbuđenje i on počne da pritiska dugmad, privremeno zaboravljajući na vaše postojanje, onda je to dobar znak. U određenoj mjeri. Ne želite da zaposlite istraživača koji ne brine o ishodu projekta, zar ne? Onda mu nemojte postavljati pitanje "Zašto?" Zamolite ih da prerade drugu opciju tako da zapravo radi brže od prve.
    Sada možete bezbedno da se bavite svojim poslom neko vreme. Za pola sata imat ćete dovoljno materijala za procjenu osnovnih ličnih i profesionalnih kvaliteta kandidata.
    Usput, kada sam ukratko opisao ovaj problem na svojoj web stranici, najpopularniji komentar je bio “Ovo je vaša Java kriva.” Objavljujem kod na Great and Free posebno za njih. A sretni vlasnici Free Pascal za Windows mogu pogledati

    ispod spojlera

    vrijeme programa; usesWindows; var start, završetak, res: int64; n, i, j: Integer; g: Niz niza cijelih brojeva; početak n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); za i:=1 do n-1 do za j:=1 do n-1 do g := i + j; QueryPerformanceCounter(finish); writeln("Vrijeme po redovima:", (kraj - početak) / res, "sek"); QueryPerformanceCounter(start); za i:=1 do n-1 do za j:=1 do n-1 do g := i + j; QueryPerformanceCounter(finish); writeln("Vrijeme po kolonama:", (završetak - početak) / res, "sek"); kraj.


    U gornjem kodu u Pascalu, uklonio sam "zbunjujuće" aspekte i ostavio samo suštinu problema. Ako se ovo može nazvati problemom.
    Koja pitanja na kraju postavljamo optuženom?
    1. Zašto radi sporije? I detaljnije...
    2. Kako ubrzati inicijalizaciju?

    Ako postoji potreba da se dublje kopa u Java implementaciju, onda tražimo od podnosioca prijave da prati vrijeme izvršenja za male vrijednosti n. Na primjer, na ideone.com za n=117, opcija “optimizirana” je upola sporija. Ali za sljedeću vrijednost n=118 ispada da je već 100 (sto) puta brži od neoptimizirane! Predložite eksperimentiranje na lokalnoj mašini. Pustite ga da se igra sa podešavanjima.
    Usput, da li svi razumiju šta se dešava?

    Nekoliko riječi opravdanja

    Želio bih reći nekoliko riječi kojima bih opravdao ovu metodu intervjua za zapošljavanje. Da, ne testiram poznavanje sintakse jezika i poznavanje struktura podataka. Možda na civiliziranom tržištu rada sve ovo funkcionira. Ali u našim uslovima totalnog nedostatka kvalifikovanog kadra, moramo pre vrednovati dugoročnu adekvatnost kandidata za posao sa kojim će se suočiti. One. sposobnost učenja, probijanja, razumijevanja, rada.
    Ovo je po duhu slično "intervjuu" za regrutaciju legionara u starom Rimu. Budući ratnik je bio jako uplašen i gledao je da li je pocrveneo ili prebledeo. Ako problijedi, tada u stresnoj situaciji podnosiočevu krv curi iz glave i on je sklon pasivnoj reakciji. Na primjer, nesvjestica. Ako je podnosilac predstavke pocrveneo, tada mu je krv navirala u glavu. One. sklon je aktivnim akcijama i uletima u tuče. Ovaj se smatrao prikladnim.
    Pa, još jedna stvar. Zašto sam svima pričao o ovom zadatku umjesto da ga nastavim koristiti u intervjuima? Samo što su potencijalni kandidati već "naučili" ovaj zadatak i moraju koristiti druge.
    Zapravo, obratio sam pažnju na ovaj efekat upravo u vezi sa stvarnim zadatkom obrade slike. Situacija je bila pomalo zbunjujuća i nisam odmah shvatio zašto mi je fps toliko opao nakon refaktoriranja. Općenito, svi vjerovatno imaju puno takvih divnih trenutaka.

    Do sada je vodeća verzija da je kriva keš procesora. One. sekvencijalni pristup u prvoj opciji radi unutar hash-a, koji se ažurira kada se pređe preko određene granice. Kada se pristupa po kolonama, hash je prisiljen da se stalno ažurira i to oduzima dosta vremena. Pogledajmo ovu verziju u njenom najčistijem obliku. Kreirajmo niz i uporedimo šta je brže - obraditi sve elemente u nizu ili obraditi elemente niza sa slučajnim brojem isti broj puta? Ovaj program je ideone.com/tMaR2S. Za 100.000 elemenata niza, nasumični pristup je obično znatno brži. Šta to znači?
    Ovdje mi je sasvim ispravno ukazano (Big_Lebowski) da preuređivanje petlji mijenja rezultate u korist sekvencijalne opcije. Zbog čistoće eksperimenta, morao sam postaviti ciklus zagrijavanja. Istovremeno, uradio sam nekoliko ponavljanja da bih dobio prosečno vreme rada kako je Leventov savetovao. Ispalo je ovako ideone.com/yN1H4g. One. Nasumični pristup elementima velikog niza je ~10% sporiji od sekvencijalnog pristupa. Možda keš memorija zaista može igrati određenu ulogu. Međutim, u prvobitnoj situaciji performanse su značajno pale. Dakle, postoji nešto drugo.

    Postepeno, verzija o dodatnim radnjama pri prelasku iz jednog reda niza u drugi postaje vodeća. I to je tačno. Ostaje da se utvrdi šta se tačno tamo dešava.

    Tagovi:

    • Programiranje
    • nizovi
    • memorija
    Dodaj oznake

    Nizovi(nizovi) _ su uređeni skupovi elemenata istog tipa. Elementi niza mogu biti objekti jednostavnih i referentnih tipova, uključujući Broj i reference na druge nizove. Sami nizovi su objekti i

    naslijediti klasu Object. Najava

    int ia = novi int;

    Definira niz pod nazivom ia koji inicijalno ukazuje na skup od tri Elementa tipa int.

    Deklaracija niza ne označava njegovu dimenziju. Broj elemenata niza je specificiran kada se kreira pomoću novog operatora. Dužina niza je fiksna u trenutku kreiranja i ne može se kasnije mijenjati. Kako god, varijabla tip niza (u našem primjeru – ia) novi niz s drugom dimenzijom može se dodijeliti u bilo kojem trenutku.

    Elementima niza se pristupa pomoću vrijednosti njihovih indeksnih brojeva.

    Prvi element niza ima indeks nula (0), a posljednji ima dužinu 1. Elementu niza se pristupa navođenjem imena niza i vrijednosti indeksa, zatvorenih u uglastim zagradama, [ i ]. u prethodnom primjeru, prvi element ia niza će biti ia, a posljednji element će biti ia. Kad god se indeksu pristupa elementu niza, Java runtime provjerava da li je vrijednost indeksa unutar prihvatljivih granica i izbacuje izuzetak tipa ArrayIndexOutOfBoundsException ako je rezultat provjere lažan. 6 Indeksni izraz mora biti tipa int - ovo je jedina stvar koja ograničava maksimalan broj elemenata niza.

    Dužina niza se može lako odrediti korištenjem polja dužine objekta niza (koje je implicitno opremljeno javnim i konačnim atributima). Ispod je ažurirani kod prethodnog primjera, koji omogućava izvršavanje petlje koja osigurava da se sadržaj svakog elementa niza ia prikaže na ekranu:

    za (int i = o; i< ia.length; i++)

    system.out.println(i + ": " + ia[i]);

    Obično se poziva niz nulte dužine (tj. onaj koji nema elemenata). prazan. Imajte na umu da su nulta referenca niza i prazna referenca niza dvije potpuno različite stvari. Prazan niz je pravi niz koji jednostavno nema elemenata. Prazan niz pruža zgodnu alternativu za null kada se vraćate iz metode. Ako metoda može vratiti null, kod aplikacije koji poziva metodu mora uporediti vraćenu vrijednost sa null prije nego što nastavi s preostalim operacijama. Ako metoda vrati niz (moguće prazan), nisu potrebne dodatne provjere - naravno, osim onih koje se tiču ​​dužine niza, koje bi u svakom slučaju trebale biti izvršene.

    Dozvoljen je i drugi oblik deklaracije niza, u kojem se uglaste zagrade navode iza identifikatora niza, a ne iza imena njegovog tipa:

    int ia = novi int;

    Prethodna sintaksa se, međutim, smatra poželjnijom jer čini deklaraciju tipa kompaktnijom.

    Modifikatori u deklaracijama niza

    Pravila za korištenje određenih nizova u deklaracijama modifikatori su uobičajene i zavise samo od toga kojoj kategoriji niz pripada - polja ili lokalne varijable. Postoji jedna stvar koju je važno zapamtiti – modifikatori se primjenjuju na sam niz, ali ne i na njegove pojedinačne elemente. Ako je konačni atribut naveden u deklaraciji niza, to samo znači da se referenca na niz ne može promijeniti nakon njegovog kreiranja, ali ni na koji način ne zabranjuje mogućnost promjene sadržaja pojedinačnih elemenata niza. Jezik vam ne dozvoljava da specificirate modifikatore (recimo, final ili final) za elemente niza.

    Višedimenzionalni nizovi

    Java podržava mogućnost deklaracije višedimenzionalni nizovi(multidimenzionalni nizovi) (tj. nizovi čiji su elementi drugi nizovi), kod koji uključuje deklarisanje dvodimenzionalne matrice i prikazivanje sadržaja njenih elemenata može izgledati, na primjer, ovako:

    float mat = novi float;

    setupMatrix(mat);

    za (int y = o; y< mat.length; у++) {

    za (int x = o; x< mat[y].length; х++)

    system.out.print(mat[y][x] + " ");

    system.out.println();

    Prilikom kreiranja niza, mora se specificirati barem njegova prva, "krajnja lijeva" dimenzija. Druge dimenzije možda neće biti specificirane - u tom slučaju će se morati naknadno odrediti. Određivanje svih dimenzija odjednom u novom operatoru je najsažetiji način za kreiranje niza, koji vam omogućava da izbjegnete potrebu za korištenjem dodatnih novih operatora. Izraz za deklarisanje i kreiranje mat niza iznad je ekvivalentan sljedećem isječku koda:

    float mat = novi float;

    za (int y = o; y< mat.length; у++)

    mat[y] = novi float;

    Ovaj oblik deklaracije ima prednost što, uz dobijanje nizova sa istim dimenzijama (recimo, 4 x 4), omogućava vam da izgradite nizove nizova različitih dimenzija neophodnih za skladištenje određenih nizova podataka.

    Inicijalizacija nizova

    Kada se kreira niz, svaki element prima zadanu vrijednost ovisno o tipu niza: nula (0) za numeričke tipove, '\u0000′_ za char, false za boolean i null za referentne tipove. Deklaracijom niza referentnog tipa mi zapravo definiramo niz privremeni ovaj tip. Razmotrite sljedeći isječak koda:

    Attr attrs = novi Attr;

    za (int i = o; i< attrs.length; i++)

    attrs[i] = novi Attr(imena[i], vrijednosti[i]);

    Nakon izvršenja prvog izraza koji sadrži operator new, varijabla attrs će imati referencu na niz od 12 varijabli koje su inicijalizirane na null. Sami Attr objekti će se kreirati samo kako petlja napreduje.

    Niz se može inicijalizirati (istovremeno s njegovom deklaracijom) pomoću konstrukcije u vitičastim zagradama koja navodi početne vrijednosti njegovih elemenata:

    String dangers = ("Lavovi", "Tigrovi", "Medvjedi");

    Sljedeći isječak koda će dati isti rezultat:

    String opasnosti = novi niz; opasnosti = "Lavovi";

    opasnosti = "Tigrovi";

    opasnosti = "Medvjedi";

    Prvi oblik, koji specificira listu inicijalizatora u vitičastim zagradama, ne zahtijeva eksplicitnu upotrebu novog operatora - poziva ga indirektno sistem vremena izvršavanja. Dužina niza u ovom slučaju je određena brojem vrijednosti inicijalizatora. Također je moguće eksplicitno specificirati novi operator, ali dimenziju i dalje treba izostaviti; kao i ranije, određuje je izvršni sistem:

    String dangers = new String("Lavovi", "Tigrovi", "Medvjedi");

    Ovaj oblik deklaracije i inicijalizacije niza može se koristiti bilo gdje u kodu, na primjer u izrazu poziva metode:

    printStringsCnew String ("jedan", "dva", "tri" ));

    Poziva se niz bez naslova koji je kreiran na ovaj način anoniman(anonimno).

    Nizovi nizova se mogu inicijalizirati ugniježđenim nizovima početnih vrijednosti. Ispod je primjer deklariranja niza koji sadrži prvih nekoliko redova tzv. Pascalov trougao gdje je svaki red opisan vlastitim nizom vrijednosti.

    int pascalsTriangle = (

    { 1, 4, 6, 4, 1 },

    Indeksi višedimenzionalnih nizova su u redu od spoljašnjeg ka unutrašnjem. Tako, na primjer, pascalsTriangle);

    // Primjer za ilustraciju kreiranja niza
    // cijeli brojevi, stavlja neke vrijednosti u niz,
    // i ispisuje svaku vrijednost.

    klasa GFG
    {

    {

    int arr;

    // dodjeljivanje memorije za 5 cijelih brojeva.
    arr = novi int;


    arr = 10;


    arr = 20;

    //tako dalje...
    arr = 30;
    arr = 40;
    arr = 50;

    // pristup elementima navedenog niza
    za (int i = 0; i< arr.length; i++)
    System.out.println("Element na indeksu " + i +
    " : "+ arr[i]);
    }
    }
    Kao rezultat dobijamo:

    Element na indeksu 0: 10 Element na indeksu 1: 20 Element na indeksu 2: 30 Element na indeksu 3: 40 Element na indeksu 4: 50

    Nizovi objekata

    Niz objekata kreira se na isti način kao i elementi podataka kako slijedi:

    Student arr = novi učenik;

    StudentArray sadrži sedam memorijskih elemenata svaki od student klase, u koje se mogu pohraniti adrese sedam Student objekata. Studentski objekti moraju biti kreirani pomoću konstruktora klase učenika i njihove reference moraju biti dodijeljene elementima niza na sljedeći način:

    Student arr = novi učenik;

    // Java program za ilustraciju kreiranja niza
    // objekti

    razred Učenik
    {
    javni int roll_no;
    javni naziv stringa;
    Student (int roll_no, ime niza)
    {
    this.roll_no = roll_no;
    this.name = ime;
    }
    }

    // Elementi niza su objekti klase Student.
    javna klasa GFG
    {
    javni statički void main (String args)
    {
    // deklarira niz cijelih brojeva.
    Student arr;

    // dodjeljivanje memorije za 5 objekata tipa Student.
    arr = novi učenik;

    // inicijalizira prve elemente niza
    arr = novi Student(1,"aman");

    // inicijalizira druge elemente niza
    arr = novi Student(2,"vaibhav");

    // tako dalje...
    arr = novi Student(3,"shikar");
    arr = novi Student(4,"dharmesh");
    arr = novi Student(5,"mohit");

    // pristup elementima navedenog niza
    za (int i = 0; i< arr.length; i++)
    System.out.println("Element na " + i + " : " +
    arr[i].roll_no +" "+ arr[i].name);
    }
    }

    Dobijamo:

    Element u 0: 1 aman Element u 1: 2 vaibhav Element u 2: 3 shikar Element u 3: 4 dharmesh Element u 4: 5 mohit

    Šta se događa ako pokušamo pristupiti elementu izvan niza?
    Kompajler izbacuje izuzetak ArrayIndexOutOfBoundsException koji pokazuje da je nizu pristupljeno na nevažećem indeksu. Indeks je ili negativan ili veći ili jednak veličini niza.

    Multidimenzionalno

    Višedimenzionalni nizovi su nizovi nizova u kojima svaki element sadrži referencu na drugi niz. Kreirano dodavanjem jednog skupa uglastih zagrada () za svaku dimenziju. Pogledajmo primjer:

    Int intArray = novi int; // 2D niz ili matrica int intArray = new int; //3D niz

    klasa multidimenzionalna
    {
    public static void main (args niza)
    {
    // deklarisanje i inicijalizacija 2D niza
    int arr = ( (2,7,9),(3,6,1),(7,4,2) );

    // ispis 2D niza
    za (int i=0; i< 3 ; i++)
    {
    za (int j=0; j< 3 ; j++)
    System.out.print(arr[i][j] + " ");

    System.out.println();
    }
    }
    }

    Izlaz: 2 7 9 3 6 1 7 4 2


    Prosljeđivanje nizova metodi

    Baš kao i varijable, možemo proslijediti nizove metodama.

    // Java program za demonstraciju // prosljeđivanje niza u klasu metode Test ( // Metoda drajvera public static void main(String args) ( int arr = (3, 1, 2, 5, 4); // prosljeđivanje niza metodi m1 sum(arr); ) public static void sum(int arr) ( // dobivanje sume vrijednosti niza int sum = 0; for (int i = 0; i< arr.length; i++) sum+=arr[i]; System.out.println("sum of array values: " + sum); } }

    Na izlazu dobijamo:

    zbir vrijednosti niza: 15

    Vraćanje nizova iz metoda

    Kao i obično, metoda također može vratiti niz. Na primjer, program ispod vraća niz iz m1 metode.

    // Java program za demonstraciju // povratak niza iz klase metode Test ( // Metoda drajvera public static void main(String args) ( int arr = m1(); for (int i = 0; i< arr.length; i++) System.out.print(arr[i]+" "); } public static int m1() { // returning array return new int{1,2,3}; } }

    Objekti klase

    Svaki niz ima pridruženi objekt klase koji se dijeli sa svim drugim nizovima s istim tipom komponente.

    // Java program za demonstraciju // Class Objects for Arrays class Test ( public static void main(String args) ( int intArray = new int; byte byteArray = new byte; short shortsArray = new short; // niz nizova String strArray = novi string; System.out.println(intArray.getClass()); System.out.println(intArray.getClass().getSuperclass()); System.out.println(byteArray.getClass()); System.out. println(shortsArray.getClass()); System.out.println(strArray.getClass()); ) )

    klasa +" "); ) ) )

    Klon višedimenzionalnog niza (kao što je Object) je kopija, što znači da stvara samo jedan novi niz sa svakim elementom i referencom na originalni niz elemenata, ali se ugniježđeni nizovi dijele.

    // Java program za demonstraciju // kloniranje višedimenzionalnih nizova klase Test ( public static void main(String args) ( int intArray = ((1,2,3),(4,5)); int cloneArray = intArray. clone(); // će ispisati false System.out.println(intArray == cloneArray); // će ispisati true kada se napravi plitka kopija // tj. podnizovi se dijele System.out.println(intArray == cloneArray) ; System.out.println(intArray == cloneArray); ) )

    Niz je moćan alat koji vam omogućava rad s velikim količinama podataka. Očigledno, ako trebate pohraniti, na primjer, 100 vrijednosti negdje dok vaš kod radi, onda je pravljenje istog broja varijabli za ovo u najmanju ruku nerazumno. Niz vam omogućava da pohranite veliki broj vrijednosti pod jednim imenom i pristupite im pomoću odgovarajućeg indeksa. Koncept nizova je kamen temeljac učenja Jave za početnike. Na kraju krajeva, oni su osnova za mnoge strukture podataka.

    Budući da je Java prvenstveno OOP, ima jednu karakterističnu osobinu u odnosu na nizove u drugim programskim jezicima - oni su predstavljeni kao objekti. Između ostalih prednosti, ovo eliminira potrebu za praćenjem čišćenja memorije, budući da se ona automatski oslobađa.

    Kreiranje i manipulisanje jednodimenzionalnim nizovima

    Jednodimenzionalni niz je klasičan i predstavlja kolekciju elemenata povezanih sa zajedničkim imenom, od kojih svaki odgovara određenom indeksu. Metoda za deklarisanje niza prikazana je na slici ispod.

    Prvo se deklarira tip Java niza, koji definira tip vrijednosti pohranjenih u njemu. Može biti bilo šta važeće u Next dolazi ime niza i uglaste zagrade koje govore kompajleru da je ova varijabla niz. Imajte na umu jednu važnu činjenicu. može se postaviti ili iza osnovnog tipa niza ili iza imena niza. Nakon znaka jednakosti, naznačuje se novi operator, koji inicira dodjelu memorije za niz (isto kao u slučaju objekata), tip elemenata koji će biti pohranjen u njemu (mora biti kompatibilan sa deklariranim osnovnim tipom ranije), i, konačno, njihov broj , naveden u uglastim zagradama.

    Numerisanje elemenata u Java nizu počinje od 0. Dakle, indeks prvog elementa u ovom nizu će biti 0, a šestog - 5. Da se odnosi na određeni element niza, na primer, peti, samo označite ime niza i indeks elementa u uglastim zagradama pored imena. Na ovaj način možete i dodijeliti vrijednost elementu i dohvatiti ga. Međutim, trebali biste biti oprezni jer ako proslijedite indeks na kojem element ne postoji, doći će do greške.

    Višedimenzionalni nizovi u Javi

    Višedimenzionalni nizovi su redovi jednodimenzionalnih nizova koji su referencirani elementima drugih nizova. Drugim riječima, najjednostavniji među njima su dvodimenzionalni. Koristeći njihov primjer, pokušat ćemo razumjeti koncept. Radi jasnoće, slika ispod prikazuje sintaksu i dijagram koji opisuju strukturu dvodimenzionalnog niza.

    Kao što vidite, sintaksa se ne razlikuje mnogo od jednodimenzionalnih nizova. Pogledajmo strukturu. U prvim zagradama dodijelili smo prostor za 5 elemenata. Ovi elementi nisu ništa drugo nego reference na pojedinačne nizove. Štoviše, veličina svakog od njih određena je brojem u drugim zagradama. Zapravo, analog dvodimenzionalnih nizova u matematici su matrice. Imajte na umu da je pored elemenata u memoriji dodijeljeno posebno mjesto gdje se pohranjuje vrijednost dužine niza (dužina). Obično se rad sa višedimenzionalnim nizovima obavlja pomoću ugniježđenih for petlji.

    Nepravilni nizovi

    Dvodimenzionalni niz je niz nizova. To smo već otkrili. Ali mogu li nizovi koje sadrži imati različite dužine? Odgovor je da, mogu. Da bi to uradila, Java pruža mogućnost deklarisanja dvodimenzionalnog niza na poseban način. Na primjer, želimo da kreiramo dvodimenzionalni niz koji će pohraniti tri jednodimenzionalna niza dužine 2, 3 i 4, respektivno. Izjavljuje se na sljedeći način:

    intarr = newint;

    Imajte na umu da nismo uključili broj u drugu zagradu. Određivanje veličine nizova u arr-u se radi ovako:

    Pristupanjem elementu na indeksu 0, koji ukazuje na prvi niz, deklariramo ga da ima dimenziju 2. Element na indeksu 1 će pohraniti niz dimenzije 3, i tako dalje. Prilično je jednostavno.

    Alternativna sintaksa deklaracije java niza

    Također možete inicijalizirati nizove direktno kada ih kreirate. Prilično je jednostavno.

    Obratite pažnju na deklaraciju nizova jerseyNumber i playerName.

    U slučaju dvodimenzionalnih nizova, ova deklaracija izgleda ovako:

    Da biste to učinili, umjesto operatora new otvaraju se vitičaste zagrade u kojima su navedeni svi elementi odvojeni zarezima. Java u ovom slučaju automatski dodjeljuje memoriju za njih i indeksira ih u skladu s tim.

    Nizovi klase pomoćnika

    Za rad sa entitetima kao što su nizovi u Javi, paket java.util ima posebnu klasu pod nazivom Arrays, koja pruža mnoge statičke metode koje znatno olakšavaju rad s njima. Lista glavnih metoda prikazana je na donjoj slici.

    Pogledajmo neke od najkorisnijih metoda Java niza:

    CopyOf (niz, dužina) - vraća kopiju proslijeđenog niza odgovarajuće dužine. Ako je proslijeđena dužina veća od originalnog niza, tada se svi "dodatni" elementi popunjavaju zadanom vrijednošću (0 ako je jednostavan tip i null ako je referentni tip).

    CopyOfRange(niz, prvi indeks, zadnji indeks) - nije prikazano na slici, ali korisna metoda. Kopira dio proslijeđenog niza, definiran odgovarajućim indeksima, počevši od prvog i završavajući s posljednjim.

    Sortiraj (niz) - sortira elemente niza uzlaznim redoslijedom.

    Ispuni (niz, vrijednost) - Popuni proslijeđeni niz odgovarajućom vrijednošću.

    BinarySearch (niz, vrijednost) - vraća indeks na kojem se nalazi element s odgovarajućom vrijednošću u proslijeđenom sortiranom nizu. Ako takav element ne postoji, onda se vraća negativan broj.

    Pošto su metode statične, njihovo pozivanje ne zahtijeva kreiranje instance klase Arrays. Pozivaju se direktno iz njega: Arrays.sort(arr).

    Zaključak

    Pokrili smo najvažnije aspekte u vezi sa nizovima, a za one koji tek počinju da uče Javu za početnike, ovo će biti dovoljno za osnovno razumevanje takvog entiteta kao što je niz i osnovne tehnike rada sa njim. Naravno, praksa će vam dati bolje razumijevanje kako ovaj alat funkcionira. Zato odvojite vrijeme da napravite nekoliko vježbi manipuliranja nizovima na različite načine.

    Pomoćna klasa Array Java se već koristi u "borbenim" uslovima, pa se prvo preporučuje da naučite kako da ručno izvodite sve osnovne operacije sa nizovima.

    Naučili smo kako da kreiramo jednodimenzionalne nizove. Slično, u Javi možete kreirati 2D, 3D, 4D... drugim riječima, višedimenzionalni nizovi. Višedimenzionalni niz u Javi je u suštini niz nizova.

    Popularan primjer upotrebe ove vrste nizova su matrice za čije predstavljanje se koriste dvodimenzionalni nizovi. Dakle, šta je matrica i kako je predstaviti koristeći dvodimenzionalni niz u Javi.

    Matrice i dvodimenzionalni nizovi u Javi

    Matrica je pravokutna tablica koja se sastoji od redova i stupaca na čijem se presjeku nalaze njeni elementi. Broj redova i stupaca matrice određuje njenu veličinu.

    Opšti prikaz veličine matrice m x n(m— broj linija, n — broj kolona) , kao što slijedi:

    Svaki element matrice ima svoj indeks, pri čemu prva znamenka označava broj reda na kojem se element nalazi, a druga broj kolone.

    Pogledajmo primjere specifičnih matrica i kreiramo ih pomoću Jave.

    Matrix A ima dimenziju 2 sa 3 (2 reda, 3 kolone). Kreirajmo dvodimenzionalni niz ove dimenzije:

    Int matrixA; matrixA = new int ;

    Deklarisali smo dvodimenzionalni niz cijelih brojeva (pošto matrica u ovom slučaju sadrži cijele brojeve) i rezervirali memoriju za njega. Da bismo to učinili, koristili smo 2 indeksa: prvi indeks definira red i njegovu veličinu, drugi indeks definira stupac i njegovu veličinu.

    Da biste pristupili elementima dvodimenzionalnog niza, morate koristiti 2 indeksa: prvi za red, drugi za stupac. Kao i kod jednodimenzionalnih nizova, indeksi također počinju od nule. Dakle, numerisanje redova i kolona u tabeli počinje od 0.

    Matrica A = 1; matrica A = -2; matrica A = 3; matrica A = 4; matrica A = 1; matrica A = 7;

    Da biste prikazali matricu na konzoli, morate proći kroz sve elemente koristeći dvije petlje. Broj ciklusa prilikom prolaska kroz elemente niza jednak je njegovoj dimenziji. U našem slučaju, prva petlja se izvodi duž redova, druga - kroz stupove.

    Za (int i = 0; i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); }

    Odnosno, prvo ispisujemo sve elemente prvog reda, odvajajući ih tabulatorom "\t", prekidamo red i ispisujemo sve elemente drugog reda.

    Kompletan kod za matricu A kao što slijedi:

    Javna klasa Matrix ( public static void main(String args) (int matrixA; matrixA = new int; matrixA = 1; matrixA = -2; matrixA = 3; matrixA = 4; matrixA = 1; matrixA = 7; za (int i = 0; i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); } } }

    Za matricu B hajde da iskoristimo pojednostavljena metoda inicijalizacije- u trenutku objave. Po analogiji sa jednodimenzionalnim nizovima.

    Int matricaB = ((-9,1,0), (4,1,1), (-2,2,-1) );

    Svaki red u nizu mora biti zatvoren u par vitičastih zagrada i odvojen zarezom.

    Kompletan kod za matricu B:

    Matrica javne klase ( public static void main (String args) ( int matrixB = ( (-9,1,0), (4,1,1), (-2,2,-1) ); for (int i = 0;i< 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixB[i][j] + "\t"); } System.out.println(); } } }

    Hajde da razmotrimo inicijalizacija u petlji za dvodimenzionalni niz koristeći tablicu množenja kao primjer.

    Javna klasa Mult ( public static void main(String args) ( // kreirajte dvodimenzionalni niz 10 puta 10 int multiplyTab = new int; // petlja kroz prvu dimenziju for (int i = 0; i< 10; i++) { // цикл по второй размерности for (int j = 0; j < 10; j++) { //инициализация элементов массива multiplyTab[i][j] = (i+1)*(j+1); //вывод элементов массива System.out.print(multiplyTab[i][j] + "\t"); } System.out.println(); } } }

    Ovdje se inicijalizacija elemenata sa vrijednostima tablice množenja kombinira s njihovim izlazom na konzolu u jednom ciklusu.

    Višedimenzionalni i asimetrični nizovi.

    Višedimenzionalni nizovi se kreiraju u Javi na sličan način. Broj uglatih zagrada označava dimenziju.
    Primjeri kreiranja nizova fiksne dužine:

    Int a = novi int;// dvodimenzionalni niz int b = novi int;// trodimenzionalni niz int c = novi int;// četverodimenzionalni niz // itd.

    Međutim, nije potrebno inicijalno specificirati veličinu na svim nivoima; možete odrediti veličinu samo na prvom nivou.

    Int a1 = new int; // dvodimenzionalni niz sa 5 redova

    U ovom slučaju još se ne zna koliko će elemenata biti u svakoj liniji, to se može naknadno odrediti, a niz može sadržavati različit broj elemenata u svakoj liniji, odnosno može se asimetrično. Odredimo broj elemenata u svakoj liniji za niz a1

    A1 = novi int ; a1 = novi int; a1 = novi int; a1 = novi int; a1 = novi int;

    Kao rezultat toga, kada se prikaže na ekranu,

    For(int i = 0; i

    niz će izgledati ovako:

    0
    0 0
    0 0 0
    0 0 0 0
    0 0 0 0 0

    Kada se niz kreira, njegovi elementi se automatski inicijaliziraju na nulu, tako da su u ovom primjeru nule prikazane.

    Vježbe o višedimenzionalnim nizovima u Javi:

    1. Kreirajte niz 5 puta 6 i popunite ga slučajnim brojevima (u rasponu od 0 do 99). Odštampajte treći red na konzoli
    2. Date su matrice C i D dimenzija 3 puta 3 i ispunjene slučajnim brojevima u rasponu od 0 do 99. Sabiranje izvršite odvojeno, a zatim pomnožite matrice jedna s drugom. Iznesite izvorne matrice i rezultate proračuna na konzolu.
    3. Zbrojite sve elemente dvodimenzionalnog niza.
    4. Dat je dvodimenzionalni niz koji sadrži negativne i pozitivne brojeve. Prikažite brojeve onih ćelija polja koje sadrže negativne brojeve.
    5. Sortirajte elemente u redovima dvodimenzionalnog niza uzlaznim redoslijedom

    Najbolji članci na ovu temu