Arrays in Java: A Reference Guide

1. Introduksjon

I denne opplæringen vil vi dykke inn i et kjernekonsept på Java-språket - arrays.

Vi ser først hva som er en matrise, og deretter hvordan vi bruker dem. samlet vil vi dekke hvordan:

  • Kom i gang med matriser
  • Les og skriv matriseelementer
  • Sløyfe over en matrise
  • Forvandle matriser til andre gjenstander som Liste eller Strømmer
  • Sorter, søk og kombiner matriser

2. Hva er en matrise?

Først og fremst må vi definere hva som er en matrise? I følge Java-dokumentasjonen er en matrise et objekt som inneholder et fast antall verdier av samme type. Elementene i en matrise er indeksert, noe som betyr at vi kan få tilgang til dem med tall (kalt indekser).

Vi kan betrakte en matrise som en nummerert liste over celler, hver celle er en variabel som inneholder en verdi. I Java starter nummereringen på 0.

Det er primitive typearriser og objekttypearriser. Dette betyr at vi kan bruke matriser av int, float, boolean, ... Men også arrays av Streng, objekt og tilpassede typer også.

3. Sette opp en serie

Nå som matriser er veldefinerte, la oss dykke ned i bruken av dem.

Vi vil dekke mange emner som lærer oss hvordan vi bruker matriser. Vi lærer noen grunnleggende ting, slik som å erklære og initialisere en matrise, men vi vil også dekke mer avanserte emner som å sortere og søke i matriser.

La oss gå først med erklæring og initialisering.

3.1. Erklæring

Vi begynner med erklæringen. Det er to måter å erklære en matrise i Java:

int [] anArray;

eller:

int an OtherArray [];

Førstnevnte er mer brukt enn sistnevnte.

3.2. Initialisering

Nå som det er på tide å se hvordan du kan initialisere matriser. Igjen er det flere måter å initialisere en matrise på. Vi ser de viktigste her, men denne artikkelen dekker arraysinitialisering i detalj.

La oss begynne med en enkel måte:

int [] anArray = ny int [10];

Ved å bruke denne metoden initialiserte vi en matrise på ti int elementer. Merk at vi må spesifisere størrelsen på matrisen.

Når du bruker denne metoden, vi initialiserer hvert element til standardverdien, her 0. Når du initialiserer en rekke Gjenstand, elementene er null som standard.

Vi ser nå en annen måte som gir oss muligheten til å sette verdier til matrisen direkte når du oppretter den:

int [] anArray = new int [] {1, 2, 3, 4, 5};

Her initialiserte vi en femelementmatrise som inneholder tallene 1 til 5. Når vi bruker denne metoden, trenger vi ikke å spesifisere lengden på matrisen, det er antall elementer som deretter blir deklarert mellom parentesene.

4. Få tilgang til elementer

La oss nå se hvordan du får tilgang til elementene i en matrise. Vi kan oppnå dette ved å kreve en array celleposisjon.

For eksempel vil denne lille kodebiten skrive ut 10 til konsollen:

anArray [0] = 10; System.out.println (anArray [0]);

Legg merke til hvordan vi bruker indekser for å få tilgang til arraycellene. Tallet mellom parentesene er den spesifikke posisjonen til matrisen vi vil ha tilgang til.

Når tilgang til en celle, hvis den passerte indeksen er negativ eller går utover den siste cellen, vil Java kaste en ArrayIndexOutOfBoundException.

Vi bør være forsiktige da ikke å bruke en negativ indeks, eller en indeks som er større enn eller lik matrisestørrelsen.

5. Iterere over en matrise

Å få tilgang til elementer en etter en kan være nyttig, men det kan være lurt å itere gjennom en matrise. La oss se hvordan vi kan oppnå dette.

Den første måten er å bruke til Løkke:

int [] anArray = new int [] {1, 2, 3, 4, 5}; for (int i = 0; i <anArray.length; i ++) {System.out.println (anArray [i]); }

Dette skal skrive ut nummer 1 til 5 på konsollen. Som vi ser brukte vi lengde eiendom. Dette er en offentlig eiendom som gir oss størrelsen på matrisen.

Selvfølgelig er det mulig å bruke andre sløyfemekanismer som samtidig som eller gjør mens. Men, som for Java-samlinger, er det mulig å løpe over matriser ved hjelp av for hver Løkke:

int [] anArray = new int [] {1, 2, 3, 4, 5}; for (int element: anArray) {System.out.println (element); }

Dette eksemplet tilsvarer det forrige, men vi ble kvitt indeksene kjeleplatekoden. De for hver loop er et alternativ når:

  • vi trenger ikke å endre matrisen (å sette en annen verdi i et element vil ikke endre elementet i matrisen)
  • vi trenger ikke indeksene for å gjøre noe annet

6. Varargs

Vi har allerede dekket det grunnleggende når det gjelder opprettelse og manipulering av matriser. Nå vil vi dykke inn i mer avanserte emner, fra og med varargs. Som en påminnelse, varargs brukes til å overføre et vilkårlig antall argumenter til en metode:

ugyldig varargsMethod (streng ... varargs) {}

Denne metoden kan ta fra 0 til et vilkårlig antall String argumenter. En artikkel som dekker varargs finner du her.

Det vi må vite her er at inne i metodekroppen, a varargs parameter blir til en matrise. Men, vi kan også sende en matrise direkte som argumentet. La oss se hvordan ved å gjenbruke eksempelmetoden som er beskrevet ovenfor:

String [] anArray = new String [] {"Melk", "Tomat", "Chips"}; varargsMethod (anArray);

Vil oppføre seg på samme måte som:

varargsMethod ("Melk", "Tomat", "Chips");

7. Transformere en matrise til en liste

Arrangementer er gode, men noen ganger kan det være lettere å håndtere Liste i stedet. Vi får se her hvordan du kan forvandle en matrise til en Liste.

Vi gjør det først på den naive måten ved å lage en tom liste og gjenta over matrisen for å legge elementene til listen:

int [] anArray = new int [] {1, 2, 3, 4, 5}; Liste aList = ny ArrayList (); for (int element: anArray) {aList.add (element); }

Men det er en annen måte, litt mer kortfattet:

Heltall [] anArray = nytt Heltall [] {1, 2, 3, 4, 5}; Liste aList = Arrays.asList (anArray);

Den statiske metoden Arrays.asList tar en varargs argument og oppretter en liste med passerte verdier. Dessverre har denne metoden noen ulemper:

  • Det er ikke mulig å bruke en rekke primitive typer
  • Vi kan ikke legge til eller fjerne elementer fra den opprettede listen, da det vil kaste et Ikke-støttetOperationException

8. Fra en matrise til en strøm

Vi kan nå forvandle matriser til lister, men siden Java 8 har vi tilgang til Stream API og vi vil kanskje gjøre våre matriser om til Strøm. Java gir oss Arrays.stream metode for det:

String [] anArray = new String [] {"Melk", "Tomat", "Chips"}; Stream aStream = Arrays.stream (anArray);

Når du passerer en Gjenstand array til metoden den vil returnere a Strøm av den matchende typen (f.eks. Strøm for en rekke Heltall). Når du passerer en primitiv, vil den returnere den tilsvarende primitive Strøm.

Det er også mulig å opprette strømmen bare på en delmengde av matrisen:

Stream anotherStream = Arrays.stream (anArray, 1, 3);

Dette vil skape en Strøm med bare "Tomat" og "Chips" Strenger (den første indeksen inkluderer, mens den andre er eksklusiv).

9. Sorteringsarrayer

La oss nå se hvordan vi kan sortere en matrise, som omorganiserer elementene i en bestemt rekkefølge. De Arrays klassen gir oss sortere metode. Litt som strøm metode, sortere har mye overbelastning.

Det er overbelastning å sortere:

  • Primitive type matriser: som er sortert i stigende rekkefølge
  • Gjenstand arrays (de Gjenstand må implementere Sammenlignelig grensesnitt): som er sortert i henhold til den naturlige rekkefølgen (avhengig av sammenligne med metode fra Sammenlignbar)
  • Generiske matriser: som er sortert etter et gitt Komparator

I tillegg er det mulig å sortere bare en bestemt del av en matrise (sende start- og sluttindekser til metoden).

Algoritmene bak sortere metoden er rask sortering og slå sammen for henholdsvis primitive og andre matriser.

La oss se hvordan dette fungerer gjennom noen eksempler:

int [] anArray = new int [] {5, 2, 1, 4, 8}; Arrays.sort (anArray); // anArray er nå {1, 2, 4, 5, 8} Integer [] anotherArray = new Integer [] {5, 2, 1, 4, 8}; Arrays.sort (anotherArray); // anotherArray er nå {1, 2, 4, 5, 8} String [] yetAnotherArray = new String [] {"A", "E", "Z", "B", "C"}; Arrays.sort (yetAnotherArray, 1, 3, Comparator.comparing (String :: toString) .reversed ()); // yetAnotherArray er nå {"A", "Z", "E", "B", "C"}

10. Søke i en matrise

Å søke i en matrise er ganske enkel, vi kan løpe over matrisen og søke i elementet vårt blant matriseelementene:

int [] anArray = new int [] {5, 2, 1, 4, 8}; for (int i = 0; i <anArray.length; i ++) {if (anArray [i] == 4) {System.out.println ("Funnet ved indeks" + i); gå i stykker; }}

Her søkte vi etter nummer 4 og fant det i indeks 3.

Hvis vi har et sortert utvalg, kan vi bruke en annen løsning: binært søk. Prinsippet om binært søk er forklart i denne artikkelen.

Heldigvis gir Java oss Arrays.binarySearch metode. Vi må gi den en matrise og et element å søke.

I tilfelle et generisk utvalg, må vi også gi det Komparator som ble brukt til å sortere matrisen i utgangspunktet. Det er igjen muligheten til å kalle metoden på en delmengde av matrisen.

La oss se et eksempel på bruk av binær søkemetode:

int [] anArray = new int [] {1, 2, 3, 4, 5}; int index = Arrays.binarySearch (anArray, 4); System.out.println ("Funnet ved indeks" + indeks);

Da vi lagret nummer 4 i den fjerde cellen, vil dette returnere indeks 3 som resultat. Merk at vi brukte en allerede sortert matrise.

11. Sammenkoble arrays

Til slutt, la oss se hvordan du sammenføyer to matriser. Ideen er å lage en matrise som er summen av de to matriser som skal sammenkobles. Etter det må vi legg til elementene i den første og deretter elementene i den andre:

int [] anArray = new int [] {5, 2, 1, 4, 8}; int [] anotherArray = new int [] {10, 4, 9, 11, 2}; int [] resultArray = new int [anArray.length + anotherArray.length]; for (int i = 0; i <resultArray.length; i ++) {resultArray [i] = (i <anArray.length? anArray [i]: anotherArray [i - anArray.length]); }

Som vi kan se, når indeksen fortsatt er mindre enn den første matriselengden, legger vi til elementer fra den matrisen. Deretter legger vi til elementer fra den andre. Vi kan benytte oss av Arrays.setAll metode for å unngå å skrive en løkke:

int [] anArray = new int [] {5, 2, 1, 4, 8}; int [] anotherArray = new int [] {10, 4, 9, 11, 2}; int [] resultArray = new int [anArray.length + anotherArray.length]; Arrays.setAll (resultArray, i -> (i <anArray.length? AnArray [i]: anotherArray [i - anArray.length]));

Denne metoden vil sette alle matriseelementene i henhold til den gitte funksjonen. Denne funksjonen knytter en indeks til et resultat.

Her er et tredje alternativ for å slå sammen til matriser: System.arraycopy. Denne metoden tar en kilde array, en kildeposisjon, en destinasjon array, en destinasjonsposisjon og en int definere antall elementer som skal kopieres:

System.arraycopy (anArray, 0, resultArray, 0, anArray.length); System.arraycopy (anotherArray, 0, resultArray, anArray.length, anotherArray.length);

Som vi kan se, kopierer vi den første matrisen, deretter den andre (etter det siste elementet i den første).

12. Konklusjon

I denne detaljerte artikkelen har vi dekket grunnleggende og noen avanserte bruksområder for matriser i Java.

Vi så at Java tilbyr mange metoder for å håndtere matriser gjennom Arrays bruksklasse. Det er også verktøyklasser for å manipulere matriser i biblioteker som Apache Commons eller Guava.

Den fulle koden for denne artikkelen finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found