1.Arrays.fill()

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 puteți apela pur și simplu 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);

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 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]"

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



2.Arrays.copyOf()

După cum știți deja, nu puteți redimensiona o matrice după ce a fost creată.

Dar dacă vrei cu adevărat?

Ei bine, dacă chiar vrei, atunci poți!

  • Creați o nouă matrice de lungimea dorită
  • Copiați toate elementele din prima matrice în ea.

Apropo, asta este exact ceea ce Arrays.copyOf()face metoda. Iată cum arată numirea:

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

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

Dacă elementele nu se potrivesc (lungimea este mai mică decât lungimea matricei existente ), atunci valorile suplimentare sunt ignorate.

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:
"[1, 2, 3, 4, 5]"

Variabila str3conține valoarea:
"[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]"

3.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, o altă metodă a Arraysclasei va fi utilă - Arrays.copyOfRange(). Iată cum arată când îl numim:

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

Această metodă creează și o nouă matrice, dar o umple cu elemente dintr-un loc arbitrar din tabloul original. Unde primul și ultimul sunt indicii primului și ultimului element care ar trebui să fie introduși în noua matrice.

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

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:
"[16, 17, 18, 19, 20]"

Variabila str3conține valoarea:
"[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]"


4.Arrays.sort()

Ah, cea mai delicioasă răsfăț: sortarea . Matricele sunt sortate destul de des în programare. Cele mai frecvente trei acțiuni atunci când lucrați cu matrice sunt:

  • 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)

Acesta este motivul pentru care creatorii Java au inclus sort()metoda în Arraysclasă. Iată cum arată numirea:

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, nu? Ați apelat la o metodă și acum aveți o matrice sortată. Frumoasa.

Apropo, puteți folosi această metodă pentru a sorta nu numai întreaga matrice, ci doar o parte a acesteia. Iată cum arată numirea:

Arrays.sort(name, first, last);

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

În conformitate cu vechea tradiție 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 3.000 de comparații de elemente ale matricei. Sortarea unui set de un milion de elemente va implica aproximativ 6 milioane de comparații.



5.Arrays.binarySearch()

Ei bine, și ultima dintre cele mai interesante metode ale clasei Arrayseste capabilă să caute o valoare dată într-o matrice. Aceasta nu este o căutare obișnuită - este îndrăgita 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.

Această abordare face căutarea binară foarte rapidă. Într-o matrice de un milion (!) elemente, poate găsi indexul elementului dorit în doar 20 de comparații. Deficiența abordării 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, acceptabile)
8
-7

Dacă matricea conține mai multe instanțe ale elementului căutat, atunci algoritmul va returna pur și simplu indexul unuia dintre ele (nu există nicio garanție că va fi, de exemplu, primul sau invers - ultimul dintre acestea. elemente duplicat)."

Dacă elementul nu este găsit în matrice, atunci indexul va fi negativ.



6. Link către documentația Oracle de pe Arraysclasă

Dacă sunteți super interesat, puteți citi totul despre Arraysclasă și toate metodele acesteia în documentația oficială a href="https://docs.oracle.com/en/java/javase/14/docs/api/java.base /java/util/Arrays.html">pe site-ul web Oracle.

De exemplu, puteți citi despre metodele Arrays.mismatch()și Arrays.compare(). Poate le vei găsi utile cumva.

Și nu vă confundați cu numărul de metode. Fiecare metodă are 5-10 variante, care diferă doar prin tipurile de parametri.