Siruri

De foarte multe ori in aplicatiile reale e nevoie de tratarea similara a unui numar dinamic de entitati. De exemplu, intr-un test anterior am avut de scris o metoda care face media a doua numere. Dar daca aveam nevoie si de o metoda care face media a trei numere?... Puteam sa o scriem si pe ea. Dar daca aveam nevoie de media a 4 numere? Sau de media a 10,000 de numere?... Sirurile ne permit sa grupam mai multe entitati de acelasi tip si sa le tratam impreuna. Astfel am putea scrie o singura metoda care primeste ca parametru un sir de numere si le calculeaza media oricate ar fi. Pentru asta vom avea nevoie si de instructiunea for despre care vom vorbi in lectia urmatoare. Momentan sa ne concentram asupra lucrurilor importante care trebuiesc cunoscute despre siruri.

Pentru a declara faptul ca o variabila este de tip sir se folosesc parantezele patrate [] astfel:


  int[] sirDeNumereIntregi;
  double[] sirDeNumereReale;
  boolean[] sirDeVariabileBooleene;

Prin aceasta declaratie este anuntat compilatorul de exemplu ca exista o variabila numita sirDeNumereIntregi care poate pastra in ea o referinta(adresa de memorie) catre un sir de numere intregi. Nu s-a alocat inca memorie pentru aceastea. Alocarea memoriei pentru sirul respectiv se face folosind instructiunea new. Discutiile de mai jos sunt exemplificate pentru tipul int dar sunt valabile pentru orice tip primitiv, si mai departe vom vedea ca si pentru orice tip in general.


sirDeNumereIntregi = new int[10];

Abia acum exista o zona de memorie pregatita sa stocheze 10 valori de tip int iar adresa zonei respective este pastrata in variabila sirDeNumereIntregi.

In practica se combina cele doua constructii, declararea si initializarea astfel:


int[] sirDeNumereIntregi = new int[10];

Tot in practica se mai foloseste o constructie care asigura si initializarea valorilor din array intr-un singur pas. In acest caz nu se mai specifica lungimea sirului, aceasta rezultand din numarul de elemente din acolade:


int[] sirDeNumereIntregi = {5, 7, 8, 3};

Pentru a accesa un anumit element din sir se foloseste index-ul acestuia. Exemplu: sir[2]. Indecsii pornesc de la 0. Deci primul element din sir va avea indexul 0. Pentru a obtine lungimea sirului in caz ca e nevoie de ea in cod se foloseste o variabila pe care orice sir o are, length. Exemplu: sir.length.

Pentru a afisa usor un sir se poate folosi metoda Arrays.toString(numeSir) care returneaza o reprezentare text a informatiilor din sirul pasat ca parametru. Exemple:


  int[] sir = new sir[3];      // cream o variabila sir si o initializam cu un sir de 3 int-uri. 
  System.out.println(sir[0]);  // afisam elementul de la pozitia 0. Valoarea initiala a acestuia este 0, lucru valabil pentru orice tip numeric
  System.out.println(sir[2]);  // afisam elementul de la pozitia 2. Valoarea initiala a acestuia este 0, lucru valabil pentru orice tip numeric
  sir[0] = 10;                 // setam elementul de pe pozitia 0 cu valoarea 10
  System.out.println(sir[0]);  // afisam elementul de la pozitia 0. Valoarea acestuia e acum 10
  System.out.println(Arrays.toString(sir));  // afisam intregul sir. Valoarea afisata e [10, 0, 0]
  System.out.println(sir.length);  // afisam lungimea sirului. Aceasta este 3 

Accesarea unui index invalid, dincolo de limitele sirului va genera o asa numita exceptie, care este de tipul ArrayIndexOutOfBounds. Exceptiile sunt niste erori mai speciale, vom vorbi despre ele ceva mai tarziu. Momentan trebuie doar retinut ca ArrayIndexOutOfBounds semnifica faptul ca s-a incercat accesarea unui index dincolo de limitele sirului. Exemplu:


  int[] sir = new sir[3];      
  System.out.println(sir[3]);  // Elementul de la pozitia 3 nu exista pentru ca indecsii incep de la 0
                               // deci elementele au indecsii 0, 1 si 2 

Va rezulta o eroare de forma:


  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
     at com.tjse.scraps.Test.main(Test.java:19)  

Se poate observa ca exceptia contine si valoarea indexului gresit deci aceasta informatie poate fi utilizata pentru a determina cu usurinta sursa problemei. Pe randul urmator se poate vedea si numele clasei si linia de cod care a generat aceasta eroare.

Este momentul sa arati ce ai invatat. Rezolva testul TR10 pentru a-ti verifica cunostintele dobandite pana acum.