Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Greške
  • Knjižnica za rad s java nizovima. Višedimenzionalni i asimetrični nizovi

Knjižnica za rad s java nizovima. Višedimenzionalni i asimetrični nizovi

  • Java,
  • Algoritmi
    • Tutorial

    Mislim da će malo tko od onih koji se pripremaju za svoj prvi intervju, prilikom prijave na prvi posao (pre)junior programera, na ovo pitanje odgovoriti niječno. Ili barem posumnjati u pozitivan odgovor. Naravno, takva jednostavna struktura podataka s izravnim 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 biti su mnogo više od samog niza. Ali to nije ono o čemu govorimo, već o "tradicionalnoj" implementaciji nizova u obliku "čvrstog područja memorije". U tom slučaju se na temelju indeksa i veličine jednog elementa jednostavno izračuna adresa i pristupi odgovarajućoj vrijednosti. Što je tu tako teško?
    Hajdemo shvatiti. Na primjer, u Javi. Tražiti od podnositelja zahtjeva da ništa ne sumnja da stvori niz cijelih brojeva n x n. Osoba samouvjereno piše nešto poput:
    int g = novo int[n][n];
    Sjajno. Sada vas molimo da nečim inicijalizirate elemente niza. Barem u jedinicama, barem kao zbroj indeksa. Dobivamo:
    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đer razlog za razgovor, ali sada govorimo o nečem drugom. Pokušavamo saznati što osoba zna i vidjeti kako razmišlja. Stoga mu skrećemo pozornost na činjenicu da su vrijednosti smještene simetrično i molimo ga 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 ističuć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 program raditi?. Uobičajeno razmišljanje je sljedeće: gotovo 2 puta manje izračuna indeksa; gotovo 2 puta manje izračuna vrijednosti (zbrajanje); isti broj zadataka. To znači 30 posto brže Ako osoba ima dobru matematičku pozadinu, tada čak možete vidjeti točan broj spremljenih operacija i obrazloženiju procjenu učinkovitosti optimizacije.
    Sada je vrijeme za glavni udarac. Pokrećemo obje verzije koda na nekoj dovoljno velikoj vrijednosti n(oko nekoliko tisuća), na primjer, ovako.

    Vremenski kontrolirani kod

    klasa A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one 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"); } }


    Što vidimo? Optimizirana verzija radi 10-100 puta sporije! Sada je vrijeme da promatrate reakciju kandidata na poziciju. Kakva će biti reakcija na neuobičajenu (točnije, uobičajenu u praksi programera) stresnu situaciju. Ako optuženikovo lice pokazuje uzbuđenje i on počne pritiskati gumbe, privremeno zaboravljajući na vaše postojanje, onda je to dobar znak. U određenoj mjeri. Ne želite valjda angažirati istraživača kojem nije stalo do ishoda projekta? Onda mu nemojte postavljati pitanje "Zašto?" Zamolite ih da prerade drugu opciju tako da stvarno radi brže od prve.
    Sada se neko vrijeme možete sigurno baviti svojim poslom. Za pola sata imat ćete dovoljno materijala za procjenu osnovnih osobnih i profesionalnih kvaliteta kandidata.
    Usput, kada sam ukratko opisao ovaj problem na svojoj radnoj web stranici, najpopularniji komentar bio je "Ovo je tvoja Java krivulja." Posebno za njih objavljujem kôd na Great and Free. A sretni vlasnici Free Pascala za Windows mogu pogledati

    ispod spojlera

    vrijeme programa; koristi Windows; var start, end, res: int64; n, i, j: cijeli broj; g: Niz niza cijelih brojeva; početak n:= 10000; Postavi duljinu(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); za i:=1 do n-1 učiniti za j:=1 do n-1 učiniti g := i + j; QueryPerformanceCounter(finish); writeln("Vrijeme po redovima:", (finish - start) / res, " sec"); QueryPerformanceCounter(start); za i:=1 do n-1 učiniti za j:=1 do n-1 učiniti g := i + j; QueryPerformanceCounter(finish); writeln("Vrijeme po stupcima:", (finish - start) / res, " sec"); kraj.


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

    Ako postoji potreba za dubljim proučavanjem implementacije Jave, molimo podnositelja zahtjeva da promatra vrijeme izvršenja za male vrijednosti n. Na primjer, na ideone.com za n=117, opcija "optimizirano" je upola sporija. Ali za sljedeću vrijednost n=118 ispada da je već 100 (sto) puta brži od neoptimiziranog! Predložite eksperimentiranje na lokalnom računalu. Neka se igra s postavkama.
    Usput, razumiju li svi što se događa?

    Nekoliko riječi opravdanja

    Želio bih reći nekoliko riječi da opravdam ovaj način angažiranja intervjua. Da, ne ispitujem poznavanje sintakse jezika i poznavanje struktura podataka. Možda na civiliziranom tržištu rada sve ovo funkcionira. Ali u našim uvjetima totalnog nedostatka kvalificiranog kadra, moramo procijeniti dugoročnu primjerenost kandidata za posao s kojim će se suočiti. Oni. sposobnost učenja, proboja, razumijevanja, djelovanja.
    Ovo je u duhu slično "intervjuu" za regrutiranje legionara u starom Rimu. Budući ratnik bio je jako prestrašen i gledao hoće li pocrvenjeti ili problijediti. Ako problijedi, tada u stresnoj situaciji krv curi iz glave podnositelja zahtjeva i on je sklon pasivnoj reakciji. Na primjer, nesvjestica. Ako je podnositelj zahtjeva pocrvenio, onda mu je krv pojurila u glavu. Oni. sklon je aktivnim akcijama i srljanju u tučnjave. Ovaj se smatrao prikladnim.
    Pa, još jedna stvar. Zašto sam svima rekao za ovaj zadatak umjesto da sam ga nastavio koristiti u intervjuima? Samo što su potencijalni kandidati već "naučili" ovaj zadatak i moraju koristiti druge.
    Zapravo, obratio sam pažnju na ovaj efekt upravo u vezi sa pravim zadatkom obrade slike. Situacija je bila pomalo zbunjujuća i nisam odmah shvatio zašto je moj fps toliko pao nakon refaktoriranja. Općenito, svatko vjerojatno ima puno takvih prekrasnih trenutaka.

    Zasad je vodeća verzija da je za to kriva predmemorija procesora. Oni. sekvencijalni pristup u prvoj opciji radi unutar hash-a koji se ažurira kada prijeđete preko određene granice. Kod pristupa po stupcima, hash se mora stalno ažurirati i to oduzima puno vremena. Pogledajmo ovu verziju u najčišćem obliku. Kreirajmo niz i usporedimo što 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 obično je osjetno brži. Što to znači?
    Ovdje mi je sasvim ispravno istaknuto (Big_Lebowski) da preuređivanje petlji mijenja rezultate u korist sekvencijalne opcije. Radi čistoće eksperimenta, morao sam postaviti ciklus zagrijavanja. U isto vrijeme, napravio sam nekoliko ponavljanja kako bih dobio prosječno vrijeme rada kako je Leventov savjetovao. Ispalo je ovako ideone.com/yN1H4g. Oni. Nasumični pristup elementima velikog niza je ~10% sporiji od sekvencijalnog pristupa. Možda predmemorija zapravo može igrati neku ulogu. Međutim, u izvornoj situaciji izvedba je značajno pala. Dakle postoji još nešto.

    Postupno, verzija o dodatnim radnjama pri prelasku iz jednog retka niza u drugi postaje lider. I to je ispravno. Ostaje nam otkriti što se tamo točno događa.

    Oznake:

    • 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. Obavijest

    int ia = novi int;

    Definira niz pod nazivom ia koji inicijalno pokazuje na skup od tri elementa tipa int.

    Deklaracija polja ne označava njegovu dimenziju. Broj elemenata niza naveden je kada se kreira pomoću novog operatora. Duljina niza je fiksna u trenutku stvaranja i ne može se kasnije mijenjati. Međutim, varijabla tip polja (u našem primjeru – ia) novi niz s drugom dimenzijom može se dodijeliti bilo kada.

    Elementima niza se pristupa vrijednostima njihovih indeksnih brojeva.

    Prvi element niza ima indeks nula (0), a zadnji ima duljinu 1. Elementu niza se pristupa navođenjem naziva niza i vrijednosti indeksa, u uglatim zagradama, [ i ]. u prethodnom primjeru, prvi element niza ia bit će ia, a posljednji element ia. Kad god se elementu niza pristupi putem indeksa, Java runtime provjerava je li vrijednost indeksa unutar prihvatljivih granica i izbacuje iznimku tipa ArrayIndexOutOfBoundsException ako je rezultat provjere lažan. 6 Izraz indeksa mora biti tipa int - to je jedina stvar koja ograničava maksimalan broj elemenata niza.

    Duljina niza može se lako odrediti pomoću polja duljine objekta niza (koje je implicitno opremljeno atributima public i final). Ispod je ažurirani kod iz prethodnog primjera, koji omogućava izvršavanje petlje koja osigurava da se sadržaj svakog elementa niza ia prikazuje na ekranu:

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

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

    Obično se poziva niz nulte duljine (tj. onaj koji nema elemenata). prazan. Imajte na umu da su nulta referenca polja i prazna referenca polja dvije potpuno različite stvari. Prazan niz je pravi niz koji jednostavno nema elemenata. Prazan niz pruža prikladnu alternativu za null kada se vraća iz metode. Ako metoda može vratiti null, aplikacijski kod koji poziva metodu mora usporediti vraćenu vrijednost s null prije nastavka s preostalim operacijama. Ako metoda vrati niz (eventualno prazan), nisu potrebne nikakve dodatne provjere - naravno, osim onih koje se tiču ​​duljine niza, a koje u svakom slučaju treba izvršiti.

    Dopušten je i drugi oblik deklaracije niza, u kojem se uglate zagrade navode nakon identifikatora niza, a ne iza naziva njegovog tipa:

    int ia = novi int;

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

    Modifikatori u deklaracijama polja

    Pravila za korištenje određenih nizova u deklaracijama modifikatori su uobičajeni i ovise samo o tome kojoj kategoriji niz pripada - poljima ili lokalnim varijablama. Postoji jedna stvar koju je važno zapamtiti - modifikatori se odnose 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 mijenjati nakon njegovog stvaranja, ali ni na koji način ne zabranjuje mogućnost promjene sadržaja pojedinačnih elemenata niza. Jezik vam ne dopušta navođenje modifikatora (recimo, final ili final) za elemente niza.

    Višedimenzionalni nizovi

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

    float mat = novi plovak;

    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 izrade niza, mora se navesti barem njegova prva, "krajnja lijeva" dimenzija. Druge dimenzije možda neće biti navedene - u ovom slučaju će se morati odrediti kasnije. Navođenje svih dimenzija odjednom u novom operatoru najsažetiji je način za stvaranje niza, što vam omogućuje da izbjegnete potrebu za upotrebom dodatnih novih operatora. Izraz za deklariranje i stvaranje gornjeg polja mat ekvivalentan je sljedećem isječku koda:

    float mat = novi plovak;

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

    mat[y] = novi float;

    Ovaj oblik deklaracije ima prednost što, uz dobivanje nizova istih dimenzija (recimo 4 x 4), omogućuje izgradnju nizova nizova različitih dimenzija potrebnih za pohranjivanje određenih nizova podataka.

    Inicijaliziranje nizova

    Kada se stvori polje, svaki element prima zadanu vrijednost ovisno o vrsti polja: 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šavanja prvog izraza koji sadrži novi operator, varijabla attrs imat će referencu na niz od 12 varijabli koje su inicijalizirane na null. Sami objekti Attr bit će stvoreni samo kako petlja napreduje.

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

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

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

    Opasnosti niza = novi niz; opasnosti = "Lavovi";

    opasnosti = "Tigrovi";

    opasnosti = "Medvjedi";

    Prvi oblik, koji navodi popis inicijalizatora u vitičastim zagradama, ne zahtijeva eksplicitnu upotrebu novog operatora - neizravno ga poziva sustav za izvršavanje. Duljina niza u ovom slučaju određena je brojem vrijednosti inicijalizatora. Također je moguće eksplicitno navesti novi operator, ali dimenziju i dalje treba izostaviti; kao i prije, nju određuje sustav izvršenja:

    String opasnosti = 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" ));

    Ovako kreiran niz bez naslova naziva se anoniman(anonimno).

    Nizovi nizova mogu se inicijalizirati ugniježđenim nizovima početnih vrijednosti. Ispod je primjer deklaracije niza koji sadrži prvih nekoliko redaka tzv Pascalov trokut gdje je svaki redak opisan vlastitim nizom vrijednosti.

    int pascalsTriangle = (

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

    Indeksi višedimenzionalnih nizova poredani su od vanjskog prema unutarnjem. Tako, na primjer, pascalsTriangle);

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

    razreda GFG
    {

    {

    int arr;

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


    arr = 10;


    arr = 20;

    //i 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 dobivamo:

    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 podatkovni elementi kako slijedi:

    Student arr = novi student;

    StudentArray sadrži sedam memorijskih elemenata svake klase učenika, u kojima se mogu pohraniti adrese sedam objekata učenika. Studentski objekti moraju biti kreirani korištenjem studentskog konstruktora klase, a njihove reference moraju biti dodijeljene elementima niza na sljedeći način:

    Student arr = novi student;

    // Java program za ilustraciju stvaranja niza
    // objekti

    razreda Učenik
    {
    public int roll_no;
    javno ime niza;
    Student(int roll_no, String name)
    {
    this.roll_no = roll_no;
    this.name = ime;
    }
    }

    // Elementi polja su objekti klase Student.
    javna klasa GFG
    {
    public static void main (String args)
    {
    // deklarira niz cijelih brojeva.
    Student arr;

    // dodjeljivanje memorije za 5 objekata tipa Student.
    arr = novi student;

    // inicijalizirati prve elemente niza
    arr = novi student(1,"aman");

    // inicijalizirati druge elemente niza
    arr = novi učenik(2,"vaibhav");

    //i tako dalje...
    arr = novi učenik(3,"shikar");
    arr = novi učenik(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].naziv);
    }
    }

    Dobivamo:

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

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

    Višedimenzionalno

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

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

    višedimenzionalni razred
    {
    public static void main(String args)
    {
    // deklariranje i inicijaliziranje 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 klasi metode Test ( // Metoda upravljačkog programa 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 zbroja vrijednosti polja int sum = 0; for (int i = 0; i< arr.length; i++) sum+=arr[i]; System.out.println("sum of array values: " + sum); } }

    Na izlazu dobivamo:

    zbroj vrijednosti polja: 15

    Vraćanje nizova iz metoda

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

    // Java program za demonstraciju // povratak niza iz klase metode Test ( // Metoda upravljačkog programa 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 istom vrstom 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 niz; 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 Objekt) je kopija, što znači da stvara samo jedan novi niz sa svakim elementom i referencom na izvorni niz elemenata, ali ugniježđeni nizovi se dijele.

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

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

    Budući da je Java prvenstveno OOP, ima jednu karakterističnu značajku u usporedbi s nizovima u drugim programskim jezicima - oni su predstavljeni kao objekti. Između ostalih prednosti, ovo eliminira potrebu za praćenjem čišćenja memorije, jer se ona automatski oslobađa.

    Stvaranje i manipuliranje jednodimenzionalnim nizovima

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

    Prvo se deklarira vrsta polja Java, koja definira vrstu vrijednosti pohranjenih u njemu. Može biti bilo što valjano u Sljedeće dolazi naziv niza i uglate zagrade govoreći prevoditelju da je ova varijabla niz. Imajte na umu važnu činjenicu. može se postaviti ili iza osnovnog tipa niza ili iza imena niza. Nakon znaka jednakosti naznačen je novi operator koji inicira dodjelu memorije za niz (isto kao i kod objekata), tip elemenata koji će biti pohranjeni u njemu (mora biti kompatibilan s deklariranim osnovnim tipom) ranije), i na kraju njihov broj, naveden u uglatim zagradama.

    Numeriranje elemenata u Java nizu počinje od 0. Dakle, indeks prvog elementa u ovom nizu bit će 0, a šesti - 5. Da biste se pozvali na određeni element niza, na primjer, peti, samo uz naziv u uglastim zagradama navesti naziv niza i indeks elementa. Na ovaj način možete i dodijeliti vrijednost elementu i dohvatiti ga. Međutim, treba biti oprezan jer ako proslijedite indeks na kojem element ne postoji, doći će do pogreške.

    Višedimenzionalni nizovi u Javi

    Višedimenzionalni nizovi su redovi jednodimenzionalnih nizova na koje referenciraju elementi drugih nizova. Drugim riječima, najjednostavniji među njima su dvodimenzionalni. Na njihovom primjeru pokušat ćemo razumjeti koncept. Radi jasnoće, donja slika 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 više od referenci 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 osim elemenata u memoriji dodijeljeno zasebno mjesto gdje se pohranjuje vrijednost duljine niza (duljina). Obično se rad s višedimenzionalnim nizovima vrši 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 duljine? Odgovor je da, mogu. Da biste to učinili, Java pruža mogućnost deklariranja dvodimenzionalnog niza na poseban način. Na primjer, želimo stvoriti dvodimenzionalni niz koji bi pohranio tri jednodimenzionalna niza duljine 2, 3 i 4, redom. Deklariše 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 radi se ovako:

    Pristupom elementu s indeksom 0, koji pokazuje na prvi niz, proglašavamo ga dimenzijom 2. Element s indeksom 1 pohranit će niz s dimenzijom 3, i tako dalje. Sasvim je jednostavno.

    Alternativna sintaksa deklaracije niza Java

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

    Obratite pozornost na deklaraciju nizova jerseyNumber i playerName.

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

    Da biste to učinili, umjesto novog operatora otvaraju se vitičaste zagrade u kojima su navedeni svi elementi odvojeni zarezima. Java im u ovom slučaju automatski dodjeljuje memoriju i prema tome ih indeksira.

    Pomoćna klasa Arrays

    Za rad s entitetima kao što su nizovi u Javi, paket java.util ima posebnu klasu pod nazivom Arrays, koja pruža mnoge statičke metode koje rad s njima čine mnogo lakšim. Popis glavnih metoda prikazan je na donjoj slici.

    Pogledajmo neke od najkorisnijih metoda Java polja:

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

    CopyOfRange(array, first index, last index) - nije prikazano na slici, ali korisna metoda. Kopira dio proslijeđenog niza, definiran odgovarajućim indeksima, počevši s prvim i završavajući s posljednjim.

    Sortiraj (niz) - sortira elemente niza uzlaznim redoslijedom.

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

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

    Budući da su metode statične, njihovo pozivanje ne zahtijeva stvaranje instance klase Arrays. Pozivaju se izravno iz njega: Arrays.sort(arr).

    Zaključak

    Pokrili smo najvažnije aspekte u vezi s nizovima, a za one koji tek počinju učiti Javu za početnike, ovo će biti dovoljno za osnovno razumijevanje takvog entiteta kao što je niz i osnovnih tehnika za rad s njim. Naravno, praksa će vam dati više razumijevanja o tome kako ovaj alat radi. Stoga odvojite vrijeme za nekoliko vježbi manipuliranja nizovima na različite načine.

    Pomoćna klasa Array Java već se koristi u "borbenim" uvjetima, pa se prvo preporučuje naučiti kako ručno izvoditi sve osnovne operacije s nizovima.

    Naučili smo kako izraditi 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 biti niz nizova.

    Popularan primjer korištenja ove vrste nizova su matrice, za čije se predstavljanje koriste dvodimenzionalni nizovi. Dakle, što je matrica i kako je predstaviti pomoću dvodimenzionalnog niza u Javi.

    Matrice i dvodimenzionalni nizovi u Javi

    Matrica je pravokutna tablica koja se sastoji od redaka i stupaca na čijem sjecištu se nalaze njeni elementi. Broj redaka i stupaca matrice određuje njezinu veličinu.

    Opći pogled na veličinu matrice m x n(m— broj linija, n — broj stupaca) , kako slijedi:

    Svaki element matrice ima svoj indeks, gdje prva znamenka označava broj retka u kojem se element nalazi, a druga znamenka označava broj stupca.

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

    Matrica A ima dimenziju 2 puta 3 (2 retka, 3 stupca). Kreirajmo dvodimenzionalni niz ove dimenzije:

    Int matricaA; matricaA = novo int;

    Deklarirali smo dvodimenzionalni niz cijelih brojeva (budući da matrica u ovom slučaju sadrži cijele brojeve) i za njega rezervirali memoriju. 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 redak, drugi za stupac. Kao i kod jednodimenzionalnih nizova, indeksi također počinju od nule. Stoga numeriranje redaka i stupaca u tablici počinje od 0.

    MatricaA = 1; matricaA = -2; matricaA = 3; matricaA = 4; matricaA = 1; matricaA = 7;

    Da biste prikazali matricu na konzoli, morate proći kroz sve elemente pomoću dvije petlje. Broj ciklusa pri prolasku kroz elemente niza jednak je njegovoj dimenziji. U našem slučaju, prva petlja se izvodi duž redaka, druga - kroz stupce.

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

    To jest, prvo ispisujemo sve elemente prvog retka, odvajajući ih tabulatorom "\t", prekidamo red i ispisujemo sve elemente drugog retka.

    Kompletan kod za matricu A kako slijedi:

    Javna klasa Matrica ( public static void main(String args) ( int matrixA; matrixA = new int; matrixA = 1; matrixA = -2; matrixA = 3; matrixA = 4; matrixA = 1; matrixA = 7; for (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 iskoristimo pojednostavljena metoda inicijalizacije- u trenutku objave. Po analogiji s jednodimenzionalnim nizovima.

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

    Svaki redak u nizu mora biti u paru 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(); } } }

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

    Javna klasa Mult ( public static void main(String args) ( // stvorite dvodimenzionalni niz 10 x 10 int multiplyTab = new int; // petlja kroz prvu dimenziju za (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 s vrijednostima tablice množenja kombinira s njihovim izlazom na konzolu u jednom ciklusu.

    Višedimenzionalni i asimetrični nizovi.

    Višedimenzionalni nizovi se stvaraju u Javi na sličan način. Broj uglatih zagrada označava dimenziju.
    Primjeri stvaranja nizova fiksne duljine:

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

    Međutim, nije potrebno inicijalno odrediti veličinu na svim razinama; veličinu možete odrediti samo na prvoj razini.

    Int a1 = new int; // dvodimenzionalni niz s 5 redaka

    U tom slučaju se još ne zna koliko će elemenata biti u svakom retku, to se može utvrditi naknadno, a niz može sadržavati različiti broj elemenata u svakom retku, tj. asimetričan. Odredimo broj elemenata u svakom retku 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,

    Za (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 stvori niz, njegovi se elementi automatski inicijaliziraju na nulu, pa se u ovom primjeru prikazuju nule.

    Vježbe na višedimenzionalnim nizovima u Javi:

    1. Napravite niz 5 x 6 i ispunite ga nasumičnim brojevima (u rasponu od 0 do 99). Ispišite treći red na konzoli
    2. Zadane su matrice C i D dimenzija 3 x 3 ispunjene nasumičnim brojevima u rasponu od 0 do 99. Zbrajanje izvršite odvojeno, a zatim pomnožite matrice jedna s drugom. Ispis izvornih matrica i rezultata izračuna u konzolu.
    3. Zbrojite sve elemente dvodimenzionalnog niza.
    4. Zadan je dvodimenzionalni niz koji sadrži negativne i pozitivne brojeve. Prikažite brojeve onih ćelija polja koje sadrže negativne brojeve.
    5. Poredajte elemente u redovima dvodimenzionalnog niza uzlaznim redoslijedom

    Najbolji članci na temu