Doposud jsme pro určení prvku v poli používali jeden index.
Takovému poli říkáme jednorozměrné. Java umožňuje deklarovat
a vytvářet i vícerozměrná pole. Např. deklarace dvojrozměrného
pole položek typu int vypadá takto:
int[][] p;
Vícerozměrné pole v Javě je pole polí. Proměnná
p je reference na pole, jehož prvky jsou
jednorozměrná pole celých čísel. Pole vytvoříme pomocí klíčového
slova new:
p = new int[2][3];
K prvkům pole přistupujeme pomocí indexů:
p[0][1] = 1;
Počet prvků pole je v proměnné length
daného pole.
System.out.printf( "pole p má %d řádků%n", p.length );
System.out.printf( "první řádek má %d sloupců%n", p[0].length );
Při práci s vícerozměrnými poli používáme obvykle vnořené cykly
for. Např. inicializaci prvků pole
p na hodnotu 1 můžeme provést takto:
for( int i = 0; i < p.length; i++ ) {
for( int j = 0; j < p[i].length; j++ ) {
p[i][j] = 1;
}
}
Vícerozměrná pole je možné vytvářet postupně. Dílčí pole pak mohou
mít různý počet prvků. Dvojrozměrné pole tedy nemusí být nutně
obdélníkové.
Vícerozměrné pole může být parametrem i návratovým typem metody.
Metoda sectiPrvkyPodDiagonalou očekává
jako parametr dvojrozměrné obdélníkové pole (matici) a vrací
součet prvků na hlavní diagonále a pod ní.
static int sectiPrvkyPodDiagonalou( int[][] m ) {
int s = 0;
for( int i = 0; i < m.length; i++ ) {
for( int j = 0; j <= i; j++ ) {
s += m[i][j];
}
return s;
}
Metoda sectiRadky dostane jako parametr
dvojrozměrné pole, sečte hodnoty v každém řádku a vrátí
jednorozměrné pole (vektor) těchto součtů.
static int[] sectiRadky( int[][] m ) {
int[] s = new int[m.length];
for( int i = 0; i < m.length; i++ ) {
for( int j = 0; j < m[i].length; j++ ) {
s[i] += m[i][j];
}
return s;
}
Návratovou hodnotou metody sectiRadky
je hodnota proměnné s, tj. reference
na jednorozměrné pole.
Úloha 1
Doplňte tělo metody, která v poli m
nahradí všechny záporné hodnoty nulou.
Úloha 2
Doplňte tělo metody, která vrátí počet nulových prvků v poli
d.
Úloha 3
Doplňte tělo metody, která pro zadané n
vrátí matici n x n ve tvaru
1
0
0
...
0
0
2
0
...
0
0
0
3
...
0
...
...
...
...
...
0
0
0
...
n
Úloha 4
Napište ve správném pořadí.
Úloha 5
Doplňte věty.
Otázky a odpovědi
Student:
Mistře, jaké hodnoty lze použít jako index? Lze indexovat např.
hodnotami typu char?
Java guru:
Index je hodnota typu int. Jako
index můžeš tedy použít buď hodnotu typu
int nebo hodnotu typu, pro který má
Java implicitní typovou konverzi na typ
int. Tj. lze použít i typ
char.
Student:
Jak velké pole můžu vytvořit, mistře?
Java guru:
Počet prvků pole je nezáporná hodnota typu
int. To znamená, že velikost pole
může být nejvýše Integer.MAX_VALUE,
což je největší hodnota typu int.
Žádné jiné omezení Java nemá. V praxi je velikost pole omezena
velikostí volné paměti v JVM. Velikost volné paměti v JVM závisí
na konfiguraci JVM a na tom, kolik paměti jí poskytne operační
systém. U JVM firmy Oracle lze velikost paměti ovlivnit
přepínači na příkazové řádce. Přepínače
–Xms
a –Xmx umožňují zadat počáteční
a maximální velikost haldy, což je oblast paměti, ve které se
alokují objekty vytvářené pomocí new.
Student:
Mistře, kolik dimenzí může pole mít? Lze vytvořit třeba
osmirozměrné pole?
Java guru:
Definice jazyka Java počet dimenzí pole neomezuje. Omezení však
je na úrovni javovského virtuálního stroje, který povoluje
nejvýše 255 dimenzí. Osmirozměrné pole tedy jistě vytvořit
můžeš.