Cum se implementează matrice multidimensionale în java. Învățarea Java

Un tablou este un set de obiecte de același tip care au un nume comun. Fiecare element de matrice poate fi accesat prin indexul său. Să ne uităm la un exemplu real. Să avem un anumit depozit numit a și să-l lăsăm să aibă un anumit număr de cutii, fiecare dintre ele numerotate succesiv. Fiecare cutie conține un obiect care este de același tip cu obiectele din alte cutii. Un exemplu al acestui depozit este o matrice clasică, în care numele depozitului este numele matricei, cutiile sunt elementele matricei, numerele casetelor sunt indici ai elementelor, iar conținutul cutiilor este valorile variabilelor noastre. Să ne imaginăm că în interiorul cutiilor sunt lămâi, iar fiecare cutie conține un anumit număr de lămâi. Apoi, valorile variabilelor noastre vor arăta numărul de lămâi. Să luăm în considerare un astfel de depozit format din trei cutii, să fie prima cutie să conțină 3, a doua 7 și a treia 273. Apoi, matricea care descrie acest depozit poate fi descrisă după cum urmează:

Index 0 1 2
Sens 3 7 273

Indexarea într-o matrice începe întotdeauna de la 0. Să ne uităm la câteva operații care pot fi efectuate cu o matrice:

Crearea unui Array

TypeVariableName;
int a;//matrice întreg
char b;//matrice de caractere
Coarda c;

Alocare de memorie:

A = new int;//aloca memorie pentru 10 elemente
b = caracter nou;//aloca memorie pentru 20 de elemente
c = String nou;//aloca memorie pentru 30 de elemente

Astfel, inițializarea matricei arată astfel:

Int a = new int;//inițializarea unui tablou de numere întregi cu 10 elemente
char b = new char;//inițializarea unui tablou de caractere de 20 de elemente
String c = new String;//inițializarea unei matrice de șiruri de 30 de elemente

Tuturor elementelor matricei după o astfel de inițializare li se atribuie o valoare implicită.
Este posibil să setați imediat valorile elementelor matricei; să creăm o matrice care va afișa numărul de lămâi din cutie, ca în exemplul de mai sus:

Int a = new int( 3, 7, 273 );

Lucrul cu o matrice

Citirea unui tablou:

Import java.util.Scanner;
test la clasa publica (
public static void main(Argumente șir) (
int a;//matrice de numere întregi
int n;//numărul de elemente din matrice
Scanner in = scaner nou (System.in);
n = in.nextInt();
a = nou int[n];
for(int i = 0; i Modificarea valorilor matricei:


for(int i = 0; i Ieșire matrice:

Int a;//o matrice de numere întregi care a fost procesată cumva
for(int i = 0; i Acces aleatoriu la un element de matrice prin index:

System.out.println(a);//Tipărește primul element al matricei
a = 1;//Atribuiți 1 celui de-al doilea element al matricei
int temp = a;//Salvați valoarea celui de-al treilea element al matricei în variabila temp

Așa arată operațiunile de bază cu matrice. Foarte des, în diverse lecții de informatică, li se cere să separe aceste etape de lucru cu o matrice în funcții separate, dar despre asta vom vorbi mai târziu. Astfel, citind o matrice, putem introduce unele valori din consolă, prin modificarea valorilor, putem, de exemplu, să creștem toate valorile cu una sau să le înmulțim cu două, iar prin utilizarea ieșirii, putem afișa curentul valorile matricei. Dacă trebuie să lucrăm numai cu elemente specifice ale unei matrice, atunci putem folosi accesul aleator prin index, unde index este orice număr întreg pozitiv care este mai mic decât lungimea matricei. Lungimea curentă a matricei poate fi obținută folosind proprietatea length; aceasta a fost deja utilizată la afișarea matricei.
Aici voi omite dialogul despre faptul că tablourile sunt referințe și lucrul cu ele diferă de lucrul cu tipuri de bază obișnuite.

Matrice bidimensionale

Nu este întotdeauna convenabil să numerotați casetele dintr-un depozit de la 0 la un anumit număr; uneori doriți să aduceți depozitul într-o formă mai ordonată, de exemplu, introduceți rânduri. Acum, fiecare cutie are propriul său număr de rând și propriul său număr de serie în acest rând. Să fie nouă cutii în depozitul nostru care să conțină 1, 2 și așa mai departe 9 portocale. Cutiile din depozit sunt dispuse pe trei rânduri de trei cutii, apoi situația din depozit poate fi imaginată astfel.

  • 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

    Un tablou este o succesiune finită de elemente ordonate de același tip, fiecare element în care este accesat de indexul său.

    Mărimea sau lungimea unei matrice este numărul total de elemente din matrice. Mărimea matricei este setată la crearea matricei și nu poate fi modificată ulterior, adică nu puteți elimina elemente din matrice sau nu le puteți adăuga acolo, dar puteți atribui noi valori elementelor existente.

    Indicele elementului de pornire este 0, următorul este 1 etc. Indicele ultimului element din matrice este cu unul mai mic decât dimensiunea matricei.

    În Java, tablourile sunt obiecte. Aceasta înseamnă că numele dat fiecărei matrice indică doar adresa unei date din memorie. Nimic nu este stocat în această variabilă, cu excepția adresei. Indicele matricei, de fapt, indică cât de mult trebuie să vă îndepărtați de elementul de pornire al matricei din memorie pentru a ajunge la elementul dorit.

    Pentru a crea o matrice, trebuie să declarați un nume potrivit pentru aceasta și apoi să asociați cu acest nume fragmentul necesar de memorie, unde valorile elementelor matricei vor fi stocate una după alta. Următoarele opțiuni pentru declararea unei matrice sunt posibile: nume de tip; numele tipului;

    Unde tip este tipul de elemente ale matricei și Nume- un identificator unic (nu este ocupat de alte variabile sau obiecte din această parte a programului) care începe cu o literă.

    Exemple: int a; dublu ar1; dublu ar2;

    În exemplu, am declarat nume pentru trei matrice. Cu prenume A o matrice de elemente de tip int poate fi asociată în continuare și cu nume ar1Și ar2în plus, pot fi conectate șiruri de numere reale (de tip double). Până acum nu am creat matrice, ci doar le-am pregătit nume.

    Acum puteți crea (sau, după cum se spune, inițializa) tablouri după cum urmează: a = new int; // matrice de 10 elemente de tip int int n = 5; ar1 = dublu nou[n]; // Matrice de 5 elemente dublu ar2 = (3.14, 2.71, 0, -2.5, 99.123); // O matrice de 6 elemente de tip double Adică, la crearea unei matrice, putem specifica dimensiunea acesteia, sau imediat listăm toate elementele dorite separate prin virgule în acolade (în acest caz, dimensiunea va fi calculată automat pe baza succesiunea elementelor care vor fi specificate). Vă rugăm să rețineți că, în acest caz, un punct și virgulă este plasat după acolada de închidere, ceea ce nu se întâmplă atunci când acolada închide un bloc.

    Dacă matricea a fost creată folosind operatorul nou, atunci fiecare dintre elementele sale primește o valoare implicită. Ceea ce va fi este determinat pe baza tipului de date (0 pentru int, 0.0 pentru double etc.).

    A fost posibil să se declare un nume pentru o matrice și să se creeze matricea în sine pe o singură linie folosind următoarea schemă: nume de tip = tip nou [dimensiune]; nume de tip = (el0, el1, ..., elN); Exemple: int mas1 = (10,20,30); int mas2 = new int;

    Pentru a accesa unul dintre elementele matricei pentru a citi sau modifica valoarea acestuia, trebuie să specificați numele matricei urmat de indexul elementului între paranteze drepte. Un element de matrice cu un index specific se comportă la fel ca o variabilă. De exemplu, pentru a afișa ultimul element al matricei mas1, trebuie să scriem în program:

    System.out.println("Ultimul element al matricei" + mas1);

    Și așa putem pune în matricea mas2 același set de valori care sunt stocate în mas1:

    Mas2 = 10; mas2 = 20; mas2 = 30;Deja din acest exemplu este clar că pentru a accesa toate elementele matricei, trebuie să repetăm ​​același tip de acțiuni. După cum vă amintiți, buclele sunt folosite pentru a repeta operațiunile de mai multe ori. În consecință, am putea umple matricea cu elementele necesare folosind o buclă: for(int i=0; iEste clar că dacă am avea o matrice nu de 3, ci de 100 de elemente, pur și simplu nu am fi putut face acest lucru. fără buclă.

    Lungimea oricărei matrice creată nu trebuie reținută, deoarece există o proprietate care o stochează. Puteți accesa această proprietate adăugând .length la numele matricei. De exemplu:

    Int razmer = mas1.lungime; Această proprietate nu poate fi modificată (adică nu i se poate atribui nimic), poate fi doar citită. Folosind această proprietate, puteți scrie cod de program pentru a procesa o matrice fără să știți măcar dimensiunea sa specifică.

    De exemplu, acesta este modul în care puteți afișa elementele oricărei matrice numite ar2:

    Pentru(int i = 0; i<= ar2.length - 1; i++) { System.out.print(ar2[i] + " "); } Для краткости удобнее менять нестрогое неравенство на строгое, тогда не нужно будет вычитать единицу из размера массива. Давайте заполним массив целыми числами от 0 до 9 и выведем его на экран: for(int i = 0; i < ar1.length; i++) {ar1[i] = Math.floor(Math.random() * 10); System.out.print(ar1[i] + " "); }

    Vă rugăm să rețineți că la fiecare pas al buclei, am trimis mai întâi o valoare aleatorie elementului de matrice cu indicele i, apoi am afișat același element pe ecran. Dar cele două procese (umplere și retragere) ar putea fi efectuate în cicluri diferite. De exemplu:

    Pentru(int i = 0; i< ar1.length; i++) { ar1[i] = Math.floor(Math.random() * 9); } for(int i = 0; i < ar1.length; i++) { System.out.print(ar1[i] + " "); } В данном случае более рационален первый способ (один проход по массиву вместо двух), но не всегда возможно выполнить требуемые действия в одном цикле.

    Pentru a procesa matrice, bucle de tip „n times” (for) sunt întotdeauna folosite deoarece știm dinainte de câte ori trebuie să se repete bucla (de același număr de ori cât există elemente în matrice).

    Sarcini

      Creați o matrice cu toate numerele pare de la 2 la 20 și afișați elementele matricei mai întâi într-o linie, separând un element de altul cu un spațiu, apoi într-o coloană (separând un element de altul prin începerea unei noi linii). Înainte de a crea o matrice, gândiți-vă cât de mare va fi.

      2 4 6 … 18 20
      2
      4
      6

      20

      Creați o matrice cu toate numerele impare de la 1 la 99, afișați-o pe ecran ca o linie și apoi afișați aceeași matrice pe ecran ca o linie, dar în ordine inversă (99 97 95 93 ... 7 5 3 1 ).

      Creați o matrice de 15 numere întregi aleatorii din segment. Afișați matricea pe ecran. Numărați câte elemente pare sunt în matrice și afișați acest număr pe ecran pe o linie separată.

      Creați o matrice de 8 numere întregi aleatorii din segment. Imprimați matricea pe ecran ca șir. Înlocuiți fiecare element cu un indice impar cu zero. Din nou, afișați matricea pe o linie separată.

      Creați 2 matrice de 5 numere întregi aleatoare din segment fiecare, afișați matricele pe ecran pe două linii separate. Calculați media aritmetică a elementelor fiecărei matrice și raportați pentru care dintre matrice această valoare a fost mai mare (sau raportați că mediile lor aritmetice sunt egale).

      Creați o matrice de 4 numere întregi aleatorii din segment, imprimați-o pe ecran ca șir. Determinați și afișați un mesaj care indică dacă matricea este o secvență strict crescătoare.

      Creați o matrice cu primele 20 de numere Fibonacci și afișați-o pe ecran. Vă reamintim că primul și al doilea termen al șirului sunt egali cu unii, iar fiecare următor este suma celor doi anteriori.

      Creați o matrice de 12 numere întregi aleatoare din segmentul [-15;15]. Determinați care element este maximul din această matrice și raportați indexul ultimei sale apariții în matrice.

      Creați două matrice de 10 numere întregi aleatorii din segment și o a treia matrice de 10 numere reale. Fiecare element cu indicele i al celui de-al treilea tablou trebuie să fie egal cu raportul dintre elementul din prima matrice cu indicele i-lea și elementul din a doua matrice cu indicele i-lea. Tipăriți toate cele trei matrice pe ecran (fiecare pe o linie separată), apoi imprimați numărul de elemente întregi din a treia matrice.

      Creați o matrice de 11 numere întregi aleatoare din segmentul [-1;1], afișați matricea ca o linie. Determinați ce element apare cel mai des în matrice și afișați un mesaj despre acesta pe ecran. Dacă două elemente apar de același număr de ori, atunci nu scoateți nimic.

      Utilizatorul trebuie să specifice un număr pozitiv par de la tastatură, iar programul trebuie să creeze o matrice de dimensiunea specificată din numere întregi aleatorii de la [-5;5] și să-l afișeze pe ecran ca o linie. După aceasta, programul trebuie să determine și să informeze utilizatorul despre suma modulelor a căror jumătate din matrice este mai mare: stânga sau dreapta, sau să informeze că aceste sume ale modulelor sunt egale. Dacă utilizatorul introduce un număr incorect, programul ar trebui să necesite introducerea repetată până când este specificată valoarea corectă.

      Programul trebuie să creeze o matrice de 12 numere întregi aleatoare din segmentul [-10;10] astfel încât să existe un număr egal de elemente negative și pozitive și să nu existe zerouri. În acest caz, ordinea elementelor trebuie să fie aleatorie (adică, opțiunea nu este potrivită atunci când tabloul conține în mod constant mai întâi 6 numere pozitive și apoi 6 negative, sau când elementele alternează constant printr-unul etc.). Afișați matricea rezultată pe ecran.

      Utilizatorul introduce de la tastatură un număr natural mai mare decât 3, care este stocat în variabila n. Dacă utilizatorul a introdus un număr incorect, programul ar trebui să-i ceară utilizatorului să repete introducerea. Creați o matrice de n numere întregi aleatoare dintr-un segment și afișați-o pe ecran. Creați o a doua matrice numai din elementele pare ale primei matrice, dacă există, și afișați-o pe ecran.

    Sortați o matrice

    Sortarea este procesul de rearanjare a elementelor unui tablou, atunci când toate elementele sale sunt aranjate în ordine crescătoare sau descrescătoare.Puteți sorta nu numai matrice numerice, ci și, de exemplu, șiruri (după același principiu pe care sunt aranjate cărțile). rafturile bibliotecii). În general, puteți sorta elementele oricărui set în care este specificată relația de ordine.Există algoritmi universali care efectuează sortarea indiferent de starea inițială a matricei. Dar, pe lângă ei, există algoritmi speciali care, de exemplu, pot sorta foarte rapid o matrice aproape ordonată, dar nu fac față bine unei matrice puternic amestecate (sau nu fac față deloc). Sunt necesari algoritmi speciali acolo unde viteza este importantă și se rezolvă o problemă specifică; studiul lor detaliat depășește scopul cursului nostru.

    Sortare după selecție

    Să ne uităm la un exemplu de sortare în ordine crescătoare. Adică poziția inițială din matrice ar trebui să aibă elementul minim, următoarea ar trebui să aibă un element mai mare sau egal etc., iar ultima poziție ar trebui să aibă elementul cel mai mare. Esența algoritmului este următoarea. Căutăm elementul minimal în orice și îl schimbăm cu cel inițial. Apoi, în partea rămasă a matricei (adică, printre toate elementele, cu excepția celui inițial), căutăm din nou elementul minim și îl schimbăm cu al doilea element din matrice. Și așa mai departe.

    Ilustrare:

    Pentru (int i = 0; i

    Sortare cu bule

    Esența algoritmului este aceasta. Dacă parcurgem orice matrice, stabilind ordinea corectă în fiecare pereche de elemente adiacente, atunci după aceea trecere elementul dorit va fi garantat a fi pe ultimul loc al matricei (cel mai mare pentru sortare în ordine crescătoare sau cel mai mic pentru sortare în ordine descrescătoare). Dacă treceți din nou prin matrice cu aceleași transformări, atunci elementul dorit este garantat a fi pe penultimul loc. Și așa mai departe. Exemplu:

    2 9 1 4 3 5 2 → ordinea este corectă, nu va exista nicio rearanjare

    2 9 1 4 3 5 2 → 2 1 9 4 3 5 2

    2 1 9 4 3 5 2 → 2 1 4 9 3 5 2

    2 1 4 9 3 5 2 → 2 1 4 3 9 5 2

    2 1 4 3 9 5 2 → 2 1 4 3 5 9 2

    2 1 4 3 5 9 2 → 2 1 4 3 5 2 9

    Cod: /* Bucla exterioară îngustează în mod constant fragmentul de matrice * care va fi luat în considerare, deoarece după fiecare trecere * a buclei interioare, elementul dorit va fi * în ultimul loc al fragmentului (nu trebuie să fie fi luat în considerare din nou). */ for (int i = a.length - 1; i >= 2; i--) ( /* În variabila sortată vom stoca un semn dacă tabloul * este sortat. Înainte de fiecare trecere a buclei interne * vom presupune că este sortat, dar dacă facem * cel puțin o permutare, înseamnă că nu suntem încă complet sortați. * Această tehnică, care simplifică sortarea, se numește criteriul Iverson. */ boolean sortat = adevărat; /* În bucla interioară parcurgem fragmentul de matrice, care este * determinat de bucla exterioară În acest fragment stabilim * ordinea corectă între elementele adiacente, deci în perechi * procesând întreg fragmentul */ for (int j = 0; j a) ( int temp = a[j]; a[j] = a; a = temp ; sortat = false; ) ) /* Dacă matricea este sortată (adică nu au existat permutări * în bucla interioară, atunci puteți opriți bucla exterioară *. */ if(sortat) ( break; ) )

    Matrice multidimensionale

    Un tablou poate consta nu numai din elemente de un anumit tip încorporat (int, double etc.), ci și, printre altele, din obiecte ale unei clase existente și chiar din alte tablouri.

    O matrice care conține alte matrice ca elemente se numește matrice multidimensională.Matricele bidimensionale sunt cel mai des folosite. Astfel de tablouri pot fi ușor reprezentate ca o matrice. Fiecare rând este o matrice unidimensională obișnuită, iar unirea tuturor rândurilor este o matrice bidimensională, în fiecare element din care este stocată o legătură către un rând al matricei. O matrice tridimensională poate fi imaginat ca un set de matrice, pe care fiecare le-am notat pe o fișă de bibliotecă. Apoi, pentru a ajunge la un anumit număr, trebuie mai întâi să indicați numărul cardului (primul index al matricei tridimensionale), prin urmare să indicați numărul rândului (al doilea indice al matricei) și numai apoi numărul elementului din rând (al treilea indice).

    În consecință, pentru a accesa un element al unui tablou n-dimensional, trebuie să specificați n indici.

    Matricele sunt declarate astfel: int d1; //Obișnuit, unidimensional int d2; //D3 dublu bidimensional; //Tridimensional int d5; //Cincidimensionale Când creați o matrice, puteți specifica în mod explicit dimensiunea fiecărui nivel: d2 = int; // Matrice de 3 rânduri și 4 coloane Dar puteți specifica doar dimensiunea primului nivel: int dd2 = int; /* Matrice de 5 rânduri. Nu se știe încă câte elemente vor fi în fiecare linie. */ În acest din urmă caz, puteți crea o matrice bidimensională, care nu va fi o matrice datorită faptului că fiecare rând va avea un număr diferit de elemente. De exemplu: for(int i=0; i<5; i++) { dd2[i] = new int; } В результате получим такой вот массив: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Мы могли создать массив явно указав его элементы. Например так: int ddd2 = {{1,2}, {1,2,3,4,5}, {1,2,3}};

    În acest caz, puteți accesa elementul cu indice 4 din al doilea rând ddd2, dar dacă accesăm elementul ddd2 sau ddd2- va apărea o eroare, deoarece astfel de elemente pur și simplu nu există. Mai mult, această eroare va apărea în timpul execuției programului (adică compilatorul nu o va vedea).

    În mod obișnuit, sunt utilizate matrice bidimensionale cu un număr egal de elemente în fiecare rând. Pentru a procesa matrice bidimensionale se folosesc două bucle imbricate cu contoare diferite. Exemplu (umplem o matrice bidimensională cu numere aleatoare de la 0 la 9 si afiseaza-l pe ecran sub forma unei matrice): int da = new int; for(int i=0; i

    Sarcini

      Creați o matrice bidimensională de 8 rânduri a câte 5 coloane fiecare dintre numere întregi aleatorii din segment. Afișați matricea pe ecran.

      Creați o matrice bidimensională de 5 rânduri cu 8 coloane fiecare de numere întregi aleatorii din segmentul [-99;99]. Afișați matricea pe ecran. Apoi, pe o linie separată, afișați valoarea elementului maxim al acestui tablou (indexul său nu contează).

      Creați o matrice bidimensională de 7 rânduri cu câte 4 coloane de numere întregi aleatorii din segmentul [-5;5]. Afișați matricea pe ecran. Determinați și afișați indicele rândului cu cel mai mare produs absolut al elementelor. Dacă există mai multe astfel de linii, atunci tipăriți indexul primei linii întâlnite.

      Creați o matrice bidimensională de 6 rânduri cu 7 coloane fiecare dintre numere întregi aleatorii din segment. Afișați matricea pe ecran. Transformați matricea astfel încât cel mai mare element din fiecare rând să fie primul. În acest caz, compoziția matricei nu poate fi modificată, ci doar elementele pot fi rearanjate într-o singură linie. Ordinea elementelor rămase ale liniei nu este importantă (adică, puteți face o singură permutare sau puteți sorta fiecare linie în ordine descrescătoare). Afișați matricea convertită pe ecran.

      Pentru a testa cunoștințele reziduale ale elevilor după vacanța de vară, profesorul din școala primară a decis să înceapă fiecare lecție cerând fiecărui elev câte un exemplu din tabla înmulțirii, dar în clasă sunt 15 persoane, iar exemplele printre ei nu trebuie repetate. . Pentru a ajuta profesorul, scrieți un program care să afișeze 15 exemple aleatorii din tabla înmulțirii (de la 2*2 la 9*9, deoarece sarcinile de înmulțire cu 1 și 10 sunt prea simple). Mai mult, printre cele 15 exemple nu ar trebui să existe altele care se repetă (exemplele 2*3 și 3*2 și perechile similare ar trebui considerate repetate).

    2010, Alexey Nikolaevich Kostin. Departamentul TIDM, Facultatea de Matematică, Universitatea Pedagogică de Stat din Moscova.

    Să începem cu poate ultimul subiect nu foarte plăcut și interesant, dar foarte important și util în teoria limbajului Java - matrice. În continuare, vor fi mai multe materiale interesante și interesante care pot fi folosite pentru sarcini mai practice. Dar pentru a începe partea interesantă a Java, trebuie să înveți partea neinteresantă)) care este baza limbajului și fără de care este imposibil să înveți mai departe programarea.

    Toate subiectele anterioare pe care le-am abordat: sunt bazele programării. Studiindu-le vei începe orice alt limbaj de programare. Matricele se referă și la acest subiect. Indiferent cu ce decideți să începeți programarea, este puțin probabil să vă puteți descurca fără matrice. Prin urmare, vă sfătuiesc să stăpâniți foarte bine acest material și trecutul dacă doriți să reușiți în programare.

    Acum să trecem la matrice.

    Matrice este o structură de date care este concepută pentru a stoca date de același tip.

    Să presupunem că trebuie să creați 5 variabile întregi și să le setați la o anumită valoare. Cum vei face asta? Fără să cunoașteți tablourile, cel mai probabil veți începe să scrieți astfel: int a = 2, b = 3, c = 5, d = 21, e = 2;

    Având un astfel de tip de date ca matrice în arsenalul tău, poți scrie astfel: int a = (2, 3, 5, 21, 2);

    Acest lucru este foarte convenabil atunci când are loc procesarea acestor date. De exemplu, acum trebuie să adăugați la fiecare variabilă 3. Dacă ați folosit prima metodă de declarare, atunci o astfel de operație v-ar lua destul de mult timp. În timp ce, având matrice și în arsenalul nostru, putem procesa o cantitate imensă de date fără a recurge la cod monoton.

    Înainte de a utiliza matricea aveți nevoie de:

    1. anunta;
    2. Crea;
    3. Inițializați.

    Amintiți-vă de această procedură și nu o întrerupeți niciodată.
    Declararea matricelor:
    char s;
    șir p;
    sau
    char s;
    șir p;
    Crearea de matrice:
    s = caracter nou;
    p = String nou;

    Numărul de elemente ale matricei este indicat între paranteze drepte. Această cantitate este interzis se va schimba mai tarziu.
    Inițializarea matricelor:
    după creare - element cu element: int a = (1,2,3,4,5);
    la declararea/crearea – întregul tablou: int b = new int (2, 4,6);.

    Dacă matricea nu este inițializată în mod explicit, atunci după crearea sa totul
    elementele sunt egale:
    0 – în tablouri numerice
    false – în tablouri booleene
    null – în matrice de obiecte

    Granițele matricei:
    Toate matricele au un câmp de lungime - lungimea matricei (în elemente)
    Primul element are întotdeauna indicele 0 (a nu se confunda cu valoarea).
    Ultimul element are întotdeauna lungimea indicelui-1.

    După atâta teorie, cred că este nevoie de puțină practică:

      clasă publică ArraysInJava(

      int Array; //declarație matrice

      intArray = int nou [10]; //inițializați matricea

      intArray[ 0] = 1 ; //dați primului element al tabloului valoarea 1

      intArray[ 1] = 2 ; //a doua valoare 2

      intArray[ 6] = 7 ; //valorile rămase ale matricei pe care le folosim

      //nicio valoare specificată nu va fi 0 în mod implicit

      // corespunde valorii dintre paranteze drepte în timpul inițializării.

      pentru (int i = 0; i< intArray.length ; i++ ) {

      pentru (int i = 0; i< intArray.length ; i++ ) {

      intArray[ i] = 45 ; //fiecare element al matricei poate fi schimbat

    Rezultatul executării codului:

    Am revizuit tablouri unidimensionale în Java. Acum este rândul celor bidimensionali.

    După cum probabil ați ghicit, o matrice bidimensională este o matrice de matrice. Nu trebuie să te sperii. Totul este mult mai simplu decât pare.

    int twoDim = new int - așa se poate declara o matrice bidimensională cu o dimensiune de 4 pe 4. Vor fi 4 elemente pe verticală și 4 pe orizontală. Setarea unei valori pentru o astfel de matrice este la fel de simplă ca și pentru una unidimensională: twoDim = 3. Această intrare va însemna că am atribuit elementul nostru de matrice, care se află în al doilea rând (indicele începe de la 0) și a treia coloană. . În imagine va arăta așa:

    Apropo, iată un exemplu de cod:

    Matricele multidimensionale pot avea orice număr de dimensiuni. Declararea, inițializarea și lucrul cu acestea sunt identice cu tablourile unidimensionale. Dacă înveți să lucrezi cu matrice unidimensionale și bidimensionale, atunci nu vor fi probleme cu cele tridimensionale și superioare.

    Alt exemplu. Mai exact, o sarcină. Vreau să vă gândiți și să scrieți o aplicație care imprimă numere în această ordine:

    Sugestie: System.out.println(); - tipărește pe o linie nouă, în timp ce: System.out.print() - tipărește pe aceeași linie.

    Înainte de a căuta soluția, încercați să o scrieți singur. Acest lucru întărește cu adevărat materialul acoperit.

    Pentru cei care nu l-au stăpânit, le ofer o soluție. Nu fi supărat. Programarea necesită timp și răbdare.

      clasa publică FormatMatrixPrint (

      int dimensiune = 5 ;

    Matrice multidimensionale în Java

    De exemplu, luați în considerare o matrice bidimensională în Java.

    Matricele bidimensionale Java sunt un tabel de numere dreptunghiular sau non-dreptunghiular.

    O matrice Java bidimensională constă din rânduri și coloane.

    Primul index al unui tablou Java bidimensional este numărul de rânduri.

    Exemplu de matrice dreptunghiulară 2D Java:

    Int multiArr; multiArr = new int; /* * structura multiArr * | (0,0) | (0,1) | * | (1,0) | (1,1) | */

    Aici este declarată și definită o matrice bidimensională având două rânduri și două coloane.

    Să încărcăm matricea cu elemente:

    MultiArr = 1; multiArr = 2; multiArr = 3; multiArr = 4;

    Ieșirea unei matrice bidimensionale (iterăm peste matrice):

    System.out.println("multyArr"); for(int inn = 0; inn< 2; inn++) { for(int jnn = 0; jnn < 2; jnn++) { System.out.println("multyArr[" + inn + "][" + jnn + "] = " + multyArr ); } }

    Primim:

    for(int inn = 0; inn< 2; inn++)

    trecem prin rânduri, și într-un ciclu

    for(int jnn = 0; jnn< 2; jnn++)

    pe coloane.

    Puteți declara și defini o matrice multidimensională în același timp:

    int multiArr = ((1,2), (3,4));

    Lungimea unui tablou multidimensional în Java

    Int multiArr = ((1,2), (3,4), (5,6)); /* * structura multiArr * | 1 | 2 | * | 3 | 4 | * | 5 | 6 | */ System.out.println("Lungimea matricei = " + multiArr.length);

    Lungimea matricei = 3

    Există trei rânduri a câte două elemente fiecare. Prima dimensiune este trei, aceasta este lungimea unui tablou bidimensional.

    Matrice tridimensională în Java

    Exemplu de matrice 3D în Java:

    int triArray;
    triArray = int nou;

    O matrice tridimensională este declarată și definită aici. Poate fi reprezentat ca un cub format din două straturi (strat), fiecare strat este format din două rânduri și două coloane, adică. fiecare strat este o matrice bidimensională.

    Cum se umple o matrice 3D? Este posibil într-o buclă, dar pentru exemplu vom completa manual:

    //**************** //PRIMUL STRAT //**************** //primul rând al primului strat triArray = 1; triArray = 2; //al doilea rând al primului strat triArray = 3; triArray = 4; //**************** //AL DOILEA STRAT //**************** //primul rând al celui de-al doilea strat triArray = 5; triArray = 6; //al doilea rând al celui de-al doilea strat triArray = 7; triArray = 8;

    Cum să afișați o matrice tridimensională? Sau cum se repetă peste o matrice 3D? Asa de.