Cum se configurează smartphone-uri și PC-uri. Portal informativ
  • Acasă
  • Erori
  • Bibliotecă pentru lucrul cu matrice java. Rețele multidimensionale și asimetrice

Bibliotecă pentru lucrul cu matrice java. Rețele multidimensionale și asimetrice

  • Java,
  • Algoritmi
    • Tutorial

    Cred că puțini dintre cei care se pregătesc pentru primul lor interviu, atunci când aplică pentru primul loc de muncă ca programator (pre)junior, vor răspunde negativ la această întrebare. Sau măcar să te îndoiești de răspunsul pozitiv. Desigur, o structură de date atât de simplă cu acces direct la index - fără trucuri! Nu, în unele limbi precum JavaScript sau PHP, matricele sunt, desigur, implementate într-un mod foarte interesant și sunt în esență mult mai mult decât o matrice. Dar nu despre asta vorbim, ci despre implementarea „tradițională” a matricelor sub forma unei „zone solide de memorie”. În acest caz, pe baza indicilor și a dimensiunii unui element, adresa este pur și simplu calculată și se accesează valoarea corespunzătoare. Ce este atât de greu la asta?
    Să ne dăm seama. De exemplu, în Java. Cererea unui solicitant nebănuit să creeze o serie de numere întregi n X n. Persoana scrie cu încredere ceva de genul:
    int g = nou int[n][n];
    Grozav. Acum vă cerem să inițializați elementele matricei cu ceva. Cel puțin în unități, cel puțin ca sumă de indici. Primim:
    for(int i = 0; i< n; i++) { for(int j = 0; j < n; j++) { g[i][j] = i + j; } }
    Ei chiar scriu mai des
    for(int i = 0; i< g.length; i++) { for(int j = 0; j < g[i].length; j++) { g[i][j] = i + j; } }
    care este și un motiv de conversație, dar acum vorbim despre altceva. Încercăm să aflăm ce știe o persoană și să vedem cum gândește. Prin urmare, îi atragem atenția asupra faptului că valorile sunt situate simetric și îi rugăm să economisească pe iterațiile buclei. Desigur, de ce să treci prin toate valorile indexului când poți trece doar prin triunghiul de jos? Subiectul este de obicei ușor de acord și evidențiind cu înțelepciune diagonala principală, scrie cu atenție ceva de genul:
    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; } }
    În loc de g[i][i] = 2* i; scris adesea g[i][i] = i + i; sau g[i][i] = i<< 1; и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Cât de repede va rula programul?. Raționamentul obișnuit este următorul: de aproape 2 ori mai puține calcule ale indicilor; de aproape 2 ori mai puține calcule ale valorilor (însumarea); același număr de sarcini. Aceasta înseamnă cu 30 la sută mai rapid.Dacă o persoană are un fundal bun în matematică, atunci puteți chiar să vedeți numărul exact de operațiuni salvate și o evaluare mai motivată a eficacității optimizării.
    Acum este timpul pentru lovitura principală. Rulăm ambele versiuni ale codului pe o valoare suficient de mare n(aproximativ câteva mii), de exemplu, așa.

    Cod controlat de timp

    clasa 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"); } }


    Ce vedem? Versiunea optimizată funcționează de 10-100 de ori mai lent! Acum este momentul să observăm reacția candidatului la poziție. Care va fi reacția la o situație stresantă neobișnuită (mai precis, obișnuită în practica dezvoltatorului). Dacă fața inculpatului arată emoție și începe să apese butoane, uitând temporar de existența ta, atunci acesta este un semn bun. Până la un punct. Nu vrei să angajezi un cercetător căruia nu-i pasă de rezultatul proiectului, nu? Atunci nu-i pune întrebarea „De ce?” Cereți-le să reproșeze a doua opțiune, astfel încât să funcționeze de fapt mai repede decât prima.
    Acum puteți să vă ocupați de afacerea dvs. în siguranță pentru o perioadă. În jumătate de oră veți avea suficient material pentru a evalua calitățile personale și profesionale de bază ale solicitantului.
    Apropo, când am descris pe scurt această problemă pe site-ul meu de muncă, cel mai popular comentariu a fost „Aceasta este curba ta Java”. Postez codul pe Great și Free special pentru ei. Și proprietarii fericiți de Free Pascal pentru Windows pot arunca o privire

    sub spoiler

    Ora programului; folosește Windows; var start, finish, res: int64; n, i, j: întreg; g: Array of Array of Integer; începe n:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); pentru i:=1 la n-1 face pentru j:=1 la n-1 face g:= i + j; QueryPerformanceCounter(terminare); writeln("Timp pe rânduri:", (terminare - început) / res, " sec"); QueryPerformanceCounter(start); pentru i:=1 la n-1 face pentru j:=1 la n-1 face g:= i + j; QueryPerformanceCounter(terminare); writeln("Timp prin coloane:", (terminare - start) / res, " sec"); Sfârşit.


    În codul de mai sus în Pascal, am eliminat aspectele „confuze” și am lăsat doar esența problemei. Dacă aceasta poate fi numită o problemă.
    Ce întrebări ajungem să punem inculpatului?
    1. De ce funcționează mai lent? Și mai detaliat...
    2. Cum se face inițializarea mai rapidă?

    Dacă este nevoie să aprofundăm implementarea Java, atunci solicităm solicitantului să respecte timpul de execuție pentru valori mici. n. De exemplu, pe ideone.com pentru n=117, opțiunea „optimizată” este pe jumătate mai lentă. Dar pentru următoarea valoare n=118 se dovedește a fi deja de 100 (o sută) de ori mai rapidă decât cea neoptimizată! Sugerați să experimentați pe o mașină locală. Lasă-l să se joace cu setările.
    Apropo, toată lumea înțelege ce se întâmplă?

    Câteva cuvinte de justificare

    Aș dori să spun câteva cuvinte pentru a justifica această metodă de angajare a interviurilor. Da, nu testez cunoștințele despre sintaxa limbajului și cunoștințele structurilor de date. Poate că, pe o piață a muncii civilizată, totul funcționează. Dar în condițiile noastre de lipsă totală de personal calificat, trebuie să evaluăm mai degrabă adecvarea pe termen lung a solicitantului pentru munca cu care se va confrunta. Acestea. capacitatea de a învăța, de a străpunge, de a înțelege, de a face.
    Acest lucru este similar în spirit cu „interviul” pentru recrutarea legionarilor în Roma antică. Viitorul războinic a fost foarte speriat și a privit să vadă dacă roșește sau păliște. Dacă devine palid, atunci într-o situație stresantă sângele se scurge din capul solicitantului și este predispus la o reacție pasivă. De exemplu, leșinul. Dacă solicitantul s-a înroșit, atunci sângele i-a urcat în cap. Acestea. este predispus la acțiuni active și să se grăbească în lupte. Acesta a fost considerat potrivit.
    Ei bine, un ultim lucru. De ce le-am spus tuturor despre această sarcină în loc să o folosesc în continuare în interviuri? Doar că potențialii solicitanți au „învățat” deja această sarcină și trebuie să folosească altele.
    De fapt, am acordat atenție acestui efect tocmai în legătură cu sarcina reală de procesare a imaginii. Situația a fost oarecum confuză și nu am înțeles imediat de ce mi-a scăzut fps-ul atât de mult după refactorizare. În general, oricine are probabil o mulțime de astfel de momente minunate.

    Până acum, versiunea principală este că memoria cache a procesorului este de vină. Acestea. accesul secvențial în prima opțiune funcționează într-un hash, care este actualizat atunci când se depășește o anumită limită. La accesarea pe coloane, hash-ul este forțat să fie actualizat în mod constant și acest lucru necesită mult timp. Să verificăm această versiune în cea mai pură formă. Să creăm o matrice și să comparăm ceea ce este mai rapid - să procesăm toate elementele într-un rând sau să procesăm elementele matricei cu un număr aleatoriu de același număr de ori? Acest program este ideone.com/tMaR2S. Pentru 100.000 de elemente de matrice, accesul aleatoriu este de obicei vizibil mai rapid. Ce înseamnă acest lucru?
    Aici mi s-a subliniat pe bună dreptate (Big_Lebowski) că rearanjarea buclelor schimbă rezultatele în favoarea opțiunii secvenţiale. Pentru puritatea experimentului, a trebuit să stabilesc un ciclu de încălzire. În același timp, am făcut mai multe repetări pentru a obține timpul mediu de funcționare așa cum mi-a recomandat Leventov. A ieșit așa ideone.com/yN1H4g. Acestea. Accesul aleatoriu la elementele unei matrice mari este cu ~10% mai lent decât accesul secvenţial. Poate cache-ul poate juca un rol. Cu toate acestea, în situația inițială, performanța a scăzut semnificativ. Deci mai este ceva.

    Treptat, versiunea despre acțiuni suplimentare atunci când treceți de la un rând al unui tablou la altul devine lider. Și este corect. Rămâne să ne dăm seama ce se întâmplă exact acolo.

    Etichete:

    • Programare
    • matrice
    • memorie
    Adaugă etichete

    Matrice(matrice) _ sunt mulțimi ordonate de elemente de același tip. Elementele unei matrice pot fi obiecte de tipuri simple și de referință, inclusiv Număr și referințe la alte matrice. Matricele în sine sunt obiecte și

    moștenește clasa Object. Anunţ

    int ia = new int;

    Definește o matrice numită ia care indică inițial un set de trei Elemente de tip int.

    Declarația matricei nu indică dimensiunea acesteia. Numărul de elemente ale matricei este specificat atunci când este creat folosind operatorul new. Lungimea matricei este fixă ​​în momentul creării și nu poate fi modificată ulterior. In orice caz, variabil tipul de matrice (în exemplul nostru – ia) o matrice nouă cu o dimensiune diferită poate fi atribuită în orice moment.

    Elementele matricei sunt accesate de valorile numerelor lor de index.

    Primul element de matrice are un indice de zero (0), iar ultimul are lungimea de 1. Un element de matrice este accesat prin specificarea numelui matricei și a valorii indexului, cuprinse între paranteze drepte, [ și ]. în exemplul anterior, primul element al tabloului ia va fi ia, iar ultimul element va fi ia. Ori de câte ori un element de matrice este accesat prin index, timpul de execuție Java verifică dacă valoarea indexului este în limitele acceptabile și aruncă o excepție de tip ArrayIndexOutOfBoundsException dacă rezultatul verificării este fals. 6 Expresia index trebuie să fie de tip int - acesta este singurul lucru care limitează numărul maxim de elemente ale matricei.

    Lungimea unui tablou poate fi determinată cu ușurință folosind câmpul de lungime al obiectului matrice (care este implicit furnizat cu atributele publice și finale). Mai jos este codul actualizat al exemplului anterior, care prevede executarea unei bucle care asigură că conținutul fiecărui element al matricei ia este afișat pe ecran:

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

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

    O matrice de lungime zero (adică una care nu are elemente) este de obicei numită gol. Rețineți că o referință de matrice nulă și o referință de matrice goală sunt două lucruri complet diferite. O matrice goală este o matrice reală care pur și simplu nu are elemente. O matrice goală oferă o alternativă convenabilă la null atunci când se întoarce de la o metodă. Dacă o metodă este capabilă să returneze null, codul aplicației care apelează metoda trebuie să compare valoarea returnată cu null înainte de a continua cu operațiunile rămase. Dacă metoda returnează o matrice (eventual goală), nu sunt necesare verificări suplimentare - desigur, altele decât cele referitoare la lungimea matricei, care ar trebui efectuate în orice caz.

    Este permisă și o altă formă de declarație de matrice, în care parantezele drepte sunt specificate după identificatorul de matrice, și nu după numele tipului său:

    int ia = new int;

    Prima sintaxă, totuși, este considerată de preferat deoarece face declarația de tip mai compactă.

    Modificatori în declarațiile de matrice

    Reguli pentru utilizarea anumitor tablouri în declarații modificatori sunt comune și depind doar de categoria căreia îi aparține tabloul - câmpuri sau variabile locale. Există un lucru care este important de reținut - modificatorii se aplică matricei în sine, dar nu și elementelor sale individuale. Dacă atributul final este specificat într-o declarație de matrice, aceasta înseamnă doar că referința la matrice nu poate fi schimbată după crearea acesteia, dar nu interzice în niciun fel posibilitatea de a modifica conținutul elementelor individuale ale matricei. Limbajul nu vă permite să specificați niciun modificator (să zicem, final sau final) pentru elementele matricei.

    Matrice multidimensionale

    Java acceptă capacitatea de a declara tablouri multidimensionale(matrice multidimensionale) (adică matrice ale căror elemente sunt alte matrice), codul care implică declararea unei matrice bidimensionale și afișarea conținutului elementelor sale ar putea arăta, de exemplu, astfel:

    float mat = float nou;

    setupMatrix(mat);

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

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

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

    system.out.println();

    Când creați o matrice, trebuie specificată cel puțin prima sa dimensiune, „cea mai din stânga”. Este posibil să nu fie specificate alte dimensiuni - în acest caz vor trebui determinate ulterior. Specificarea tuturor dimensiunilor simultan în noul operator este cea mai concisă modalitate de a crea o matrice, permițându-vă să evitați nevoia de a utiliza noi operatori suplimentari. Expresia pentru declararea și crearea matricei mat de mai sus este echivalentă cu următorul fragment de cod:

    float mat = float nou;

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

    mat[y] = flotor nou;

    Această formă de declarație are avantajul că, împreună cu obținerea de tablouri cu aceleași dimensiuni (să zicem, 4 x 4), vă permite să construiți șiruri de tablouri de dimensiuni diferite necesare pentru stocarea anumitor secvențe de date.

    Inițializarea matricelor

    Când este creată o matrice, fiecare element primește o valoare implicită în funcție de tipul matricei: zero (0) pentru tipurile numerice, „\u0000′_ pentru char, false pentru boolean și null pentru tipurile de referință. Prin declararea unui tablou de tip referință, definim de fapt o matrice temporar acest tip. Luați în considerare următorul fragment de cod:

    Attr attrs = Attr nou;

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

    attrs[i] = nou Attr(nume[i], valori[i]);

    După executarea primei expresii care conține noul operator, variabila attrs va avea o referință la o matrice de 12 variabile care sunt inițializate la null. Obiectele Attr în sine vor fi create doar pe măsură ce bucla progresează.

    O matrice poate fi inițializată (în același timp cu declarația sa) prin intermediul unui construct între acolade care listează valorile inițiale ale elementelor sale:

    Pericole șir = ("Lei", "Tigri", "Ursi");

    Următorul fragment de cod va da același rezultat:

    String dangers = String nou; pericole = „Lei”;

    pericole = „Tigri”;

    pericole = „Ursi”;

    Prima formă, care specifică o listă de inițializatori între acolade, nu necesită utilizarea explicită a noului operator - este apelată indirect de sistemul de rulare. Lungimea matricei în acest caz este determinată de numărul de valori de inițializare. De asemenea, este posibil să specificați în mod explicit noul operator, dar dimensiunea ar trebui totuși omisă; ca și înainte, este determinată de sistemul de execuție:

    Pericole șir = new String(„Lei”, „Tigri”, „Ursi”);

    Această formă de declarare și inițializare a unui tablou poate fi utilizată oriunde în cod, de exemplu într-o expresie de apel de metodă:

    printStringsCnew String („unu”, „două”, „trei” ));

    O matrice fără titlu care este creată în acest fel este numită anonim(anonim).

    Matricele de matrice pot fi inițializate prin secvențe imbricate de valori inițiale. Mai jos este un exemplu de declarare a unui tablou care conține primele câteva rânduri ale așa-numitului triunghiul lui Pascal unde fiecare rând este descris de propria sa matrice de valori.

    int pascalsTriunghi = (

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

    Indicii tablourilor multidimensionale sunt în ordine de la exterior la interior. Deci, de exemplu, pascalsTriangle);

    // Un exemplu pentru a ilustra crearea unui tablou
    // numere întregi, pune niște valori într-o matrice,
    // și imprimă fiecare valoare.

    clasa GFG
    {

    {

    int arr;

    // alocarea memoriei pentru 5 numere întregi.
    arr = int nou;


    arr = 10;


    arr = 20;

    //curând...
    arr = 30;
    arr = 40;
    arr = 50;

    // accesarea elementelor matricei specificate
    pentru (int i = 0; i< arr.length; i++)
    System.out.println("Element la index " + i +
    " : "+ arr[i]);
    }
    }
    Ca rezultat obținem:

    Element la index 0: 10 Element la index 1: 20 Element la index 2: 30 Element la index 3: 40 Element la index 4: 50

    Matrice de obiecte

    O matrice de obiecte este creată în același mod ca și elementele de date, după cum urmează:

    Student arr = student nou;

    StudentArray conține șapte elemente de memorie fiecare din clasa elevului, în care pot fi stocate adresele a șapte obiecte Student. Obiectele student trebuie create folosind constructorul clasei student și referințele lor trebuie alocate elementelor matrice după cum urmează:

    Student arr = student nou;

    // Program Java pentru a ilustra crearea unei matrice de
    // obiecte

    clasa Student
    {
    public int roll_no;
    public String nume;
    Student(int roll_no, String name)
    {
    this.roll_no = roll_no;
    this.name = nume;
    }
    }

    // Elementele matricei sunt obiecte ale clasei Student.
    clasa publica GFG
    {
    public static void main (Argumente șir)
    {
    // declară un tablou de numere întregi.
    Student arr;

    // alocarea memoriei pentru 5 obiecte de tip Student.
    arr = student nou;

    // inițializați primele elemente ale tabloului
    arr = new Student(1,"aman");

    // inițializează elementele secunde ale tabloului
    arr = new Student(2,"vaibhav");

    //curând...
    arr = new Student(3,"shikar");
    arr = new Student(4,"dharmesh");
    arr = new Student(5,"mohit");

    // accesarea elementelor matricei specificate
    pentru (int i = 0; i< arr.length; i++)
    System.out.println("Element la " + i + " : " +
    arr[i].roll_no +" "+ arr[i].nume);
    }
    }

    Primim:

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

    Ce se întâmplă dacă încercăm să accesăm un element din afara matricei?
    Compilatorul lansează o excepție ArrayIndexOutOfBoundsException care indică faptul că matricea a fost accesată la un index nevalid. Indicele este fie negativ, fie mai mare sau egal cu dimensiunea matricei.

    Multidimensional

    Matricele multidimensionale sunt matrice de matrice în care fiecare element conține o referință la o altă matrice. Creat prin adăugarea unui set de paranteze pătrate () pentru fiecare dimensiune. Să ne uităm la un exemplu:

    Int intArray = int nou; //o matrice 2D sau matrice int intArray = int nou; //o matrice 3D

    clasa multidimensională
    {
    public static void main (Argumente șir)
    {
    // declararea și inițializarea matricei 2D
    int arr = ( (2,7,9),(3,6,1),(7,4,2) );

    // imprimarea matricei 2D
    pentru (int i=0; i< 3 ; i++)
    {
    pentru (int j=0; j< 3 ; j++)
    System.out.print(arr[i][j] + " ");

    System.out.println();
    }
    }
    }

    Ieșire: 2 7 9 3 6 1 7 4 2


    Transmiterea de tablouri la o metodă

    La fel ca variabilele, putem transmite matrice metodelor.

    // Program Java pentru a demonstra // trecerea matricei la clasa de metodă Test ( // Metoda driverului public static void main(String args) ( int arr = (3, 1, 2, 5, 4); // trecerea matricei la metodă m1 sum(arr); ) public static void sum(int arr) ( // obținerea sumei valorilor matricei int sum = 0; pentru (int i = 0; i< arr.length; i++) sum+=arr[i]; System.out.println("sum of array values: " + sum); } }

    La ieșire obținem:

    suma valorilor matricei: 15

    Retur de matrice din metode

    Ca de obicei, metoda poate returna și o matrice. De exemplu, programul de mai jos returnează o matrice din metoda m1.

    // Program Java pentru a demonstra // întoarcerea matricei din clasa de metodă Test ( // Metoda driverului 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}; } }

    Obiecte de clasă

    Fiecare matrice are asociat un obiect de clasă care este partajat cu toate celelalte matrice cu același tip de componentă.

    // Program Java pentru a demonstra // Obiecte de clasă pentru testul clasei Arrays ( public static void main(String args) ( int intArray = new int; byte byteArray = new byte; short shortsArray = new short; // array of Strings String strArray = șir nou; 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()); ) )

    clasa +" "); ) ) )

    O clonă a unei matrice multidimensionale (cum ar fi Object ) este o copie, ceea ce înseamnă că creează doar o matrice nouă cu fiecare element și o referință la matricea originală de elemente, dar matricele imbricate sunt partajate.

    // Program Java pentru a demonstra // clonarea matricelor multidimensionale clasa Test ( public static void main(String args) ( int intArray = ((1,2,3),(4,5)); int cloneArray = intArray. clone(); // va tipări false System.out.println(intArray == cloneArray); // va tipări adevărat pe măsură ce este creată o copie superficială // adică sub-matricele sunt partajate System.out.println(intArray == cloneArray) ; System.out.println(intArray == cloneArray); ) )

    O matrice este un instrument puternic care vă permite să lucrați cu cantități mari de date. Evident, dacă trebuie să stocați, de exemplu, 100 de valori undeva în timp ce codul dvs. rulează, atunci este cel puțin nerezonabil să faceți același număr de variabile pentru aceasta. O matrice vă permite să stocați un număr mare de valori sub un singur nume și să le accesați folosind indexul corespunzător. Conceptul de matrice este piatra de temelie a învățării Java pentru începători. La urma urmei, ele sunt baza pentru multe structuri de date.

    Deoarece Java este în principal OOP, are o caracteristică distinctivă în comparație cu matricele din alte limbaje de programare - acestea sunt reprezentate ca obiecte. Printre alte beneficii, acest lucru elimină necesitatea de a monitoriza curățarea memoriei, deoarece este eliberată automat.

    Crearea și manipularea tablourilor unidimensionale

    O matrice unidimensională este una clasică și este o colecție de elemente asociate cu un nume comun, fiecare dintre ele corespunde unui index specific. Metoda de declarare a unui tablou este prezentată în figura de mai jos.

    În primul rând, este declarat tipul de matrice Java, care determină tipul de valori stocate în acesta. Poate fi orice valid în Următorul vine numele matricei și parantezele pătrate care spun compilatorului că această variabilă este o matrice. Vă rugăm să rețineți un fapt important. poate fi plasat fie după tipul de bază al matricei, fie după numele matricei. După semnul egal este indicat noul operator care inițiază alocarea de memorie pentru tablou (la fel ca și în cazul obiectelor), tipul de elemente care vor fi stocate în acesta (trebuie să fie compatibil cu tipul de bază declarat mai devreme) și, în sfârșit, numărul acestora, indicat între paranteze drepte.

    Numerotarea elementelor dintr-o matrice Java începe de la 0. Astfel, indicele primului element din această matrice va fi 0, iar al șaselea - 5. Pentru a face referire la un element specific al matricei, de exemplu, al cincilea, doar indicați numele matricei și indexul elementului între paranteze drepte lângă nume . În acest fel, puteți să atribuiți o valoare unui element și să o recuperați. Cu toate acestea, ar trebui să fiți atenți deoarece dacă treceți un index la care elementul nu există, va apărea o eroare.

    Matrice multidimensionale în Java

    Matricele multidimensionale sunt rânduri de matrice unidimensionale la care se referă elementele altor matrice. Cu alte cuvinte, cele mai simple dintre ele sunt bidimensionale. Folosind exemplul lor, vom încerca să înțelegem conceptul. Pentru claritate, figura de mai jos prezintă sintaxa și diagrama care descriu structura unui tablou bidimensional.

    După cum puteți vedea, sintaxa nu este foarte diferită de tablourile unidimensionale. Să ne uităm la structură. În primele paranteze am alocat spațiu pentru 5 elemente. Aceste elemente nu sunt altceva decât referințe la matrice individuale. Mai mult, dimensiunea fiecăruia dintre ele este determinată de numărul din a doua paranteză. De fapt, analogul tablourilor bidimensionale din matematică sunt matrici. Vă rugăm să rețineți că, pe lângă elemente, este alocat un loc separat în memorie unde este stocată valoarea (lungimea) a lungimii matricei. De obicei, lucrul cu matrice multidimensionale se face folosind bucle imbricate for.

    Matrice neregulate

    O matrice bidimensională este o matrice de matrice. Am aflat deja asta. Dar matricele pe care le conține pot avea lungimi diferite? Răspunsul este da, pot. Pentru a face acest lucru, Java oferă capacitatea de a declara o matrice bidimensională într-un mod special. De exemplu, dorim să creăm o matrice bidimensională care să stocheze trei matrice unidimensionale cu lungimea de 2, 3 și, respectiv, 4. Se declară astfel:

    intarr = newint;

    Vă rugăm să rețineți că nu am inclus un număr în a doua paranteză. Determinarea dimensiunii matricelor în arr se face astfel:

    Accesând elementul de la indexul 0, care indică primul tablou, îl declarăm ca fiind de dimensiunea 2. Elementul de la indexul 1 va stoca o matrice de dimensiunea 3 și așa mai departe. Este destul de simplu.

    Sintaxă alternativă de declarare a matricei java

    De asemenea, puteți inițializa matrice direct atunci când le creați. Este destul de simplu.

    Acordați atenție declarației matricelor jerseyNumber și playerName.

    În cazul tablourilor bidimensionale, această declarație arată astfel:

    Pentru a face acest lucru, în locul noului operator, se deschid acolade, în care sunt listate toate elementele, separate prin virgule. Java, în acest caz, le alocă automat memorie și le indexează în consecință.

    Clasa de ajutor Arrays

    Pentru a lucra cu entități precum matrice în Java, pachetul java.util are o clasă specială numită Arrays, care oferă multe metode statice care fac lucrul cu ele mult mai ușor. Lista principalelor metode este prezentată în figura de mai jos.

    Să ne uităm la unele dintre cele mai utile metode de matrice Java:

    CopyOf (matrice, lungime) - returnează o copie a matricei transmise de lungimea corespunzătoare. Dacă lungimea transmisă este mai mare decât matricea originală, atunci toate elementele „extra” sunt umplute cu o valoare implicită (0 dacă este un tip simplu și nul dacă este un tip de referință).

    CopyOfRange(matrice, primul index, ultimul index) - nu este afișat în imagine, dar o metodă utilă. Copiază porțiunea din tabloul trecut, definită de indicii corespunzători, începând cu primul și terminând cu ultimul.

    Sortare (matrice) - sortează elementele matricei în ordine crescătoare.

    Fill (matrice, valoare) - Completează matricea transmisă cu valoarea corespunzătoare.

    BinarySearch (matrice, valoare) - returnează indexul la care se află elementul cu valoarea corespunzătoare în tabloul sortat transmis. Dacă nu există un astfel de element, atunci este returnat un număr negativ.

    Deoarece metodele sunt statice, apelarea lor nu necesită crearea unei instanțe a clasei Arrays. Sunt apelate direct din acesta: Arrays.sort(arr).

    Concluzie

    Am acoperit cele mai importante aspecte referitoare la matrice, iar pentru cei care abia încep să învețe Java pentru începători, acest lucru va fi suficient pentru o înțelegere de bază a unei astfel de entități ca matrice și a tehnicilor de bază pentru lucrul cu ea. Desigur, practica vă va oferi o mai bună înțelegere a modului în care funcționează acest instrument. Așa că fă-ți timp pentru a face câteva exerciții de manipulare a matricelor în moduri diferite.

    Clasa auxiliară Array Java este deja folosită în condiții de „luptă”, așa că mai întâi este recomandat să învățați cum să efectuați manual toate operațiunile de bază cu matrice.

    Am învățat cum să creăm tablouri unidimensionale. În mod similar, în Java puteți crea 2D, 3D, 4D... cu alte cuvinte, tablouri multidimensionale. O matrice multidimensională în Java este în esență o matrice de matrice.

    Un exemplu popular de utilizare a acestui tip de tablouri sunt matricele, pentru reprezentarea cărora sunt folosite tablouri bidimensionale. Deci, ce este o matrice și cum să o reprezinte folosind o matrice bidimensională în Java.

    Matrici și tablouri bidimensionale în Java

    O matrice este un tabel dreptunghiular format din rânduri și coloane la intersecția cărora se află elementele sale. Numărul de rânduri și coloane ale unei matrice determină dimensiunea acesteia.

    Vedere generală a dimensiunii matricei m X n(m— numărul de linii, n — numar de coloane) , după cum urmează:

    Fiecare element al matricei are propriul index, unde prima cifră indică numărul rândului pe care se află elementul, iar a doua cifră indică numărul coloanei.

    Să ne uităm la exemple de matrice specifice și să le creăm folosind Java.

    Matrice A are o dimensiune de 2 pe 3 (2 rânduri, 3 coloane). Să creăm o matrice bidimensională a acestei dimensiuni:

    Matricea intA; matrixA = new int ;

    Am declarat o matrice bidimensională de numere întregi (deoarece matricea în acest caz conține numere întregi) și i-am rezervat memorie. Pentru a face acest lucru, am folosit 2 indici: primul index definește rândul și dimensiunea acestuia, al doilea index definește coloana și dimensiunea acesteia.

    Pentru a accesa elementele unui tablou bidimensional, trebuie să folosiți 2 indici: primul pentru rând, al doilea pentru coloană. Ca și în cazul tablourilor unidimensionale, indicii încep de la zero. Prin urmare, numerotarea rândurilor și coloanelor din tabel începe de la 0.

    Matricea A = 1; matricea A = -2; matriceA = 3; matriceA = 4; matriceA = 1; matriceA = 7;

    Pentru a afișa matricea pe consolă, trebuie să parcurgeți toate elementele folosind două bucle. Numărul de cicluri la trecerea prin elementele matricei este egal cu dimensiunea acestuia. În cazul nostru, prima buclă se desfășoară de-a lungul rândurilor, a doua - prin coloane.

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

    Adică, afișăm mai întâi toate elementele primei linii, separându-le cu caracterul tabulator „\t”, întrerupem linia și afișăm toate elementele celei de-a doua rânduri.

    Cod complet pentru matrice A după cum urmează:

    Public class Matrix ( 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(); } } }

    Pentru matrice B hai sa profitam metoda de initializare simplificata- la momentul anuntului. Prin analogie cu tablourile unidimensionale.

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

    Fiecare rând din matrice trebuie să fie închis într-o pereche de acolade și separat prin virgulă.

    Cod complet pentru matrice B:

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

    Sa luam in considerare inițializare într-o buclă pentru o matrice bidimensională folosind tabelul înmulțirii ca exemplu.

    Clasa publică Mult ( public static void main(String args) ( // creează o matrice bidimensională 10 cu 10 int multiplyTab = new int; // buclă prin prima dimensiune pentru (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(); } } }

    Aici, inițializarea elementelor cu valorile tabelului înmulțirii este combinată cu ieșirea lor către consolă într-un singur ciclu.

    Rețele multidimensionale și asimetrice.

    Matricele multidimensionale sunt create în Java într-un mod similar. Numărul de paranteze pătrate indică dimensiunea.
    Exemple de creare a tablourilor cu lungime fixă:

    Int a = int nou;// matrice bidimensională int b = int nou;// matrice tridimensională int c = int nou;// matrice în patru dimensiuni // etc.

    Cu toate acestea, nu este necesar să specificați inițial dimensiunea la toate nivelurile; puteți specifica dimensiunea doar la primul nivel.

    Int a1 = int nou; // matrice bidimensională cu 5 rânduri

    În acest caz, încă nu se știe câte elemente vor fi în fiecare linie, acest lucru poate fi determinat ulterior, iar tabloul poate conține un număr diferit de elemente în fiecare linie, adică poate fi asimetric. Să determinăm numărul de elemente din fiecare linie pentru tabloul a1

    A1 = new int ; a1 = int nou ; a1 = int nou ; a1 = int nou ; a1 = int nou ;

    Ca urmare, atunci când este afișat pe ecran,

    Pentru(int i = 0; i

    matricea va arăta astfel:

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

    Când este creată o matrice, elementele sale sunt inițializate automat la zero, astfel încât în ​​acest exemplu sunt afișate zerouri.

    Exerciții privind tablourile multidimensionale în Java:

    1. Creați o matrice 5 pe 6 și umpleți-o cu numere aleatorii (de la 0 la 99). Imprimați a treia linie pe consolă
    2. Sunt date matrice C și D cu o dimensiune de 3 cu 3 și umplute cu numere aleatoare în intervalul de la 0 la 99. Efectuați adunarea separat, apoi înmulțiți matricele între ele. Trimiteți matricele sursă și rezultatele calculului în consolă.
    3. Însumați toate elementele unui tablou bidimensional.
    4. Dată o matrice bidimensională care conține numere negative și pozitive. Afișați numerele acelor celule matrice care conțin numere negative.
    5. Sortați elementele din rândurile unui tablou bidimensional în ordine crescătoare

    Cele mai bune articole pe această temă