Obsah

Vícerozměrná pole

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; 
dvojrozměrné pole 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;
     }
  } 
trojúhelníkové pole 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í. prvky pod diagonálou

  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

100...0
020...0
003...0
...............
000...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š.