„Rishi, abia aștept cu nerăbdare să învăț despre restul metodelor clasei Arrays.

"O asemenea râvnă pentru învățare nu poate decât să-i mulțumească pe vechiul tău profesor! Dar, dacă vrei cu adevărat să afli totul, un vrăjitor amabil pe nume Google te va ajuta zi și noapte."

"Uh..."

„Glumesc. Cam. Desigur, o să explic totul mai bine, dar dacă ceva apare ceva - amintește-ți de vrăjitorul bun. Voi începe lecția de astăzi cu Arrays.fillmetoda

„Când lucrează cu matrice, programatorii Java de foarte multe ori trebuie să umple matricea cu aceeași valoare. Puteți, desigur, să scrieți o buclă și pur și simplu să atribuiți o valoare fiecărei celule a matricei din buclă:

int[] x = new int[100];
for (int i = 0; i < x.length; i++)
x[i] = 999;

„Sau în loc de toate acestea, puteți apela Arrays.fill()metoda, care face exact același lucru: umple matricea transmisă cu valoarea transmisă. Iată cum arată:

Arrays.fill(name, value)

Și codul din exemplul de mai sus poate fi făcut puțin mai compact și mai clar:

int[] x = new int[100];
Arrays.fill(x, 999);

"Frumoasa!"

„De asemenea, puteți utiliza Arrays.fill()metoda pentru a umple nu întreaga matrice, ci o parte a acesteia, cu o anumită valoare:

Arrays.fill(name, first, last, value)

„Unde primul și ultimul sunt indicii primei și ultimei celule de completat.

În conformitate cu vechea tradiție bună (sau rea) a Java, amintiți-vă că ultimul element nu este inclus în gamă.

Exemplu:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

Arrays.fill(x, 3, 7, 999);


String str = Arrays.toString(x);

Umplem celulele x[3], x[4], x[5], și x[6]cu valoarea 999. Celulele unei matrice sunt numerotate începând de la zero!

Variabila strconține valoarea
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

Arrays.fill()Metoda funcționează doar cu matrice unidimensionale. Dacă treceți o matrice bidimensională metodei, aceasta va fi tratată ca fiind unidimensională, cu toate consecințele care decurg.

Arrays.copyOf()

„Amigo, te rog spune-mi cum să schimb dimensiunea unei matrice după ce a fost creată?”

"Umm... Asta-i o întrebare șmecheră, nu? Nu mai sunt atât de neexperimentat. Răspunsul corect este că nu poți! Nu poți redimensiona o matrice după ce a fost creată."

— Dar dacă vrei cu adevărat?

„Încă este imposibil!

„De fapt, dacă vrei cu adevărat, atunci poți! Cu ajutorul unui truc de programare:

  1. Mai întâi, creați o nouă matrice de lungimea dorită
  2. Apoi copiați toate elementele din prima matrice în ea.

„Acestea sunt cele două lucruri pe care Arrays.copyOf()le face metoda. Iată cum arată numirea ei:

Type[] name2 = Arrays.copyOf(name, length);

„Această metodă nu modifică matricea existentă , ci creează o nouă matrice și copiază elementele matricei vechi în ea.”

„Ce se întâmplă dacă lungimea noii matrice este mai mică decât lungimea celei existente ?

"Foarte bună întrebare, Amigo! Dacă elementele nu se potrivesc, atunci valorile suplimentare sunt pur și simplu ignorate."

„Și dacă, dimpotrivă, există celule în plus, care sunt valorile lor inițiale?

„Dacă lungimea noii matrice este mai mare decât lungimea celei vechi, celulele sunt umplute cu zerouri.

Exemplu:

int[] x = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

int[] x2 = Arrays.copyOf(x, 5);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOf(x, 15);
String str3 = Arrays.toString(x3);


Variabila str2conține valoarea Variabila conține valoarea
"[1, 2, 3, 4, 5]"

str3
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

Arrays.copyOfRange()

„Și ce se întâmplă dacă doriți să obțineți o matrice cu lungimea 5 dintr-o matrice cu lungimea 10, dar aveți nevoie ca aceasta să conțină ultimele 5 elemente, mai degrabă decât primele 5? În acest caz, aveți nevoie de o altă metodă a clasei. ArraysEste Arrays.copyOfRange(). Iată cum arată numirea:

Type[] name2 = Arrays.copyOfRange(name, first, last);

„Această metodă creează, de asemenea, o nouă matrice, dar o umple cu elemente dintr-un loc arbitrar în matricea originală. Unde primul și ultimul sunt indicii primului și ultimului elemente care ar trebui să fie introduși în noua matrice. Îmi puteți spune dacă ultimul element este inclus în acest interval?"

„Ha! Așa cum obișnuia să spună marele meu profesor, „ în conformitate cu vechea tradiție bună (sau rea) a Java, amintiți-vă că ultimul element nu este inclus în gamă ”.

„Amigo, crești chiar în fața ochilor noștri.

Exemplu:

int[] x = {11, 12, 13, 14, 15, 16, 17, 18, 19, 20};

int[] x2 = Arrays.copyOfRange(x, 5, 10);
String str2 = Arrays.toString(x2);

int[] x3 = Arrays.copyOfRange(x, 5, 15);
String str3 = Arrays.toString(x3);


Variabila str2conține valoarea Variabila conține valoarea
"[16, 17, 18, 19, 20]"

str3
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"

Arrays.sort()

„Și, în sfârșit, am lăsat cea mai... mmm... metodă plăcută pentru final: sortarea . Array-urile sunt sortate destul de des în programare. Iată primele 3 cele mai populare acțiuni atunci când lucrezi cu matrice:

  • Sortarea unei matrice
  • Găsirea elementului minim (sau maxim) al unui tablou
  • Determinarea indexului unui element dintr-o matrice (găsirea unui element într-o matrice)

„Algoritmii de sortare performanți, trebuie să spun, nu sunt atât de ușor de scris. Mai precis, aceasta este o sarcină standard și, ca student, nu te va strica să exersezi uneori algoritmii de sortare de scriere. Dar la serviciu, este mai bine să nu vă pierdeți timpul reinventând roata. Creatorii lui Java au inclus metoda sort()în Arraysclasă. Iată cum arată numirea ei:

Arrays.sort(name);

Această metodă sortează matricea transmisă în ordine crescătoare.

Exemplu:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x);
String str = Arrays.toString(x);


Variabila strconține valoarea
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

"Excelent! Am apelat la o singură metodă și matricea este sortată. O chestie de frumusețe!"

„Apropo, puteți sorta nu numai întreaga matrice, ci și doar o parte a acesteia. Iată cum arată apelarea:

Arrays.sort(name, first, last);

„Unde primul și ultimul sunt indicii primei și ultimei celule pe care ar trebui să-i atingă sortarea. ȘI...

„Știu deja ce veți spune! „În conformitate cu vechea tradiție bună (sau rea) a Java, amintiți-vă că ultimul element nu este inclus în gamă” .

Exemplu:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};

Arrays.sort(x, 4, 8);
String str = Arrays.toString(x);


Variabila strconține valoarea
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

„Pentru a sorta matrice, Java folosește cel mai rapid algoritm de sortare – QuickSort . Complexitatea sa de calcul depinde de dimensiunea matricei și este calculată folosind formula N log(N).

"Sortarea unei matrice de 1000 de elemente va implica aproximativ 10.000 de comparații de elemente ale matricei. Sortarea unei matrice de un milion de elemente va implica aproximativ 20 de milioane de comparații."

Nu prea multe comparații când te gândești la numărul de elemente!”

„Tocmai asta spun. Algoritmul QuickSort este foarte eficient.

Arrays.binarySearch()

„Ei bine, și ultima dintre cele mai interesante metode ale clasei Arrayseste capabilă să caute o anumită valoare într-o matrice. Aceasta nu este o căutare obișnuită – este iubita căutare binară . Se rezumă la asta:

  • Mai întâi, matricea este sortată.
  • Apoi elementul din mijloc al matricei este comparat cu cel pe care îl căutăm.
  • Dacă elementul este mai mare decât elementul din mijloc, atunci căutarea continuă în jumătatea dreaptă a matricei.
  • Dacă elementul pe care îl căutăm este mai mic decât elementul din mijloc, atunci căutarea continuă în jumătatea stângă a matricei.

„Deoarece matricea este sortată, este posibil să se elimine jumătate dintr-o singură comparație. Apoi, în pasul următor, aruncăm o altă jumătate și așa mai departe”.

"Fantastic! Trecem direct la obiectiv foarte repede!"

„Exact. Într-o matrice de un milion (!) de elemente, algoritmul de căutare binară poate găsi indexul elementului dorit în doar 20 de comparații. Deficiența algoritmului este că matricea trebuie mai întâi sortată, iar sortarea necesită și timp.

Iată cum arată numirea:

int index = Arrays.binarySearch(name, value);

„Unde nameeste numele matricei, care trebuie trecut deja sortat (de exemplu, folosind metoda Arrays.sort()). Și valueeste elementul pe care îl căutăm în matrice. Rezultatul returnat de metodă este indexul elementului de matrice dorit. .

Exemple:

int[] x = {11, -2, 3, 0, 999, -20, 8, -20, 99, -20};
Arrays.sort(x);

int index1 = Arrays.binarySearch(x, 0);
int index2 = Arrays.binarySearch(x, -20);
int index3 = Arrays.binarySearch(x, 99);
int index4 = Arrays.binarySearch(x, 5);
xeste
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(indici 0și 2sunt, de asemenea, acceptabili)
8
-7

„Ce se întâmplă dacă elementul dorit apare de mai multe ori în matrice ?”

„Aceasta este o întrebare validă, Amigo. În acest caz, algoritmul va returna indexul unuia dintre ei (nu există nicio garanție că va fi, să zicem, primul sau invers – ultimul dintre aceste elemente duplicat) ."

„Ce se întâmplă dacă matricea nu conține deloc elementul dorit?”

„În acest caz, algoritmul va returna un indice negativ .

Documentație

"Totul este clar, Rishi! A fost foarte interesant."

„Dacă ați găsit cu adevărat acest lucru foarte interesant, atunci răsfoiți pe îndelete documentația oficială a Arraysclasei și metodele acesteia de pe site-ul Oracle .

„Puteți arunca o privire mai atentă, de exemplu, la metodele Arrays.mismatch()și Arrays.compare(). Cel mai probabil, le veți putea folosi în mod adecvat.

"And don't be confused by the number of methods. Each method has 5-10 variants, which differ only in their parameter types."