"Rishi, jeg ser virkelig frem til at lære om resten af ​​metoderne i Arrays-klassen.

"Sådan en iver for at lære kan ikke andet end at glæde din gamle lærer! Men hvis du virkelig vil finde ud af alt, vil en venlig troldmand ved navn Google hjælpe dig dag og nat."

"Øh..."

"Bare for sjov. Lidt. Selvfølgelig vil jeg forklare det hele bedre, men hvis noget dukker op - husk den gode troldmand. Jeg starter dagens lektion med Arrays.fillmetoden

"Når de arbejder med arrays, har Java-programmører meget ofte brug for at fylde arrayet med den samme værdi. Du kan selvfølgelig skrive en løkke og blot tildele en værdi til hver celle i arrayet i løkken:

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

"Eller i stedet for alt dette kan du kalde Arrays.fill()metoden, som gør nøjagtig det samme: den fylder det beståede array med den beståede værdi. Sådan ser det ud:

Arrays.fill(name, value)

Og koden i eksemplet ovenfor kan gøres en lille smule mere kompakt og tydeligere:

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

"Smuk!"

"Du kan også bruge Arrays.fill()metoden til ikke at fylde hele arrayet, men en del af det, med en vis værdi:

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

"Hvor første og sidste er indekserne for den første og sidste celle, der skal udfyldes.

" I overensstemmelse med Javas gode (eller dårlige) gamle tradition, husk, at det sidste element ikke er inkluderet i sortimentet.

Eksempel:

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

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


String str = Arrays.toString(x);

Vi udfylder cellerne x[3], x[4], x[5]og x[6]med værdien 999. Celler i en matrix er nummereret fra nul!

Variablen strindeholder værdien
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

" Arrays.fill()Metoden fungerer kun med en-dimensionelle arrays. Hvis man videregiver et to-dimensionelt array til metoden, vil det blive behandlet som en-dimensionelt med alle de konsekvenser, det har deraf.

Arrays.copyOf()

"Amigo, fortæl mig venligst, hvordan man ændrer størrelsen på et array, efter at det er blevet oprettet?"

"Umm... Det er et trick spørgsmål, ikke? Jeg er ikke så uerfaren længere. Det korrekte svar er, at det kan du ikke! Du kan ikke ændre størrelsen på et array, efter det er blevet oprettet."

"Men hvad hvis du virkelig vil?"

"Det er stadig umuligt!

"Faktisk, hvis du virkelig vil, så kan du! Ved hjælp af et programmeringstrick:

  1. Først opretter du et nyt array med den ønskede længde
  2. Derefter kopierer du alle elementerne fra det første array ind i det.

"Dette er de to ting, som metoden Arrays.copyOf()gør. Sådan ser kaldet det ud:

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

"Denne metode ændrer ikke det eksisterende array , men opretter i stedet et nyt array og kopierer elementerne fra det gamle array ind i det."

"Hvad hvis længden af ​​det nye array er mindre end længden af ​​det eksisterende ?

"Godt spørgsmål, Amigo! Hvis elementerne ikke passer, så ignoreres de ekstra værdier simpelthen."

"Og hvis der tværtimod er ekstra celler, hvad er deres startværdier?

"Hvis længden af ​​det nye array er større end længden af ​​det gamle, er cellerne fyldt med nuller.

Eksempel:

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


Variablen str2indeholder værdien Variablen indeholder værdien
"[1, 2, 3, 4, 5]"

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

Arrays.copyOfRange()

"Og hvad hvis du vil have en matrix med længde 5 fra en matrix med længde 10, men du har brug for, at den indeholder de sidste 5 elementer i stedet for de første 5? I dette tilfælde har du brug for en anden metode i klassen. Det Arrayser Arrays.copyOfRange(). Sådan ser kald det ud:

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

"Denne metode opretter også et nyt array, men fylder det med elementer fra et vilkårligt sted i det originale array. Hvor første og sidste er indekserne for det første og sidste element, der skal lægges ind i det nye array. Kan du fortælle mig, om er det sidste element inkluderet i dette område?"

"Ha! Som min store lærer plejede at sige, ' i overensstemmelse med Javas gode (eller dårlige) gamle tradition, husk at det sidste element ikke er inkluderet i rækken '."

"Amigo, du vokser lige foran vores øjne.

Eksempel:

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


Variablen str2indeholder værdien Variablen indeholder værdien
"[16, 17, 18, 19, 20]"

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

Arrays.sort()

"Og til sidst lod jeg den mest ... mmm ... behagelig metode til sidst: sortering . Arrays sorteres ret ofte i programmering. Her er de 3 mest populære handlinger, når du arbejder med arrays:

  • Sortering af et array
  • At finde minimum (eller maksimum) element i en matrix
  • Bestemmelse af indekset for et element i en matrix (finde et element i en matrix)

"Veltydende sorteringsalgoritmer, må jeg sige, er ikke så nemme at skrive. Mere præcist er dette en standardopgave, og som studerende vil det ikke skade dig at øve dig i at skrive sorteringsalgoritmer nogle gange. Men på arbejdet er det bedre ikke at spilde din tid på at genopfinde hjulet. Javas skabere inkluderede metoden sort()i Arraysklassen. Sådan ser den ud:

Arrays.sort(name);

Denne metode sorterer det beståede array i stigende rækkefølge.

Eksempel:

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

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


Variablen strindeholder værdien
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

"Fremragende! Jeg kaldte kun én metode, og rækken er sorteret. En ting af skønhed!"

"Du kan i øvrigt sortere ikke kun hele arrayet, men også kun en del af det. Sådan ser kald det ud:

Arrays.sort(name, first, last);

"Hvor første og sidste er indeksene for den første og sidste celle, som sorteringen skal røre ved. OG...

"Jeg ved allerede, hvad du vil sige! 'I overensstemmelse med Javas gode (eller dårlige) gamle tradition, husk, at det sidste element ikke er inkluderet i sortimentet' .

Eksempel:

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

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


Variablen strindeholder værdien
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

"For at sortere arrays bruger Java den hurtigste sorteringsalgoritme — QuickSort . Dens beregningsmæssige kompleksitet afhænger af arrayets størrelse og beregnes ved hjælp af formlen N log(N).

"Sortering af en matrix på 1000 elementer vil involvere omkring 10.000 sammenligninger af matrixelementer. Sortering af en matrix på en million elementer vil involvere omkring 20 millioner sammenligninger."

" Ikke for mange sammenligninger, når man tænker på antallet af elementer!"

"Det er præcis, hvad jeg siger. QuickSort- algoritmen er meget effektiv.

Arrays.binarySearch()

"Nå, og den sidste af de mest interessante metoder i klassen Arrayser i stand til at søge efter en given værdi i et array. Dette er ingen almindelig søgning - det er den elskede binære søgning . Det koger ned til dette:

  • Først sorteres arrayet.
  • Derefter sammenlignes det midterste element i arrayet med det, vi leder efter.
  • Hvis elementet er større end det midterste element, så fortsætter søgningen i højre halvdel af arrayet.
  • Hvis det element, vi leder efter, er mindre end det midterste element, så fortsætter søgningen i venstre halvdel af arrayet.

"Fordi arrayet er sorteret, er det muligt at eliminere halvdelen af ​​det i en enkelt sammenligning. Så i næste trin smider vi en anden halvdel ud, og så videre."

"Fantastisk! Vi rykker direkte til målet meget hurtigt!"

"Nøjagtigt. I et array af en million (!) elementer kan den binære søgealgoritme finde indekset for det ønskede element i blot 20 sammenligninger. Algoritmens mangel er, at arrayet først skal sorteres, og sorteringen tager også tid.

Sådan ser kald det ud:

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

"Hvor nameer navnet på arrayet, som skal bestå allerede sorteret (f.eks. ved hjælp af metoden Arrays.sort()). Og valueer det element, vi søger efter i arrayet. Resultatet returneret af metoden er indekset for det ønskede arrayelement .

Eksempler:

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);
xer
{-20, -20, -20, -2, 0, 3, 8, 11, 99, 999}

4
1(indekser 0og 2er også acceptable)
8
-7

"Hvad hvis det ønskede element vises flere gange i arrayet ?"

"Det er et gyldigt spørgsmål, Amigo. I dette tilfælde vil algoritmen returnere indekset for en af ​​dem (der er ingen garanti for, at det f.eks. vil være det allerførste eller omvendt - det allersidste af disse duplikerede elementer) ."

"Hvad hvis arrayet slet ikke indeholder det ønskede element?"

"I dette tilfælde vil algoritmen returnere et negativt indeks .

Dokumentation

"Alt er klart, Rishi! Det var meget interessant."

"Hvis du virkelig fandt dette meget interessant, så søg i ro og mag gennem den officielle dokumentation for klassen Arraysog dens metoder på Oracle-webstedet .

"Du kan se nærmere på for eksempel metoderne Arrays.mismatch()og Arrays.compare(). Dem vil du højst sandsynligt kunne bruge.

"Og lad dig ikke forvirre af antallet af metoder. Hver metode har 5-10 varianter, som kun adskiller sig i deres parametertyper."