Nizovi u Javi: Referentni vodič

1. Uvod

U ovom uputstvu duboko ćemo zaroniti u temeljni koncept Java jezika - nizove.

Prvo ćemo vidjeti što je niz, a zatim kako ih koristiti; sveukupno ćemo pokriti kako:

  • Započnite s nizovima
  • Čitanje i pisanje elemenata nizova
  • Petlja preko niza
  • Pretvorite nizove u druge objekte poput Popis ili Potoci
  • Poredajte, pretražite i kombinirajte nizove

2. Što je niz?

Prvo, prvo moramo definirati što je niz? Prema Java dokumentaciji, niz je objekt koji sadrži fiksni broj vrijednosti istog tipa. Elementi niza indeksiraju se, što znači da im možemo pristupiti brojevima (tzv indeksi).

Niz možemo smatrati numeriranim popisom stanica, a svaka ćelija predstavlja varijablu koja sadrži vrijednost. U Javi numeriranje započinje od 0.

Postoje nizovi primitivnog tipa i nizovi objekata. To znači da možemo koristiti nizove int, float, boolean, ... Ali i nizovi Niz, objekt i prilagođene vrste također.

3. Postavljanje niza

Sad kad su nizovi dobro definirani, zaronimo u njihovu upotrebu.

Obuhvatit ćemo puno tema koje nas uče kako koristiti nizove. Naučit ćemo neke osnove poput deklariranja i inicijalizacije niza, ali pokrivat ćemo i naprednije predmete poput sortiranja i pretraživanja nizova.

Krenimo prvo s deklaracijom i inicijalizacijom.

3.1. Izjava

Započet ćemo s izjavom. Postoje dva načina za deklariranje niza u Javi:

int [] anArray;

ili:

int anOtherArray [];

Prvi se više koristi od potonjeg.

3.2. Inicijalizacija

Sada je vrijeme da vidimo kako inicijalizirati nizove. Opet postoji više načina za inicijalizaciju niza. Ovdje ćemo vidjeti glavne, ali ovaj članak detaljno pokriva inicijalizaciju nizova.

Počnimo s jednostavnim načinom:

int [] anArray = novi int [10];

Korištenjem ove metode inicijalizirali smo niz od deset int elementi. Imajte na umu da moramo odrediti veličinu niza.

Kada koristite ovu metodu, inicijaliziramo svaki element na zadanu vrijednost, ovdje 0. Pri inicijalizaciji niza od Objekt, elementi su null prema zadanim postavkama.

Sada ćemo vidjeti još jedan način koji nam daje mogućnost postavljanja vrijednosti izravnom nizu prilikom stvaranja:

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

Ovdje smo inicijalizirali niz s pet elemenata koji sadrži brojeve od 1 do 5. Kada koristimo ovu metodu, ne trebamo navesti duljinu niza, to je broj elemenata koji se zatim deklariraju između zagrada.

4. Pristup elementima

Pogledajmo sada kako pristupiti elementima niza. To možemo postići zahtijevajući položaj ćelije niza.

Na primjer, ovaj mali isječak koda ispisat će 10 na konzolu:

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

Primijetite kako koristimo indekse za pristup ćelijama niza. Broj između zagrada specifičan je položaj niza kojem želimo pristupiti.

Pri pristupu ćeliji, ako je proslijeđeni indeks negativan ili nadilazi zadnju ćeliju, Java će baciti znak ArrayIndexOutOfBoundException.

Tada bismo trebali biti oprezni da se ne koristi negativni indeks ili indeks veći ili jednak veličini polja.

5. Iteriranje preko niza

Pristup elementima jedan po jedan može biti koristan, ali možda ćemo htjeti ponoviti niz. Pogledajmo kako to možemo postići.

Prvi način je korištenje za petlja:

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

To bi trebalo ispisati brojeve od 1 do 5 na konzolu. Kao što vidimo koristili smo duljina imovine. Ovo je javno vlasništvo koje nam daje veličinu niza.

Naravno, moguće je koristiti i druge mehanizme petlje poput dok ili učiniti dok. Što se tiče Java kolekcija, moguće je prevrtati nizove pomoću za svakoga petlja:

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

Ovaj je primjer ekvivalentan prethodnom, ali riješili smo se indeksnog koda. The za svakoga petlja je opcija kada:

  • ne trebamo mijenjati niz (stavljanjem druge vrijednosti u element neće se izmijeniti element u polju)
  • ne trebaju nam indeksi da bismo radili nešto drugo

6. Varargovi

Već smo obradili osnove kada je u pitanju stvaranje i manipulacija nizovima. Sada ćemo, za početak, zaroniti u naprednije teme varargi. Kao podsjetnik, varargi koriste se za prosljeđivanje proizvoljnog broja argumenata metodi:

void varargsMethod (niz ... varargs) {}

Ova metoda može trajati od 0 do proizvoljnog broja Niz argumenti. Članak koji pokriva varargi možete pronaći ovdje.

Ovdje moramo znati da se unutar tijela metode, a varargi parametar pretvara u niz. Ali, također možemo kao argument proslijediti niz izravno. Pogledajmo kako ponovnom uporabom gore navedene metode:

String [] anArray = new String [] {"Mlijeko", "Rajčica", "Čips"}; varargsMethod (anArray);

Ponašat će se isto kao:

varargsMethod ("Mlijeko", "Rajčica", "Čips");

7. Pretvaranje niza u popis

Nizovi su izvrsni, ali ponekad može biti jednostavnije riješiti ih Popis umjesto toga. Ovdje ćemo vidjeti kako transformirati niz u Popis.

Prvo ćemo to učiniti naivno, stvaranjem praznog popisa i iteracijom preko niza da bismo dodali njegove elemente na popis:

int [] anArray = novo int [] {1, 2, 3, 4, 5}; Popis aList = novi ArrayList (); za (int element: anArray) {aList.add (element); }

Ali postoji i drugi način, malo sažetiji:

Cijeli broj [] anArray = novi cijeli broj [] {1, 2, 3, 4, 5}; Popis aList = Arrays.asList (anArray);

Statička metoda Nizovi.asList traje a varargi argument i kreira popis s proslijeđenim vrijednostima. Nažalost, ova metoda ima nekoliko nedostataka:

  • Nije moguće koristiti niz primitivnih tipova
  • Ne možemo dodavati ili uklanjati elemente sa stvorenog popisa jer će baciti znak UnsupportedOperationException

8. Iz niza u tok

Sada možemo transformirati nizove u popise, ali od Jave 8 imamo pristup Stream API i možda bismo htjeli pretvoriti svoje nizove u Stream. Java nam pruža Nizovi.tok metoda za to:

String [] anArray = new String [] {"Mlijeko", "Rajčica", "Čips"}; Stream aStream = Arrays.stream (anArray);

Prilikom prolaska pored Objekt polje metodi koja će vratiti a Stream odgovarajućeg tipa (npr. Stream za niz od Cijeli broj). Prilikom prolaska kroz primitiv vratit će se odgovarajući primitiv Stream.

Također je moguće stvoriti tok samo na podskupu niza:

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

Ovo će stvoriti Stream sa samo “Rajčicom” i “Čipsom” Žice (prvi indeks je uključiv, dok je drugi indeks ekskluzivan).

9. Sortiranje nizova

Pogledajmo sada kako sortirati niz koji preuređuje svoje elemente u određenom redoslijedu. The Nizovi razred nam pruža vrsta metoda. Pomalo nalik na potok metoda, vrsta ima puno preopterećenja.

Postoje preopterećenja za sortiranje:

  • Nizovi primitivnog tipa: koji se sortiraju u rastućem redoslijedu
  • Objekt nizovi (oni Objekt mora provesti Usporedive sučelje): koji su razvrstani prema prirodnom redoslijedu (oslanjajući se na usporediTo metoda iz Usporedivo)
  • Generički nizovi: koji su razvrstani prema danom Usporednik

Osim toga, moguće je razvrstati samo određeni dio niza (prosljeđivanje početnog i završnog indeksa metodi).

Algoritmi iza vrsta metoda su brzo sortiranje i spajanje sortirati za primitivne, odnosno ostale nizove.

Pogledajmo kako sve ovo funkcionira kroz neke primjere:

int [] anArray = novi int [] {5, 2, 1, 4, 8}; Nizovi.sort (anArray); // anArray je sada {1, 2, 4, 5, 8} Integer [] anotherArray = new Integer [] {5, 2, 1, 4, 8}; Arrays.sort (anotherArray); // anotherArray je sada {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 je sada {"A", "Z", "E", "B", "C"}

10. Traženje u nizu

Pretraživanje niza prilično je jednostavno, možemo se prebaciti preko niza i pretraživati ​​naš element među elementima niza:

int [] anArray = novi int [] {5, 2, 1, 4, 8}; za (int i = 0; i <anArray.length; i ++) {if (anArray [i] == 4) {System.out.println ("Pronađeno u indeksu" + i); pauza; }}

Ovdje smo tražili broj 4 i pronašli ga u indeksu 3.

Ako ipak imamo sortirani niz, možemo koristiti drugo rješenje: binarno pretraživanje. Načelo binarnog pretraživanja objašnjeno je u ovom članku.

Srećom, Java nam nudi Nizovi.binarySearch metoda. Moramo mu dati niz i element za pretraživanje.

U slučaju generičkog niza, također mu moramo dati znak Usporednik koja je uopće korištena za sortiranje niza. Opet postoji mogućnost pozivanja metode na podskup niza.

Pogledajmo primjer upotrebe binarne metode pretraživanja:

int [] anArray = novo int [] {1, 2, 3, 4, 5}; int indeks = Arrays.binarySearch (anArray, 4); System.out.println ("Pronađeno na indeksu" + indeks);

Kako smo pohranili broj 4 u četvrtu ćeliju, to će vratiti indeks 3 kao rezultat. Imajte na umu da smo koristili već sortirani niz.

11. Spajanje nizova

Napokon, pogledajmo kako spojiti dva niza. Ideja je stvoriti niz čija je duljina zbroj dva polja koja se spajaju. Nakon toga moramo dodajte elemente prvog, a zatim elemente drugog:

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

Kao što vidimo, kada je indeks još uvijek manji od duljine prvog polja, dodajemo elemente iz tog polja. Zatim dodajemo elemente iz drugog. Možemo se poslužiti Nizovi.setAll metoda za izbjegavanje pisanja petlje:

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

Ova će metoda postaviti sve elemente niza prema zadanoj funkciji. Ova funkcija indeks povezuje s rezultatom.

Evo treće mogućnosti spajanja u nizove: System.arraycopy. Ova metoda uzima izvor niz, izvorni položaj, odredište niz, odredište i an int definiranje broja elemenata za kopiranje:

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

Kao što vidimo, kopiramo prvi niz, zatim drugi (nakon posljednjeg elementa prvog).

12. Zaključak

U ovom detaljnom članku obradili smo osnovne i neke napredne načine upotrebe nizova u Javi.

Vidjeli smo da Java nudi puno metoda za rješavanje nizova putem Nizovi klasa korisnosti. Postoje i klase korisnih programa za manipulaciju nizovima u knjižnicama kao što su Apache Commons ili Guava.

Cjeloviti kôd za ovaj članak možete pronaći na našem GitHubu.