Arrays in Java: A Reference Guide

1. Úvod

V tomto výučbe sa hlboko ponoríme do základnej koncepcie v jazyku Java - polí.

Najprv uvidíme, čo je to pole, potom ako ich používať; celkovo sa dozvieme, ako:

  • Začnite s poľami
  • Čítanie a zápis prvkov poľa
  • Slučka cez pole
  • Transformujte polia na iné objekty, napríklad Zoznam alebo Prúdy
  • Triedenie, hľadanie a kombinovanie polí

2. Čo je to pole?

Najskôr je potrebné definovať, čo je pole? Podľa dokumentácie Java je to pole objekt obsahujúci pevný počet hodnôt rovnakého typu. Prvky poľa sú indexované, čo znamená, že k nim môžeme pristupovať pomocou čísel (tzv indexy).

Pole môžeme považovať za očíslovaný zoznam buniek, pričom každá bunka je premenná obsahujúca hodnotu. V Jave sa číslovanie začína na 0.

Existujú polia typu primitívneho typu a polia typu objektu. To znamená, že môžeme použiť pole int, float, boolean,… Ale aj pole Reťazec, Objekt a vlastné typy tiež.

3. Nastavenie poľa

Teraz, keď sú polia presne definované, ponorme sa do ich použitia.

Preberieme veľa tém, ktoré nás naučia používať polia. Naučíme sa základné veci, ako je napríklad deklarácia a inicializácia poľa, ale budeme sa venovať aj pokročilejším predmetom, ako je triedenie a hľadanie polí.

Poďme najskôr na vyhlásenie a inicializáciu.

3.1. Vyhlásenie

Začneme vyhlásením. Existujú dva spôsoby, ako deklarovať pole v Jave:

int [] anArray;

alebo:

int anOtherArray [];

Prvý z nich je viac používaný ako druhý.

3.2. Inicializácia

Teraz, keď je čas zistiť, ako inicializovať polia. Existuje opäť niekoľko spôsobov, ako inicializovať pole. Tu uvidíme tie hlavné, ale tento článok podrobne popisuje inicializáciu polí.

Začnime jednoduchým spôsobom:

int [] anArray = nový int [10];

Použitím tejto metódy sme inicializovali pole desiatich int prvkov. Upozorňujeme, že musíme určiť veľkosť poľa.

Pri použití tejto metódy inicializujeme každý prvok na jeho predvolenú hodnotu, tu 0. Pri inicializácii poľa Objekt, prvky sú nulový predvolene.

Teraz uvidíme ďalší spôsob, ktorý nám dáva možnosť nastaviť hodnoty do poľa priamo pri jeho vytváraní:

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

Tu sme inicializovali päťprvkové pole obsahujúce čísla 1 až 5. Pri použití tejto metódy nemusíme určovať dĺžku poľa, jedná sa o počet prvkov deklarovaných medzi zloženými zátvorkami.

4. Prístup k prvkom

Pozrime sa teraz, ako pristupovať k prvkom poľa. To môžeme dosiahnuť požadovaním polohy bunky poľa.

Napríklad tento malý útržok kódu vytlačí na konzolu 10:

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

Všimnite si, ako používame indexy na prístup k bunkám poľa. Číslo v zátvorkách je konkrétna poloha poľa, ku ktorému chceme získať prístup.

Ak je pri prístupe k bunke záporný index alebo ide za poslednú bunku, Java hodí znak ArrayIndexOutOfBoundException.

Mali by sme byť potom opatrní nepoužívať záporný index alebo index väčší alebo rovný veľkosti poľa.

5. Iterácia nad poľom

Prístup k prvkom po jednom môže byť užitočný, ale možno by sme chceli iterovať cez pole. Pozrime sa, ako to môžeme dosiahnuť.

Prvý spôsob je použiť pre slučka:

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

To by malo na konzolu vytlačiť čísla 1 až 5. Ako vidíme, využili sme dĺžka nehnuteľnosť. Toto je verejné vlastníctvo, ktoré nám dáva veľkosť poľa.

Samozrejme je možné použiť aj ďalšie mechanizmy slučiek ako napr zatiaľ čo alebo robiť kým. Pokiaľ však ide o zbierky Java, je možné prepájať polia pomocou súboru pre každý slučka:

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

Tento príklad je ekvivalentný predchádzajúcemu, ale zbavili sme sa indexu štandardného kódu. The pre každý slučka je voľba, keď:

  • pole nemusíme upravovať (vloženie inej hodnoty do prvku nezmení prvok v poli)
  • nepotrebujeme indexy, aby sme mohli robiť niečo iné

6. Varargy

Základné informácie o vytváraní a manipulácii s poľami sme už prebrali. Teraz sa začneme venovať pokročilejším témam varargs. Ako pripomienka, varargs sa používajú na odovzdanie ľubovoľného počtu argumentov metóde:

void varargsMethod (String ... varargs) {}

Táto metóda môže trvať od 0 do ľubovoľného počtu String argumenty. Článok pokrývajúci varargs nájdete tu.

Tu musíme vedieť, že vo vnútri tela metódy, a varargs parameter sa zmení na pole. Ale, môžeme tiež odovzdať pole priamo ako argument. Pozrime sa, ako na to, že použijeme vyššie uvedenú príkladovú metódu:

String [] anArray = new String [] {"Milk", "Tomato", "Chips"}; varargsMethod (anArray);

Bude sa správať rovnako ako:

varargsMethod ("Mlieko", "Paradajka", "Čipsy");

7. Transformácia poľa na zoznam

Pole sú skvelé, ale niekedy môže byť šikovnejšie sa s nimi vyrovnať Zoznam namiesto toho. Uvidíme tu, ako transformovať pole na a Zoznam.

Najprv to urobíme naivným spôsobom, vytvorením prázdneho zoznamu a iteráciou poľa, aby sme do zoznamu pridali jeho prvky:

int [] anArray = new int [] {1, 2, 3, 4, 5}; Zoznam aList = nový ArrayList (); pre (int element: anArray) {aList.add (element); }

Existuje však aj iný spôsob, trochu stručnejší:

Celé číslo [] anArray = nové celé číslo [] {1, 2, 3, 4, 5}; Zoznam aList = Arrays.asList (anArray);

Statická metóda Arrays.asList berie a varargs argument a vytvorí zoznam s odovzdanými hodnotami. Táto metóda má, bohužiaľ, niekoľko nevýhod:

  • Nie je možné použiť pole primitívnych typov
  • Nemôžeme pridávať ani odstraňovať prvky z vytvoreného zoznamu, pretože to vyvolá znak UnsupportedOperationException

8. Z poľa do prúdu

Teraz môžeme transformovať polia na zoznamy, ale od Java 8 máme prístup k Stream API a možno budeme chcieť premeniť naše polia na Prúd. Java nám poskytuje Polia.prúd metóda na to:

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

Pri prejazde an Objekt pole na metódu vráti a Prúd typu zhody (napr. Prúd pre pole Celé číslo). Pri prechode primitívom vráti zodpovedajúci primitív Prúd.

Je tiež možné vytvoriť stream iba na podmnožinu poľa:

Streamovať iný stream = Arrays.stream (anArray, 1, 3);

Týmto sa vytvorí Prúd iba s „Tomato“ a „Chips“ Struny (prvý index je inkluzívny, zatiaľ čo druhý je exkluzívny).

9. Triedenie polí

Pozrime sa teraz, ako zoradiť pole, ktoré mení usporiadanie jeho prvkov v určitom poradí. The Polia trieda nám poskytuje triediť metóda. Trochu ako Prúd metóda, triediť má veľa preťaženia.

Existuje triedenie preťaženia:

  • Polia primitívneho typu: ktoré sú zoradené vzostupne
  • Objekt polia (tie Objekt musí implementovať Porovnateľné rozhranie): ktoré sú zoradené podľa prirodzeného poriadku (opierajúc sa o porovnať s metóda z Porovnateľné)
  • Generické polia: ktoré sú zoradené podľa daného počtu Komparátor

Okrem toho je možné triediť iba konkrétnu časť poľa (odovzdávanie počiatočných a koncových indexov metóde).

Algoritmy za triediť metóda sú rýchle triedenie a zlúčiť druh pre primitívne a iné polia.

Pozrime sa, ako to celé funguje na niekoľkých príkladoch:

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

10. Hľadanie v poli

Vyhľadávanie v poli je dosť jednoduché, môžeme sa prehnať cez pole a prehľadať náš element medzi prvkami poľa:

int [] anArray = new int [] {5, 2, 1, 4, 8}; for (int i = 0; i <anArray.length; i ++) {if (anArray [i] == 4) {System.out.println ("Nájdené v indexe" + i); prestávka; }}

Tu sme hľadali číslo 4 a našli sme ho v indexe 3.

Ak však máme zoradené pole, môžeme použiť iné riešenie: binárne vyhľadávanie. Princíp binárneho vyhľadávania je vysvetlený v tomto článku.

Našťastie nám Java poskytuje: Arrays.binarySearch metóda. Musíme mu dať pole a prvok na vyhľadávanie.

V prípade generického poľa musíme dať aj znak Komparátor ktorý sa použil na prvé zoradenie poľa. Opäť existuje možnosť zavolať metódu na podmnožinu poľa.

Pozrime sa na príklad použitia metódy binárneho vyhľadávania:

int [] anArray = new int [] {1, 2, 3, 4, 5}; int index = Arrays.binarySearch (anArray, 4); System.out.println ("Nájdené v indexe" + index);

Keď sme uložili číslo 4 do štvrtej bunky, vráti sa ako výsledok index 3. Všimnite si, že sme použili už zoradené pole.

11. Zreťazovacie polia

Na záver sa pozrime, ako zreťaziť dve polia. Cieľom je vytvoriť pole, ktorého dĺžka je súčtom dvoch polí, ktoré sa majú zreťaziť. Potom musíme pridajte prvky prvého a potom prvky druhého:

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

Ako vidíme, keď je index stále menší ako dĺžka prvého poľa, pridávame prvky z tohto poľa. Potom pridáme prvky z druhého. Môžeme využiť Arrays.setAll spôsob, ako sa vyhnúť písaniu slučky:

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

Táto metóda nastaví všetky prvky poľa podľa danej funkcie. Táto funkcia priraďuje index k výsledku.

Tu je tretia možnosť zlúčenia do polí: System.arraycopy. Táto metóda má zdroj pole, pozícia zdroja, cieľ pole, cieľová poloha a int definovanie počtu prvkov na kopírovanie:

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

Ako vidíme, skopírujeme prvé pole, potom druhé (po poslednom prvku prvého).

12. Záver

V tomto podrobnom článku sme sa venovali základnému a niektorým pokročilým použitiam polí v Jave.

Videli sme, že Java ponúka veľa metód na riešenie polí prostredníctvom Polia úžitková trieda. Existujú aj triedy nástrojov na manipuláciu s poľami v knižniciach, ako sú Apache Commons alebo Guava.

Celý kód tohto článku nájdete na našom GitHub.


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