CodeGym /Blog Java /Aleatoriu /Ceva despre matrice
John Squirrels
Nivel
San Francisco

Ceva despre matrice

Publicat în grup
Bună! Anterior, în pregătirea dumneavoastră, am lucrat cu obiecte individuale (și tipuri primitive). Dar dacă trebuie să lucrăm cu un întreg grup de obiecte în loc de doar unul? De exemplu, să presupunem că vrem să creăm o listă cu zilele de naștere ale tuturor angajaților companiei noastre. Ar trebui să conțină 30 de șiruri formatate după cum urmează: „Sarah Huffman, 25 ianuarie” Vom beneficia de o structură specială de date numită matrice . Dacă comparăm o matrice cu un obiect real, este foarte asemănător cu un seif al unei bănci cu cutii de valori: Ceva despre matrice - 1o matrice este, de asemenea, formată din „cutii”. Puteți pune ceva (un element) în fiecare cutie. Pentru a accesa un element, trebuie să cunoașteți numărul casetei acestuia (index). Iată cum este creată o matrice:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Aici creăm o matrice care conține 10 elemente. Puteți observa imediat câteva caracteristici ale matricei:
  1. Stochează elemente ale unui tip de date bine definit . Dacă creăm o matrice String, nu putem stoca nimic altceva în ea. Tipul de date este specificat la crearea matricei . Aici diferă de o cutie de valori (în care un client poate depozita ceea ce își dorește).

  2. Mărimea acestuia trebuie specificată atunci când matricea este creată . Nu îl puteți indica mai târziu sau îi puteți modifica dimensiunea după ce matricea este creată .
Faptul că creăm o matrice este indicat de parantezele pătrate de pe ambele părți ale expresiei. Ele pot fi specificate înainte sau după numele variabilei de referință. Oricum va funcționa:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Dacă doriți să scrieți ceva într-o matrice, trebuie să specificați indexul casetei în care va fi scrisă valoarea. Casetele dintr-o matrice sunt numerotate începând de la 0. Numărarea începând de la zero este o practică foarte comună în programare. Cu cât te obișnuiești mai repede, cu atât mai bine :) Ceva despre matrice - 2 Asta înseamnă că, dacă vrei să pui ceva valoare în prima casetă , faci asta:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Acum ziua de naștere a lui Jana este stocată în prima celulă a matricei noastre de zile de naștere a angajaților: puteți adăuga alte valori într-un mod similar:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";
   }
}
Rețineți că am adăugat ziua de naștere a lui Rosie la cea de-a opta casetă (nu ați uitat de ce Caseta nr. 7 este cea de-a opta casetă, nu-i așa?) . Puteți vedea că nu am umplut toate celelalte celule. Nu trebuie să scriem valori într-o matrice în ordine. Nu există o astfel de cerință. Desigur, scrierea elementelor în ordine face mult mai ușor să ținem evidența câte cutii sunt libere și câte sunt ocupate și împiedică matricea să aibă „găuri”. Dacă doriți să obțineți conținutul uneia dintre cutii, atunci (la fel ca în cazul unei cutii de valori) trebuie să știți numărul acesteia. Asa se face:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       String rosieBirthday = birthdays[7];
       System.out.println(rosieBirthday);
   }
}
Ieșire din consolă: Rosie Mills, 3 ianuarie Am creat o Stringvariabilă și i-am spus compilatorului: „Găsiți caseta cu index 7 în tabloul zile de naștere și atribuiți valoarea conținută acolo variabilei StringrosieBirthday . Și exact asta a făcut. Când lucrăm cu tablouri, putem găsi cu ușurință lungimea lor folosind o proprietate specială: length .

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[7] = "Rosie Mills, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
Ieșire consolă: 10 Notă: lengthproprietatea stochează dimensiunea matricei, nu numărul de casete pline. Matricea noastră stochează doar 3 valori, dar am indicat dimensiunea sa ca 10 când am creat-o. Și aceasta este exact valoarea pe care o lengthreturnează câmpul. De ce ar fi util acest lucru? Ei bine, să presupunem că doriți să afișați o listă cu toate zilele de naștere (pentru a verifica că nimeni nu este uitat). Puteți face acest lucru într-o singură buclă simplă:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
       birthdays[1] = "Landon Chan, May 18";
       birthdays[2] = "Jeremiah Leonard, July 12";
       birthdays [3] = "Kenny Russo, September 7";
       birthdays[4] = "Tommie Barnes, November 9";
       birthdays [5] = "Roman Baranov, August 14";
       birthdays [6] = "Chanice Andersen, April 1";
       birthdays[7] = "Rosie Mills, January 3";
       birthdays [8] = "Keenan West, October 19";
       birthdays [9] = "Abraham McArthur, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
În buclă, declarăm variabila i, care este inițializată la zero. La fiecare trecere, obținem elementul cu index i din tabloul nostru și afișăm valoarea acestuia. Bucla va face 10 iterații, iar eu va crește de la 0 la 9 - iar numerele se întâmplă să fie indicii elementelor matricei noastre! Ca rezultat, vom afișa toate valorile de la zile de naștere[0] la zile de naștere[9] De fapt, există o altă modalitate prin care puteți crea o matrice. De exemplu, puteți crea o matrice de ints astfel:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Această tehnică se numește „inițializarea comenzilor rapide”. Este destul de convenabil, deoarece creăm simultan o matrice și o umplem cu valori. Nu trebuie să specificăm în mod explicit dimensiunea matricei: cu inițializarea comenzii rapide, câmpul lengtheste setat automat.

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
       System.out.println(numbers.length);
   }
}
Ieșire din consolă: 9 Acum, puțin despre cum sunt stocate matricele în memorie. Să presupunem că avem o matrice de trei Catobiecte:

public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Behemoth");
       cats[2] = new Cat("Lionel Messi");
   }
}
Trebuie să înțelegeți câteva lucruri aici:
  1. În cazul primitivelor, un tablou stochează un set de valori specifice (de ex. ints). În cazul obiectelor, o matrice stochează un set de referințe .
    Matricea catsconstă din trei elemente, fiecare dintre acestea fiind o referință la un Catobiect. Fiecare dintre referințe indică adresa de memorie unde este stocat obiectul corespunzător.

  2. Elementele matricei sunt aranjate într-un singur bloc în memorie. Acest lucru se face pentru a le permite să fie accesate rapid și eficient.
Astfel, catsface referire la blocul de memorie în care sunt stocate toate obiectele (elementele matricei). Cats[0]face referire la o anumită adresă din acest bloc. Ceva despre matrice - 3 Este important să înțelegeți că o matrice nu stochează doar obiecte: este un obiect în sine. Acest lucru ne face să ne întrebăm dacă putem crea nu numai matrice de șiruri de caractere sau numere, ci și matrice de matrice . Și răspunsul este da, putem! O matrice poate stoca orice obiecte, inclusiv alte matrice. O astfel de matrice se numește bidimensională . Dacă ar fi să-l reprezentăm vizual, va fi foarte asemănător cu un tabel obișnuit. Să presupunem că vrem să creăm o matrice de 3 matrice care pot stoca fiecare 10 ints. Ar arata asa:
Ceva despre matrice - 4
Fiecare linie reprezintă o intmatrice. Prima matrice conține numere de la 1 la 10, a doua matrice - de la -1 la -10, iar a treia - un set de numere aleatorii. Fiecare dintre aceste matrice este stocată în cutiile matricei noastre bidimensionale. În cod, inițializarea unui tablou bidimensional arată astfel:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Pisicile noastre matrice bidimensionale stochează 3 matrice cu 5 cutii în fiecare matrice. Dacă vrem să punem un obiect în a treia casetă a celui de-al doilea tablou, am face acest lucru:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]indică a doua matrice și [2]indică a treia casetă a acelei matrice. Deoarece o matrice bidimensională constă din mai multe matrice, pentru a itera prin ea și a afișa toate valorile sale (sau pentru a popula toate elementele sale), avem nevoie de o buclă imbricată:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
În bucla exterioară (variabilă i), iterăm peste toate tablourile din matricea noastră bidimensională. În bucla interioară (variabila j), trecem prin toate elementele fiecărei matrice. Ca rezultat, cats[0][0] (primul tablou, primul element) va fi afișat mai întâi, urmat de cats[0][1] (primul tablou, al doilea element). După ce am trecut prin prima matrice, vom afișa cats[1][0] , cats[1][1] , cats[1][2] , etc. Apropo, și matricele bidimensionale acceptă inițializare scurtă:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
De obicei, am declara matricea bidimensională numbersca un int[3][3], dar această prescurtare ne permite să specificăm imediat valorile. De ce ai avea nevoie de o matrice bidimensională? Ei bine, ai putea folosi unul pentru a recrea cu ușurință celebrul joc „Battleship”: Ceva despre matrice - 5 În „Battleship”, structura terenului de joc poate fi descrisă cu ușurință: o matrice bidimensională de 10 matrice cu 10 elemente fiecare. Creezi două dintre aceste matrice (una pentru tine și una pentru adversarul tău)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
utilizați unele valori (de exemplu, numere sau simboluri) pentru a popula elementele corespunzătoare locației navelor dvs. și apoi, pe rând, strigeți coordonatele pentru anumite elemente:
  • bordul de luptă1[0][2]!
  • domnisoara! battleshipBoard2[2][4]!
  • Lovit!
  • battleshipBoard2[2][5]!
  • Lovit!
  • battleshipBoard2[2][6]!,
  • Scufundat!
Aceasta încheie prima noastră introducere a matricelor, dar este doar începutul interacțiunii noastre cu acestea. În următoarele lecții, vom vedea moduri interesante în care pot fi utilizate și vom afla, de asemenea, ce funcții încorporate are Java pentru a ne permite să lucrăm cu această structură de date mai convenabil :)
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION