Jak vytvořit dvourozměrné pole v Javě. Java Array. Pole v Javě. Java pro začátečníky
Studium na "Game Developer" + zaměstnání
Pole Java
Pole je datová struktura, která ukládá hodnoty stejného typu. K jednotlivému prvku pole se přistupuje pomocí celočíselného indexu. Pokud je například a pole celých čísel, pak hodnota výrazu a [ i ] je rovna i-tému celému číslu v poli.
Pole je deklarováno následovně: nejprve je specifikován typ pole, tedy typ prvků obsažených v poli, následuje dvojice prázdných hranatých závorek a poté název proměnné. Například takto deklarujete pole celých čísel:
int a;
Tento příkaz však pouze deklaruje proměnnou a, neinicializuje ji skutečným polem. Chcete-li vytvořit pole, musíte použít operátor new.
Tento příkaz vytvoří pole 100 celých čísel. Prvky tohoto pole jsou číslovány od 0 do 99 (nikoli od 1 do 100). Po vytvoření lze pole naplnit např. pomocí smyčky.
int a = nový int;
for (int i = 0; i< 100; i++)
a[i] = i; // Vyplní pole čísly od 0 do 99.
Pokud se pokusíte získat přístup k prvku a (nebo k jakémukoli prvku, jehož index je mimo rozsah 0 až 99) vytvořením pole 100 prvků, program se přeruší, protože bude vyvolána výjimka indexu pole mimo rozsah.
Chcete-li spočítat počet prvků v poli, použijte metodu ArrayName.
va.délka.
Například,
for (int i = 0; i< a. length; i++ System.out.println (a[i]);
Jakmile je pole vytvořeno, není možné změnit jeho velikost (ačkoli můžete samozřejmě měnit jeho jednotlivé prvky). Pokud potřebujete během provádění programu často měnit velikost pole, je lepší použít jinou datovou strukturu zvanou seznam polí.
Pole lze deklarovat dvěma způsoby:
int a;
nebo
int a;
Většina programátorů Java preferuje první styl, protože jasněji odděluje typ pole int (pole celých čísel) od názvu proměnné.
Inicializátory polí a nepojmenovaná pole
Jazyk Java má schopnost vytvářet pole a současně je inicializovat. Zde je příklad takové syntaxe:
int smallPrimes = (2, 3, 5, 7, 11, 13);
Pamatujte, že v tomto případě nemusíte používat nový operátor. Kromě toho můžete dokonce inicializovat nepojmenované pole:
new int ( 16, 19, 23 , 29 , 31, 37)
Tento výraz alokuje paměť pro nové pole a vyplní je čísly ve složených závorkách. Zároveň se spočítá jejich počet a podle toho se určí velikost pole. Tato syntaxe je užitečná pro reinicializaci pole bez vytváření nové proměnné. Například výraz
smallPrimes = new int( 17, 19, 23, 29, 31, 37);
je zkratka pro výraz
int anonym = (17, 19, 23, 29, 31, 37);
smailPrimes = anonymní;
Můžete vytvořit pole nulové velikosti. Takové pole může být užitečné při psaní metody, která se vyhodnotí jako pole, které se ukáže jako prázdné. Pole nulové délky je deklarováno takto:
nový typ položky
Všimněte si, že takové pole není ekvivalentní objektu null.
Kopírování polí
Jedno pole lze zkopírovat do druhého, ale obě proměnné budou odkazovat na stejné pole.
int luckyNumbers = smailPrimes;
luckyNumbers = 12; // Prvek smailPrimes je nyní také 12.
Výsledek je znázorněn na Obr. 3.14. Pokud chcete zkopírovat všechny prvky jednoho pole do druhého, měli byste použít metodu arraycopy ze System. Jeho volání vypadá takto:
System.arraycopy(from, fromlndex, to, tolndex, count);
Pole to musí být dostatečně velké, aby obsahovalo všechny prvky, které se mají zkopírovat.
Rýže. 3.14. Kopírování pole
Například níže uvedené operátory, jejichž výsledky jsou na Obr. 3.15 vytvořte dvě pole a poté zkopírujte poslední čtyři prvky prvního pole do druhého. Kopírování začíná od druhé pozice ve zdrojovém poli a prvky, které se mají zkopírovat, jsou umístěny do cílového pole, počínaje třetí pozicí.
int smailPrimes = (2, 3, 5, 7, 11, 13);
int luckyNumbers = (1001, 1002, 1003, 1004, 1005, 1006, 1007);
System.aggauser(smailPrimes, 2, luckyNumbers, 3, 4);
for (int i = 0; i< luckyNumbers.length; i++)
System.println(i +.": " + luckyNumbersfi]);
Provedení těchto příkazů vede k následujícímu výsledku.
0: 1001
1: 1002
2: 1003
3: 5
4: 7
5: 11
6: 13
Rýže. 3.15. Kopírování prvků pole
Pole v Javě je velmi odlišné od pole v C++. Je to však prakticky stejné jako ukazatel na dynamické pole. To znamená, že operátor
int a = nový int; //Jáva
je ekvivalentní operátorovi
i n t * = nové i n t [ 1 0 0 ] ; // C++,
ale ne
int a; // C++
V jazyce Java výchozí žádný operátor nekontroluje rozsah indexů. Java také nemá aritmetiku ukazatele - nemůžete zvýšit ukazatel a, abyste se dostali na další prvek v poli.
- tutorial
Myslím, že málokdo, kdo se připravuje na svůj první pohovor, při ucházení se o první práci (pre)junior programátor, odpoví na tuto otázku negativně. Nebo alespoň pochybovat o odpovědi. Samozřejmě taková jednoduchá datová struktura s přímým přístupem k indexu – žádné triky! Ne, v některých jazycích, jako je JavaScript nebo PHP, jsou pole samozřejmě implementována velmi zajímavým způsobem a ve skutečnosti jsou mnohem víc než jen pole. Tady ale nejde o tohle, ale o „tradiční“ implementaci polí v podobě „pevného kusu paměti“. V tomto případě se na základě indexů a velikosti jednoho prvku jednoduše vypočítá adresa a přistoupí se k odpovídající hodnotě. co je tak těžké?
Pojďme na to přijít. Například v Javě. Požádání nic netušícího žadatele, aby vytvořil pole celých čísel n X n. Člověk sebevědomě napíše něco ve smyslu:
int g = nový int[n][n];
Skvělý. Nyní vás požádáme, abyste prvky pole něčím inicializovali. Ačkoli jednotky, i když součet indexů. Dostaneme:
for(int i = 0; i< n; i++) {
for(int j = 0; j < n; j++) {
g[i][j] = i + j;
}
}
Ještě častěji píšou
for(int i = 0; i< g.length; i++) {
for(int j = 0; j < g[i].length; j++) {
g[i][j] = i + j;
}
}
což je také příležitost k rozhovoru, ale teď mluvíme o něčem jiném. Snažíme se zjistit, co člověk ví, a uvidíme, jak přemýšlí. Proto ho upozorňujeme na skutečnost, že hodnoty jsou uspořádány symetricky a žádáme ho, aby ušetřil na iteracích smyček. Samozřejmě, proč procházet všechny hodnoty indexu, když můžete procházet pouze spodním trojúhelníkem? Subjekt obvykle snadno souhlasí a moudře zvýrazní hlavní úhlopříčku a pilně napíše něco ve smyslu:
for(int i = 0; i< n; i++) {
g[i][i] = 2* i;
for(int j = 0; j < i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
Místo g[i][i] = 2* i; často pište g[i][i] = i + i; nebo g[i][i] = i<< 1;
и это тоже повод поговорить. Но мы идем дальше и задаем ключевой вопрос: Jak rychleji program poběží?. Obvyklá úvaha je následující: téměř 2krát méně výpočtů indexu; téměř 2krát méně než výpočet hodnot (součet); stejný počet úkolů. To znamená, že je to o 30 procent rychlejší.Pokud má člověk za sebou dobrou matematickou školu, tak vidíte i přesný počet uložených operací a rozumnější posouzení efektivity optimalizace.
Nyní je čas na hlavní útok. Obě verze kódu spouštíme na nějaké dostatečně velké hodnotě n(řádově několik tisíc), například takto.
Kód s řízením času
třída A ( public static void main(String args) ( int n = 8000; int g = new int[n][n]; long st, en; // one st = System.nanoTime(); for(int i = 0 i< n; i++) {
for(int j = 0; j < n; j++) {
g[i][j] = i + j;
}
}
en = System.nanoTime();
System.out.println("\nOne time " + (en - st)/1000000.d + " msc");
// two
st = System.nanoTime();
for(int i = 0; i < n; i++) {
g[i][i] = i + i;
for(int j = 0; j < i; j++) {
g[j][i] = g[i][j] = i + j;
}
}
en = System.nanoTime();
System.out.println("\nTwo time " + (en - st)/1000000.d + " msc");
}
}
co vidíme? Optimalizovaná verze funguje 10-100krát pomaleji! Nyní je čas sledovat reakci uchazeče o pozici. Jaká bude reakce na neobvyklou (nebo spíše běžnou v praxi developera) stresovou situaci. Pokud se na tváři klienta objevilo vzrušení a začal mačkat tlačítka, dočasně zapomněl na vaši existenci, pak je to dobré znamení. Do určité míry. Nechcete najmout výzkumníka, kterému nezáleží na výsledku projektu, že? Pak se ho neptejte na otázku „Proč?“. Požádejte o přepracování druhé možnosti tak, aby skutečně fungovala rychleji než první.
Nyní můžete chvíli bezpečně podnikat. Za půl hodiny budete mít dostatek materiálu na zhodnocení hlavních osobních a profesních kvalit uchazeče.
Mimochodem, když jsem stručně popisoval tento problém na svém pracovním webu, nejoblíbenějším komentářem bylo "Toto je vaše křivka Java." Speciálně pro ně posílám kód do Great and Free. A šťastní majitelé Free Pascalu pro Windows se mohou dívat
pod spoilerem
čas programu; používá Windows; var start, finish, res: int64; n, i, j: celé číslo; g: Pole pole Integer; začátek:= 10000; SetLength(g, n, n); QueryPerformanceFrequency(res); QueryPerformanceCounter(start); pro i:=1 až n-1 do pro j:=1 až n-1 do g := i + j; QueryPerformanceCounter(dokončit); writeln("Čas po řádcích:", (dokončení - začátek) / res, "sec"); QueryPerformanceCounter(start); pro i:=1 až n-1 do pro j:=1 až n-1 do g := i + j; QueryPerformanceCounter(dokončit); writeln("Čas podle cols:", (dokončení - začátek) / res, "sec"); konec.
Ve výše uvedeném kódu v Pascalu jsem odstranil „matoucí“ momenty a nechal jsem pouze podstatu problému. Dá-li se to nazvat problémem.
Jaké otázky nakonec položíme obžalovanému?
1. Proč se to zpomalilo? A podrobněji...
2. Jak zrychlit inicializaci?
Pokud je potřeba ponořit se hlouběji do implementace Java, požádáme žadatele, aby dodržel dobu provádění pro malé hodnoty n. Například na ideone.com pro n=117 je „optimalizovaná“ verze dvakrát pomalejší. Ale pro další hodnotu n=118 se ukazuje, že je již 100 (sto)krát rychlejší než neoptimalizovaná! Navrhněte experimentování na místním počítači. Nechte ho hrát si s nastavením.
Mimochodem, chápete, co se děje?
Pár slov na odůvodnění
Rád bych řekl pár slov na zdůvodnění tohoto způsobu pohovoru při najímání. Ano, netestuji znalost syntaxe jazyka a znalost datových struktur. Na civilizovaném trhu práce to možná všechno funguje. Ale v našich podmínkách totálního nedostatku kvalifikovaného personálu je nutné posoudit perspektivní přiměřenost uchazeče o práci, které bude čelit. Tito. schopnost učit se, prorazit, přijít na to, dělat.
V duchu se to podobá „pohovoru“ při náboru legionářů ve starém Římě. Budoucí válečník byl velmi vyděšený a sledoval, zda zrudne nebo zbledne. Pokud zbledne, tak žadateli ve stresové situaci odteče krev z hlavy a je náchylný k pasivní reakci. Například mdloby. Pokud žadatel zčervená, krev se mu hrne do hlavy. Tito. je náchylný k aktivním akcím, spěchat do boje. To bylo považováno za vhodné.
No, poslední. Proč jsem o tomto problému všem řekl, místo abych ho nadále používal v rozhovorech? Prostě potenciální zájemci se tento úkol již „naučili“ a ostatní ho musí využít.
Vlastně jsem tomuto efektu věnoval pozornost právě v souvislosti s reálným úkolem zpracování obrazu. Situace byla poněkud nepřehledná a hned jsem nepochopil, proč mi po refaktoringu tolik kleslo fps. Obecně má asi každý takových nádherných chvil spoustu.
Zatím je hlavní verzí, že „na vině je mezipaměť procesoru“. Tito. sekvenční přístup v první variantě funguje v rámci hashe, který se aktualizuje při překročení určité hranice. Při přístupu po sloupcích se hash musí neustále aktualizovat a to trvá dlouho. Pojďme otestovat tuto verzi v její nejčistší podobě. Začneme pole a porovnáme, co je rychlejší - zpracovat všechny prvky v řadě nebo zpracovat prvky pole s náhodným číslem stejně kolikrát? Zde je program - ideone.com/tMaR2S. Pro 100 000 prvků pole je náhodný přístup obvykle znatelně rychlejší. Co to znamená?
Zde jsem byl zcela správně upozorněn (Big_Lebowski), že přeuspořádání cyklů mění výsledky ve prospěch sekvenční možnosti. Pro čistotu experimentu jsem musel dát cyklus na zahřívání. Zároveň jsem provedl několik opakování, abych zobrazil průměrnou provozní dobu, jak radí leventov. Dopadlo to takto ideone.com/yN1H4g. Tito. náhodný přístup k prvkům velkého pole je o ~10 % pomalejší než sekvenční přístup. Možná, že cache může skutečně hrát nějakou roli. V počáteční situaci však výkon občas klesal. Je tu tedy něco jiného.
Postupně se vedoucí stává verze o dalších akcích při přesunu z jednoho řádku pole do druhého. A je to správné. Zbývá zjistit, co se tam přesně děje.
Štítky:
- Programování
- pole
- Paměť
Naučili jsme se vytvářet jednorozměrná pole. Podobně v Javě můžete vytvářet dvourozměrné, trojrozměrné, čtyřrozměrné ... jinými slovy, vícerozměrná pole. Vícerozměrné pole v Javě je v podstatě pole polí.
Oblíbeným příkladem použití tohoto druhu polí jsou matice, které jsou reprezentovány dvourozměrnými poli. Co je tedy matice a jak ji reprezentovat pomocí dvourozměrného pole v Javě.
Matice a dvourozměrná pole v Javě
Matice je obdélníková tabulka skládající se z řádků a sloupců, na jejichž průsečíku jsou její prvky. Počet řádků a sloupců matice určuje její velikost.
Celkový pohled na velikost matice m X n(m - počet řádků, n- počet sloupců) , jak následuje:
Každý prvek matice má svůj vlastní index, kde první číslice označuje číslo řádku, na kterém se prvek nachází, a druhá je číslo sloupce.
Podívejme se na příklady konkrétních matic a vytvořte je pomocí Javy.
Matice A má rozměr 2 x 3 (2 řádky, 3 sloupce). Vytvořme dvourozměrné pole této dimenze:
int maticeA; maticeA = new int ;
Deklarovali jsme dvourozměrné pole celých čísel (protože matice v tomto případě obsahuje celá čísla) a vyhradili jsme mu paměť. K tomu jsme použili 2 indexy: první index definuje řádek a jeho velikost, druhý index definuje sloupec a jeho velikost.
Pro přístup k prvkům dvourozměrného pole musíte použít 2 indexy: první pro řádek, druhý pro sloupec. Stejně jako u jednorozměrných polí začínají indexy také od nuly. Proto číslování řádků a sloupců v tabulce začíná od 0.
MaticeA=1; matice A = -2; matice A = 3; matice A = 4; maticeA = 1; matice A = 7;
Chcete-li zobrazit matici na konzole, musíte projít všechny prvky pomocí dvou smyček. Počet cyklů při průchodu prvky pole se rovná jeho rozměru. V našem případě se první cyklus provádí v řádcích, druhý - ve sloupcích.
Pro (int i = 0; i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); }
To znamená, že nejprve zobrazíme všechny prvky prvního řádku, oddělíme je tabulátorem "\t", přeneseme řádek a zobrazíme všechny prvky druhého řádku.
Úplný kód pro matici A jak následuje:
Public class Matrix ( public static void main(String args) ( int maticeA; maticeA = new int; maticeA = 1; maticeA = -2; maticeA = 3; maticeA = 4; maticeA = 1; maticeA = 7; for (int i = 0;i< 2; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixA[i][j] + "\t"); } System.out.println(); } } }
Pro matrix B pojďme použít zjednodušený způsob inicializace- v době vyhlášení. Analogicky s jednorozměrnými poli.
Int maticeB = ( (-9,1,0), (4,1,1), (-2,2,-1));
Každý řádek pole musí být uzavřen ve složených závorkách a oddělen od sebe čárkou.
Úplný kód pro matici B:
Public class Matrix ( public static void main(String args) ( int matrixB = ( (-9,1,0), (4,1,1), (-2,2,-1) ); for (int i = 0 i< 3; i++) { for (int j = 0; j < 3; j++) { System.out.print(matrixB[i][j] + "\t"); } System.out.println(); } } }
Zvážit inicializace smyčky pro dvourozměrné pole s použitím násobící tabulky jako příkladu.
Veřejná třída Mult ( public static void main(String args) ( // vytvořit dvourozměrné pole 10 x 10 int multiplyTab = new int; // procházet první dimenzi pro (int i = 0; i< 10; i++) { // цикл по второй размерности for (int j = 0; j < 10; j++) { //инициализация элементов массива multiplyTab[i][j] = (i+1)*(j+1); //вывод элементов массива System.out.print(multiplyTab[i][j] + "\t"); } System.out.println(); } } }
Zde je inicializace prvků s hodnotami násobící tabulky kombinována s jejich výstupem do konzole v jednom cyklu.
Vícerozměrná a asymetrická pole.
Podobným způsobem se v Javě vytvářejí vícerozměrná pole. Počet hranatých závorek označuje rozměr.
Příklady vytváření polí s pevnou délkou:
Int a = new int;// dvourozměrné pole int b = new int;// trojrozměrné pole int c = nové int;// čtyřrozměrné pole // atd.
Není však nutné zpočátku zadávat velikost na všech úrovních, velikost můžete zadat pouze na první úrovni.
int a1 = new int;// dvourozměrné pole s 5 řádky
V tomto případě, i když není známo, kolik prvků bude v každém řádku, to lze určit později, navíc pole může obsahovat různý počet prvků v každém řádku, tj. asymetrické. Pojďme určit počet prvků v každém řádku pro pole a1
A1 = new int ; a1 = new int ; a1 = new int ; a1 = new int ; a1 = new int ;
V důsledku toho, když se zobrazí na obrazovce,
For(int i = 0; i pole bude vypadat takto: 0 Když je pole vytvořeno, jeho prvky jsou automaticky inicializovány na nulu, takže v tomto příkladu jsou zobrazeny nuly. Pole v Javě je kolekce prvků stejného typu, ke kterým lze přistupovat pomocí indexu. Prvky polí v Javě jsou umístěny jeden po druhém v paměti počítače. Níže je uveden příklad pole v Javě. Pojďme deklarovat pole pro uložení prvků typu int: Zde je deklarována proměnná arr, což je pole. Chcete-li tuto proměnnou použít, musíte ji definovat. Chcete-li definovat pole v Javě, musíte zadat jeho délku, tzn. počet prvků, které do něj lze uložit: Naše pole bude obsahovat 5 prvků. Pole je sbírka prvků. Ke každému prvku v poli lze přistupovat pomocí jeho čísla. Číslo se nazývá index. Prvky pole jsou v Javě číslovány od nuly. Přiřaďme hodnotu prvnímu prvku pole a první prvek má index nula: Přiřaďme hodnotu druhému prvku pole a druhý prvek má index jedna: for(int hostinec = 0; hostinec< 5; inn++) Při deklaraci pole do něj můžete okamžitě načíst hodnoty: int arr = (0, 1, 2, 3, 4); počet prvků je zde 5, tzn. není třeba uvádět počet prvků, bude určen automaticky. Ke každému prvku v poli lze přistupovat pomocí jeho čísla. Chcete-li získat prvek pole, musíte zadat název pole a index prvku: toto je první prvek pole, protože první prvek má index nula. Přiřaďme hodnotu třetího prvku pole proměnné int a: Projdeme všechny prvky pole (projdeme polem): For(int hostinec = 0; hostinec< 5; inn++)
{
System.out.println("arr[" + inn + "] = " + arr);
}
Zjednodušená verze smyčky pro výstup pole je následující: For(int inn: arr) ( System.out.println("arr[" + inn + "] = " + arr); ) Pole v Javě můžete odstranit takto: Dostaneme délku pole v Javě takto: int arrLength = délka arr; int firstelem = arr; int lastElem = arr; Jak nastavit pole proměnné délky v Javě? V žádném případě. Když definujete pole, pak nastavíte jeho délku, nemůžete ji později změnit. V takových případech se používají kolekce, například: Vector, ArrayList atd. Délka pole tedy nemůže být proměnná. Ale můžete použít proměnnou při definování pole. Pokud ano: int cd; pak dostaneme chybu, délka pole nemůže být proměnná. Musíte nastavit hodnotu cd: int cd = 10; Už je to v pořádku. Pokud se po definování pole změní proměnná cd, pak to nebude mít vliv na pole, tzn. jeho délka se nezmění. Příklad: int cd = 10; int ab = nový int; cd = 12;// To je možné arrLength = ab.length; System.out.println("délka pole ab = " + arrLength); //Výstupy: délka pole ab = 10 ab=4;// A zde je chyba Dostaneme chybu: Výjimka ve vláknu "main" java.lang.ArrayIndexOutOfBoundsException: 11 Maximální index našeho pole je 9. Změna hodnoty proměnné cd nemá vliv na pole, protože je již definováno a jeho délka je konstantní. Proměnné lze použít pro přístup k prvkům pole: int var = 1; Příklad pole znaků v Javě a jeho výstup: Char charArr = ("S", "B", "P"); for(int hostinec = 0; hostinec< charArr.length; inn++)
{
System.out.println("charArr[" + inn + "] = " + charArr);
}
Pole lze vyplnit pomocí metody statické výplně. Pole je kolekce proměnných stejného typu, na které se odkazuje společným názvem. Pole lze vytvářet z prvků libovolného typu a mohou mít jeden nebo více rozměrů. Ke konkrétnímu prvku v poli se přistupuje pomocí jeho indexu (čísla). V této poznámce se podíváme na zpracování jednorozměrných a dvourozměrných polí. Jednorozměrné pole je v podstatě seznam proměnných stejného typu. Chcete-li vytvořit pole, musíte nejprve vytvořit proměnnou pole požadovaného typu. Obecný formát pro deklaraci jednorozměrného pole je: Obecný formát pro nové při použití na jednorozměrná pole je: Jakmile alokujete paměť pro pole, můžete přistupovat ke konkrétnímu prvku v něm zadáním indexu v hranatých závorkách. Číslování prvků pole začíná od nuly. Názvy polí jsou reference. Přímo v deklaraci je možné kombinovat deklaraci proměnné typu pole s alokací paměti do pole: Zvažte kód programu, který nahrazuje záporné prvky pole maximálním prvkem: Veřejná třída FindReplace ( public static void main(String args) ( int myArray; // deklarace bez inicializace int mySecond = new int; /* alokace paměti inicializována s výchozími hodnotami */ int a = (5, 10, 0, - 5 , 16, -2); // deklarace s inicializací int max = a; for (int i = 0; i< a.length; i++) {
if (a[i]<0)
a[i] = max;
mySecond[i] = a[i];
System.out.println("a[" + i + "]=" + a[i]);
}
myArray = a; // установка ссылки на массив a
}
}
V důsledku provedení se zobrazí: Přiřazení mySecond[i] = a[i] způsobí, že některým prvkům pole mySecond, konkrétně šesti, budou přiřazeny hodnoty prvků pole a . Zbývající prvky mySecond si zachovají hodnoty získané během inicializace, tedy nuly. Pokud je přiřazení uspořádáno ve tvaru mySecond = a nebo myArray = a , pak obě pole účastnící se přiřazení obdrží odkaz na pole a , to znamená, že každé bude obsahovat šest prvků a bude odkazovat na stejnou oblast paměti. Public class MonthDays ( public static void main(String args) ( int month_days = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); System.out.println("April obsahuje " + měsíc_dny + " dny."); ) ) V důsledku spuštění programu se na obrazovce zobrazí následující: Duben obsahuje 30 dní. Komentář: Jáva provádí přísné kontroly, aby se ujistil, že se neúmyslně nepokusíte uložit nebo přečíst hodnoty mimo úložnou oblast pole. Výkonný systém Jáva také pečlivě kontroluje, zda jsou všechny indexy pole ve správném rozsahu. (V tomto ohledu Jáva výrazně odlišné od jazyků C/C++, které neposkytují kontrolu limitů za běhu). V Java multidimenzionální pole jsou ve skutečnosti pole polí. Vypadají a chovají se jako běžná vícerozměrná pole. Existuje však několik jemných rozdílů. Chcete-li deklarovat proměnnou vícerozměrného pole, definujte každý další index pomocí jiné sady hranatých závorek. Například následující příkaz deklaruje proměnnou dvourozměrného pole s názvem twoD: Veřejná třída Matrix ( private int a; Matrix(int n, int m) ( // vytvoření a naplnění náhodným a = new int[n][m]; for (int i = 0; i< n; ++i)
for (int j = 0; j < m; ++j)
a[i][j] = (int) (Math.random()*5);
show();
}
public Matrix(int n, int m, int k) {
// создание и заполнение с random
a = new int[n][m];
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
a[i][j] = k;
if (k != 0)
show();
}
public void show() {
System.out.println("Матрица:" + a.length + " на " + a.length);
for (int i = 0; i < a.length; ++i) {
for (int j = 0; j < a.length; ++j)
System.out.print(a[i][j] + " ");
System.out.println();
}
}
public static void main(String args) {
int n = 2, m = 3, z = 4;
Matrix p = new Matrix(n, m);
Matrix q = new Matrix(m, z);
Matrix r = new Matrix(n, z, 0);
for (int i = 0; i < p.a.length; ++i)
for (int j = 0; j < q.a.length; ++j)
for (int k = 0; k < p.a[i].length; ++k)
r.a[i][j] += p.a[i][k]*q.a[k][j];
System.out.println("Произведение матриц: ");
r.show();
}
}
Protože se hodnoty přiřazují prvkům pole pomocí metody random(), jedna z možností spuštění kódu může být následující: > javac Matrix.java > java Matrix Matrix:2 podle 3 3 2 0 3 3 1 Matrix:3 podle 4 1 2 2 3 3 2 3 2 1 2 3 2 Matrix Product: Matrix:2 podle 4 9 10 12 13 13 14 18 17 Následující příklad ukazuje kopírování pole: Public class ArrayCopyDemo ( public static void main(String args) ( int mas1 = (1,2,3), mas2 = (4,5,6,7,8,9); System.out.print("mas1: " ); show(mas1); System.out.print("mas2: "); show(mas2); // zkopírování pole mas1 do mas2 System.arraycopy(mas1, 0, mas2, 2, 3); /* 0 - mas1 se zkopíruje počínaje prvkem nula * 2 - prvek, od kterého začíná nahrazování * 3 - počet prvků, které se mají zkopírovat */ System.out.println("\n after arraycopy(): "); System.out. print("mas1: " ); show(mas1); System.out.print("\nmas2: "); show(mas2); ) soukromý statický void show(int mas) ( for (int i = 0; i< mas.length; ++i)
System.out.print(" " + mas[i]);
}
}
Výsledek spuštění programu: > javac ArrayCopyDemo.java > java ArrayCopyDemo mas1: 1 2 3mas2: 4 5 6 7 8 9 after arraycopy(): mas1: 1 2 3 mas2: 4 5 1 2 3 9 Existuje další formulář, který lze použít k deklaraci pole: Int al = nový int; int a2 = nový int;
0 0
0 0 0
0 0 0 0
0 0 0 0 0Cvičení na vícerozměrných polích v Javě:
Co je pole?
Deklarace pole v Javě
Definice pole v Javě
Jak načíst prvky do pole?
{
arr = hostinec;
} Jak získat prvky z pole?
Jak odstranit pole v Javě?
Jak získat délku pole v Javě?
Jak získat první prvek pole v Javě?
Jak získat polovinu posledního prvku pole v Javě?
Jak nastavit pole proměnné délky v Javě?
int ab = new int;//Chyba.
int ab = nový int;
int elem = arr;
var = 2;
elem = arr;Pole znaků v Javě
Jak naplnit pole v Javě?
Jednorozměrná pole v Javě
zadejte var-name ;
Zde type deklaruje základní typ pole; var-name je název proměnné pole. Základní typ definuje datový typ každého prvku pole. Například deklarace jednorozměrného pole komponent int s názvem month_days je:
int měsíc_dny;
Ačkoli tato deklarace uvádí, že měsíc_dny je proměnná pole, žádné pole ve skutečnosti neexistuje. Ve skutečnosti je month_days nastaven na hodnotu null (nulový ukazatel), což představuje pole bez hodnoty. Chcete-li přiřadit měsíc_dny ke skutečnému fyzickému poli celých čísel, přidělte mu paměť pomocí operátoru new a přiřaďte jej poli měsíc_dny; nová je speciální operace, která přiděluje paměť.
pole-var = nový typ ;
kde typ je typ dat, která mají být distribuována, velikost je počet prvků v poli, pole-var je proměnná přidružená k poli. Chcete-li použít new k alokaci paměti pro pole, musíte zadat typ a počet prvků v poli. Prvky v poli přiřazené nové operaci budou automaticky inicializovány na nulu. Následující příklad alokuje paměť pro 12prvkové pole celých čísel a přidruží ji k proměnné month_days.
měsíc_dny = new int;
Po provedení této instrukce bude měsíc_dny odkazovat na pole dvanácti celých čísel. Poté budou všechny prvky v poli inicializovány na nulu.
Proces získávání pole zahrnuje dva kroky. Nejprve musíte deklarovat proměnnou pole požadovaného typu. Za druhé, musíte alokovat paměť, která bude obsahovat pole, pomocí nové operace a přiřadit ji proměnné pole. Tedy v Jáva všechna pole jsou dynamicky alokována.
int měsíc_dny = nový int;>java FindReplace a=5 a=10 a=0 a=5 a=16 a=5
Pole mohou být inicializována v době, kdy jsou deklarována. Postup je v podstatě stejný jako při inicializaci jednoduchých typů. Inicializátor pole je čárkami oddělený seznam výrazů ohraničených složenými závorkami. Pole bude automaticky vytvořeno dostatečně velké, aby obsahovalo tolik prvků, kolik definujete v inicializátoru pole. Není potřeba používat nového operátora. Chcete-li například uložit počet dní v každém měsíci, následující kód vytvoří inicializované pole celých čísel: Vícerozměrná pole v Javě
int twoD = new int;
Alokuje paměť pro pole 4x5 a přiřadí ji proměnné twoD. Interně je tato matice implementována jako pole polí celých čísel typu int.
Vícerozměrná pole lze inicializovat. Chcete-li to provést, jednoduše zahrňte inicializátor každé dimenze do vlastní sady složených závorek.
Následující program vytvoří a inicializuje pole polí stejné délky (matice) a vynásobí jednu matici druhou: Alternativní syntaxe deklarace pole
zadejte var-name;
Zde hranaté závorky následují za specifikátorem typu, nikoli za názvem proměnné pole. Například následující dvě prohlášení jsou ekvivalentní:
Zde uvedená prohlášení jsou také ekvivalentní:
char twodi = nový char; char twod2 = nový znak;
Tento alternativní formulář prohlášení je zahrnut především pro usnadnění.