Arrays
Până acum, fiecare variabilă ținea un singur lucru. Dar dacă vrem să stocăm toate personajele din GTA Vice City? Să scriem nume1, nume2, nume3... este urât. Avem nevoie de un array
Un array este o colecție de valori de același tip, stocate într-o singură variabilă
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy Vercetti", "Lance Vance", "Cortez", "Phil Cassidy" };
System.out.println(nume[0]);
System.out.println(nume[1]);
System.out.println(nume[2]);
}
}
Ieșire
Tommy Vercetti
Lance Vance
Cortez
Două lucruri noi
- Tipul este String[] (observă []): „un array de String-uri"
- Folosim { } ca să listăm valorile, separate prin virgule
Numărarea începe de la 0. nume[0] este primul element, nume[1] al doilea, și așa mai departe
Array-urile Java au o mărime fixă. Odată ce le creezi, nu poți adăuga sau elimina elemente. (Pentru colecții dinamice, Java are ArrayList, dar deocamdată rămânem la array-uri)
Câte elemente are array-ul? Folosește .length
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy", "Lance", "Cortez" };
System.out.println(nume.length); // 3
}
}
Observă: nume.length nu are paranteze, spre deosebire de String.length(). Da, asta este enervant de inconsecvent: array-urile folosesc un câmp numit length, în timp ce String-urile au o metodă numită length()
Putem de asemenea să creăm un array cu o mărime fixă, apoi să-l umplem mai târziu
public class Main {
public static void main(String[] args) {
int[] scoruri = new int[5]; // un array de 5 int-uri, toate zero implicit
scoruri[0] = 80;
scoruri[1] = 95;
scoruri[2] = 60;
scoruri[3] = 72;
scoruri[4] = 88;
System.out.println(scoruri[2]); // 60
}
}
new int[5] creează un array cu 5 sloturi. Implicit sunt umplute cu 0 pentru numere, null pentru obiecte (ca String-urile) și false pentru booleans
Putem schimba o valoare la orice indice
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy", "Lance", "Cortez" };
nume[1] = "Lance Vance Dance";
System.out.println(nume[1]); // Lance Vance Dance
}
}
Ce se întâmplă dacă cerem un indice care nu există?
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy", "Lance", "Cortez" };
System.out.println(nume[10]);
}
}
Rulează-l. Java aruncă o ArrayIndexOutOfBoundsException și se prăbușește. Citește mereu mesajul de eroare, îți spune exact ce indice ai cerut și care era limita
Acum partea cea mai utilă: să parcurgem toate elementele. Să afișăm câte un salut pentru fiecare nume. Am putea scrie o linie pentru fiecare
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy", "Lance", "Cortez" };
System.out.println("Salut, " + nume[0] + "!");
System.out.println("Salut, " + nume[1] + "!");
System.out.println("Salut, " + nume[2] + "!");
}
}
Repetitiv, și se rupe în clipa în care array-ul are mai multe elemente. Bucla for merge mână în mână cu array-urile
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy", "Lance", "Cortez" };
for (int i = 0; i < nume.length; i++) {
System.out.println("Salut, " + nume[i] + "!");
}
}
}
Observă că am folosit i < nume.length, nu i <= nume.length. De ce? Pentru că indicii merg de la 0 la length - 1. Pentru un array de 3 elemente, indicii sunt 0, 1, 2. i = 3 este în afara limitelor. i < length se oprește exact la locul potrivit
Java are o formă mai scurtă când nu avem nevoie de indice: bucla for îmbunătățită (numită și for-each)
public class Main {
public static void main(String[] args) {
String[] nume = { "Tommy", "Lance", "Cortez" };
for (String n : nume) {
System.out.println("Salut, " + n + "!");
}
}
}
Citește-o ca: „pentru fiecare n din nume, fă asta". Mai curată când vrem doar valoarea
Forma este for (Tip variabila : array) { ... }. :-ul din mijloc este esențial
Când alegi una față de cealaltă?
- Folosește for clasic când ai nevoie de indice (de exemplu, pentru a afișa numerele pozițiilor)
- Folosește for îmbunătățit când ai nevoie doar de valoare
Ambele sunt comune. Codul Java le folosește pe amândouă în funcție de situație
Un șablon clasic: adunarea numerelor dintr-un array
public class Main {
public static void main(String[] args) {
int[] preturi = { 10, 20, 30, 40 };
int total = 0;
for (int pret : preturi) {
total = total + pret;
}
System.out.println(total);
}
}
Output 100. Începe cu total = 0, parcurge fiecare preț, adaugă-l la total. Vei scrie acest gen de buclă mult în cariera ta. Citește-o linie cu linie până devine a doua natură
Misiune: Raportul Imperiului
Fiecare afacere a lui Tommy din Vice City și-a raportat încasările pe ziua de azi. Sarcina ta este să produci un raport rapid: listează fiecare sumă, apoi arată totalul și media.
Pune încasările într-un array de int numit incasari. Apoi:
- Afișează fiecare sumă pe linia ei
- Afișează totalul tuturor sumelor
- Afișează media ca număr zecimal (folosește o conversie la
double)
Sfat: dacă împarți total / numarul_de_sume ca int-uri, obții un întreg trunchiat, nu un zecimal. Convertește o parte la double ca să păstrezi zecimalele:
double media = (double) total / incasari.length;
Exemplu
Pentru încasările { 1200, 3400, 800, 2600 }, programul tău ar trebui să afișeze
1200
3400
800
2600
8000
2000.0
Exemplu pentru o singură afacere { 5000 } (media este chiar acea sumă)
5000
5000
5000.0
Exemplu când media nu este un număr rotund { 125, 200 }
125
200
325
162.5