"Rishi, jag ser verkligen fram emot att lära mig om resten av metoderna i Arrays-klassen.

"En sådan iver för att lära kan inte annat än att glädja din gamla lärare! Men om du verkligen vill ta reda på allt, kommer en snäll trollkarl vid namn Google att hjälpa dig dag och natt."

"Äh..."

"Skämtar bara. Typ. Självklart ska jag förklara allt bättre, men om något dyker upp - kom ihåg den goda trollkarlen. Jag börjar dagens lektion med Arrays.fillmetoden

"När de arbetar med arrayer behöver Java-programmerare väldigt ofta fylla arrayen med samma värde. Du kan naturligtvis skriva en loop och helt enkelt tilldela ett värde till varje cell i arrayen i slingan:

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

"Eller istället för allt detta kan du anropa Arrays.fill()metoden, som gör exakt samma sak: den fyller den godkända arrayen med det godkända värdet. Så här ser det ut:

Arrays.fill(name, value)

Och koden i exemplet ovan kan göras lite mer kompakt och tydligare:

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

"Skön!"

"Du kan också använda Arrays.fill()metoden för att fylla inte hela arrayen, utan en del av den, med något värde:

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

"Där första och sista är indexen för den första och sista cellen som ska fyllas.

" I enlighet med Javas goda (eller dåliga) gamla tradition, kom ihåg att det sista elementet inte ingår i sortimentet.

Exempel:

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

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


String str = Arrays.toString(x);

Vi fyller cellerna x[3], x[4], x[5]och x[6]med värdet 999. Celler i en matris numreras från noll!

Variabeln strinnehåller värdet
"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]"

" Arrays.fill()Metoden fungerar bara med endimensionella arrayer. Om du skickar en tvådimensionell array till metoden kommer den att behandlas som endimensionell, med alla följder av det.

Arrays.copyOf()

"Amigo, berätta för mig hur man ändrar storleken på en array efter att den har skapats?"

"Umm... Det är en trickfråga, eller hur? Jag är inte så oerfaren längre. Det korrekta svaret är att du inte kan! Du kan inte ändra storlek på en array efter att den har skapats."

"Men tänk om du verkligen vill?"

"Det är fortfarande omöjligt!

"Faktiskt, om du verkligen vill, då kan du! Med hjälp av ett programmeringstrick:

  1. Först skapar du en ny array med önskad längd
  2. Sedan kopierar du alla element från den första arrayen till den.

"Det här är de två sakerna som metoden Arrays.copyOf()gör. Så här ser den ut:

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

"Den här metoden ändrar inte den befintliga arrayen utan skapar istället en ny array och kopierar elementen från den gamla arrayen till den."

"Vad händer om längden på den nya arrayen är mindre än längden på den befintliga ?

"Bra fråga, Amigo! Om elementen inte passar, så ignoreras de extra värdena helt enkelt."

"Och om det tvärtom finns extra celler, vilka är deras initiala värden?

"Om längden på den nya arrayen är större än längden på den gamla fylls cellerna med nollor.

Exempel:

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


Variabeln str2innehåller värdet Variabeln innehåller värdet
"[1, 2, 3, 4, 5]"

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

Arrays.copyOfRange()

"Och vad händer om du vill få en array med längden 5 från en array med längden 10, men du behöver den ska innehålla de sista 5 elementen snarare än de första 5? I det här fallet behöver du en annan metod för klassen. Det Arraysär Arrays.copyOfRange(). Så här ser den ut:

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

"Denna metod skapar också en ny array, men fyller den med element från en godtycklig plats i den ursprungliga arrayen. Där första och sista är indexen för de första och sista elementen som ska läggas in i den nya arrayen. Kan du berätta om det sista elementet ingår i detta intervall?"

"Ha! Som min stora lärare brukade säga, ' i enlighet med Javas goda (eller dåliga) gamla tradition, kom ihåg att det sista elementet inte ingår i intervallet'. "

"Amigo, du växer mitt framför våra ögon.

Exempel:

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


Variabeln str2innehåller värdet Variabeln innehåller värdet
"[16, 17, 18, 19, 20]"

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

Arrays.sort()

"Och slutligen lämnade jag den mest... mmm... trevliga metoden till sist: sortering . Matriser sorteras ganska ofta i programmering. Här är de tre mest populära åtgärderna när man arbetar med matriser:

  • Sortera en array
  • Hitta minimum (eller maximum) element i en array
  • Bestämma indexet för ett element i en array (hitta ett element i en array)

"Välpresterande sorteringsalgoritmer måste jag säga att det inte är så lätt att skriva. Närmare bestämt är det här en standarduppgift, och som student kommer det inte att skada dig att träna på att skriva sorteringsalgoritmer ibland. Men på jobbet är det bättre att inte slösa bort din tid på att återuppfinna hjulet. Javas skapare inkluderade metoden sort()i Arraysklassen. Så här ser den ut:

Arrays.sort(name);

Denna metod sorterar den passerade arrayen i stigande ordning.

Exempel:

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

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


Variabeln strinnehåller värdet
"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]"

"Utmärkt! Jag kallade bara en metod och arrayen är sorterad. En sak av skönhet!"

"Förresten, du kan sortera inte bara hela arrayen, utan också bara en del av den. Så här ser det ut att kalla det:

Arrays.sort(name, first, last);

"Där första och sista är indexen för den första och sista cellen som sorten ska beröra. OCH...

"Jag vet redan vad du kommer att säga! 'I enlighet med Javas goda (eller dåliga) gamla tradition, kom ihåg att det sista elementet inte ingår i sortimentet' .

Exempel:

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

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


Variabeln strinnehåller värdet
"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]"

"För att sortera arrayer använder Java den snabbaste sorteringsalgoritmen — QuickSort . Dess beräkningskomplexitet beror på arrayens storlek och beräknas med formeln N log(N).

"Att sortera en array med 1000 element kommer att involvera cirka 10 000 jämförelser av arrayelement. Att sortera en array med en miljon element kommer att involvera cirka 20 miljoner jämförelser."

" Inte för många jämförelser när man tänker på antalet element!"

"Det är precis vad jag säger. QuickSort- algoritmen är mycket effektiv.

Arrays.binarySearch()

"Tja, och den sista av de mest intressanta metoderna i klassen Arrayskan söka efter ett givet värde i en array. Detta är ingen vanlig sökning - det är den älskade binära sökningen . Det kokar ner till detta:

  • Först sorteras arrayen.
  • Sedan jämförs mittelementet i arrayen med det vi letar efter.
  • Om elementet är större än mittelementet fortsätter sökningen i den högra halvan av arrayen.
  • Om elementet vi letar efter är mindre än mittelementet, fortsätter sökningen i den vänstra halvan av arrayen.

"Eftersom arrayen är sorterad är det möjligt att eliminera hälften av den i en enda jämförelse. Sedan i nästa steg slänger vi ut ytterligare en halv, och så vidare."

"Fantastiskt! Vi går rakt mot målet väldigt snabbt!"

"Precis. I en array med en miljon (!) element kan den binära sökalgoritmen hitta indexet för det önskade elementet i bara 20 jämförelser. Algoritmens brist är att arrayen först måste sorteras, och sorteringen tar också tid.

Så här ser den ut:

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

"Var nameär namnet på arrayen, som måste skickas redan sorterad (till exempel med Arrays.sort()metoden). Och valueär det element vi söker efter i arrayen. Resultatet som returneras av metoden är indexet för det önskade arrayelementet .

Exempel:

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

4
1(index 0och 2är också acceptabla)
8
-7

"Vad händer om det önskade elementet visas flera gånger i arrayen? "

"Det är en giltig fråga, Amigo. I det här fallet kommer algoritmen att returnera indexet för en av dem (det finns ingen garanti för att det kommer att vara, säg, den allra första, eller vice versa - den allra sista av dessa duplicerade element) ."

"Tänk om arrayen inte alls innehåller det önskade elementet?"

"I det här fallet kommer algoritmen att returnera ett negativt index .

Dokumentation

"Allt är klart, Rishi! Det här var väldigt intressant."

"Om du verkligen tyckte att det här var mycket intressant, läs på din fritid igenom den officiella dokumentationen för klassen Arraysoch dess metoder på Oracles webbplats .

"Du kan titta närmare på till exempel metoderna Arrays.mismatch()och Arrays.compare(). Du kommer med största sannolikhet att kunna använda dem bra.

"Och bli inte förvirrad av antalet metoder. Varje metod har 5-10 varianter, som endast skiljer sig åt i sina parametertyper."