"Rishi, jeg ser virkelig frem til å lære om resten av metodene i Arrays-klassen.
"En slik iver for læring kan ikke annet enn å glede din gamle lærer! Men hvis du virkelig ønsker å finne ut alt, vil en snill trollmann ved navn Google hjelpe deg dag og natt."
"Øh..."
"Bare tuller. På en måte. Selvfølgelig skal jeg forklare alt bedre, men hvis noe dukker opp - husk den gode veiviseren. Jeg starter dagens leksjon med Arrays.fill
metoden
"Når du arbeider med arrays, trenger Java-programmerere veldig ofte å fylle arrayet med samme verdi. Du kan selvfølgelig skrive en løkke og ganske enkelt tilordne en verdi til hver celle i arrayen 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 kalle Arrays.fill()
metoden, som gjør akkurat det samme: den fyller den beståtte matrisen med den beståtte verdien. Slik ser den ut:
Arrays.fill(name, value)
Og koden i eksemplet ovenfor kan gjøres litt mer kompakt og tydeligere:
int[] x = new int[100];
Arrays.fill(x, 999);
"Vakker!"
"Du kan også bruke Arrays.fill()
metoden til å fylle ikke hele matrisen, men en del av den, med en viss verdi:
Arrays.fill(name, first, last, value)
"Hvor første og siste er indeksene til den første og siste cellen som skal fylles.
" I samsvar med Javas gode (eller dårlige) gamle tradisjon, husk at det siste elementet ikke er inkludert i utvalget.
Eksempel:
|
Vi fyller cellene x[3] , x[4] , x[5] og x[6] med verdien 999 . Celler i en matrise er nummerert fra null! Variabelen str inneholder verdien"[1, 2, 3, 999, 999, 999, 999, 8, 9, 10]" |
" Arrays.fill()
Metoden fungerer kun med endimensjonale arrays. Hvis du sender en todimensjonal array til metoden, vil den bli behandlet som endimensjonal, med alle følgene av det.
Arrays.copyOf()
"Amigo, vennligst fortell meg hvordan jeg endrer størrelsen på en matrise etter at den er opprettet?"
"Umm... Det er et lurespørsmål, ikke sant? Jeg er ikke så uerfaren lenger. Det riktige svaret er at du ikke kan! Du kan ikke endre størrelsen på en matrise etter at den er opprettet."
"Men hva om du virkelig vil?"
"Det er fortsatt umulig!
"Faktisk, hvis du virkelig vil, så kan du! Ved hjelp av et programmeringstriks:
- Først oppretter du en ny matrise med ønsket lengde
- Deretter kopierer du alle elementene fra den første matrisen inn i den.
"Dette er de to tingene som metoden Arrays.copyOf()
gjør. Slik ser kallet det ut:
Type[] name2 = Arrays.copyOf(name, length);
"Denne metoden endrer ikke den eksisterende matrisen , men oppretter i stedet en ny matrise og kopierer elementene i den gamle matrisen inn i den."
"Hva om lengden på den nye matrisen er mindre enn lengden på den eksisterende ?
"Godt spørsmål, Amigo! Hvis elementene ikke passer, så ignoreres de ekstra verdiene ganske enkelt."
"Og hvis det tvert imot er ekstra celler, hva er startverdiene deres?
"Hvis lengden på den nye matrisen er større enn lengden på den gamle, fylles cellene med nuller.
Eksempel:
|
Variabelen str2 inneholder verdien Variabelen inneholder verdien"[1, 2, 3, 4, 5]" str3 "[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0, 0, 0, 0, 0]" |
Arrays.copyOfRange()
"Og hva om du ønsker å få en matrise med lengde 5 fra en matrise med lengde 10, men du trenger at den inneholder de siste 5 elementene i stedet for de første 5? I dette tilfellet trenger du en annen metode for klassen. Det Arrays
er Arrays.copyOfRange()
. Slik ser den ut:
Type[] name2 = Arrays.copyOfRange(name, first, last);
"Denne metoden lager også en ny array, men fyller den med elementer fra et vilkårlig sted i den opprinnelige arrayen. Der første og siste er indeksene til de første og siste elementene som skal settes inn i den nye arrayen. Kan du fortelle meg om er det siste elementet inkludert i dette området?"
"Ha! Som min gode lærer pleide å si, ' i samsvar med Javas gode (eller dårlige) gamle tradisjon, husk at det siste elementet ikke er inkludert i serien '."
«Amigo, du vokser rett foran øynene våre.
Eksempel:
|
Variabelen str2 inneholder verdien Variabelen inneholder verdien"[16, 17, 18, 19, 20]" str3 "[16, 17, 18, 19, 20, 0, 0, 0, 0, 0]" |
Arrays.sort()
"Og til slutt la jeg den mest ... mmm ... hyggelig metode til sist: sortering . Matriser sorteres ganske ofte i programmering. Her er de 3 mest populære handlingene når du arbeider med matriser:
- Sortering av en matrise
- Finne minimum (eller maksimum) element i en matrise
- Bestemme indeksen til et element i en matrise (finne et element i en matrise)
"Velpresterende sorteringsalgoritmer, må jeg si, er ikke så enkle å skrive. Mer presist er dette en standardoppgave, og som student vil det ikke skade deg å øve på å skrive sorteringsalgoritmer noen ganger. Men på jobben er det bedre å ikke kaste bort tiden din på å finne opp hjulet på nytt. Javas skapere inkluderte metoden sort()
i Arrays
klassen. Slik ser den ut:
Arrays.sort(name);
Denne metoden sorterer den beståtte matrisen i stigende rekkefølge.
Eksempel:
|
Variabelen str inneholder verdien"[-20, -20, -20, -2, 0, 3, 8, 11, 99, 999]" |
"Utmerket! Jeg kalte bare én metode og matrisen er sortert. En ting av skjønnhet!"
"Forresten, du kan sortere ikke bare hele arrayet, men også bare deler av det. Slik ser kallet det ut:
Arrays.sort(name, first, last);
"Hvor første og siste er indeksene til den første og siste cellen som sorteringen skal berøre. OG...
"Jeg vet allerede hva du kommer til å si! 'I samsvar med Javas gode (eller dårlige) gamle tradisjon, husk at det siste elementet ikke er inkludert i utvalget' .
Eksempel:
|
Variabelen str inneholder verdien"[11, -2, 3, 0, -20, -20, 8, 999, 99, -20]" |
"For å sortere matriser bruker Java den raskeste sorteringsalgoritmen — QuickSort . Dens beregningsmessige kompleksitet avhenger av størrelsen på matrisen og beregnes ved hjelp av formelen N log(N).
"Sortering av en matrise på 1000 elementer vil innebære ca. 10 000 sammenligninger av matriseelementer. Sortering av en matrise på en million elementer vil innebære ca. 20 millioner sammenligninger."
" Ikke for mange sammenligninger når du vurderer antall elementer!"
"Det er akkurat det jeg sier. QuickSort- algoritmen er veldig effektiv.
Arrays.binarySearch()
"Vel, og den siste av de mest interessante metodene i klassen Arrays
er i stand til å søke etter en gitt verdi i en matrise. Dette er ikke noe vanlig søk - det er det elskede binære søket . Det koker ned til dette:
- Først blir matrisen sortert.
- Deretter sammenlignes det midterste elementet i arrayet med det vi ser etter.
- Hvis elementet er større enn det midterste elementet, fortsetter søket i høyre halvdel av matrisen.
- Hvis elementet vi ser etter er mindre enn det midterste elementet, fortsetter søket i venstre halvdel av matrisen.
"Fordi matrisen er sortert, er det mulig å eliminere halvparten av den i en enkelt sammenligning. Så i neste trinn, kaster vi ut en annen halvpart, og så videre."
"Fantastisk! Vi beveger oss rett til mål veldig raskt!"
"Akkurat. I en array på én million (!) elementer kan den binære søkealgoritmen finne indeksen til ønsket element i bare 20 sammenligninger. Algoritmens mangel er at arrayen først må sorteres, og sortering tar også tid.
Slik ser kallet ut:
int index = Arrays.binarySearch(name, value);
"Hvor name
er navnet på matrisen, som må sendes allerede sortert (for eksempel ved hjelp av metoden Arrays.sort()
). Og value
er elementet vi søker etter i matrisen. Resultatet som returneres av metoden er indeksen til ønsket matriseelement .
Eksempler:
|
x er {-20, -20, -20, -2, 0, 3, 8, 11, 99, 999} 4 1 (indekser 0 og 2 er også akseptable)8 -7 |
"Hva om det ønskede elementet vises flere ganger i matrisen ?"
"Det er et gyldig spørsmål, Amigo. I dette tilfellet vil algoritmen returnere indeksen til en av dem (det er ingen garanti for at det for eksempel vil være den aller første, eller omvendt - den aller siste av disse dupliserte elementene) ."
"Hva om matrisen ikke inneholder det ønskede elementet i det hele tatt?"
"I dette tilfellet vil algoritmen returnere en negativ indeks .
Dokumentasjon
"Alt er klart, Rishi! Dette var veldig interessant."
"Hvis du virkelig fant dette veldig interessant, så skumle gjennom den offisielle dokumentasjonen av klassen Arrays
og metodene på Oracle-nettstedet når det passer deg .
"Du kan se nærmere på for eksempel metodene Arrays.mismatch()
og Arrays.compare()
. Du vil mest sannsynlig kunne bruke dem godt.
"Og ikke bli forvirret av antall metoder. Hver metode har 5-10 varianter, som bare er forskjellige i parametertypene."
GO TO FULL VERSION