Rozdział 6 - Tablice - Tablice wielowymiarowe

Tablice mogą mieć więcej, niż jeden wymiar. Jeżeli zdefiniujemy tablicę tablic, to wtedy będzie to tablica dwuwymiarowa – każdy element tablicy będzie kolejną tablicą, do której będziemy mogli się odnieść za pomocą jej indeksów.

Można zdefniować tablice o większej liczbie wymiarów, ale w praktyce tablice o więcej niż trzech wymiarach nie są wykorzystywane.

Aby zdefiniować tablicę wielowymiarową, dodajemy do definicji kolejny zestaw nawiasów kwadratowych:

int[][] tablica2d = new int[3][5];

Zdefiniowana powyżej tablica to tablica trzech tablic, z których każda może przechowywać pięć wartości typu int.

Aby skorzystać z tej tablicy i odnieść się do konkretnego elementu pod-tablicy, dodajemy kolejny zestaw nawiasów kwadratowych [ ]:

Nazwa pliku: TablicaDwuwymiarowa.java
public class TablicaDwuwymiarowa {
  public static void main(String[] args) {
    int[][] tablica2d = new int[3][5];

    // pierwszy element pierwszej pod-tablicy
    tablica2d[0][0] = 5;

    // drugi, trzeci, i czwarty element drugiej pod-tablicy
    tablica2d[1][1] = 10;
    tablica2d[1][2] = 100;
    tablica2d[1][3] = 1000;

    // drugi element trzeciej pod-tablicy
    tablica2d[2][1] = 50;

    System.out.println(tablica2d[0][0]);
    System.out.println(tablica2d[0][4]);
    System.out.println(tablica2d[1][3]);
    System.out.println(tablica2d[2][3]);
  }
}

W tym przykładzie odnosimy się do każdej z trzech pod-tablic – indeks podany w pierwszym zestawie nawiasów kwadratowych [ ] to indeks pod-tablicy, do której chcemy się odwołać, więc zapis:

tablica2d[0]
tablica2d[1]
tablica2d[2]

to odniesienie się do, kolejno, pierwszej, drugiej, i trzeciej pod-tablicy (bo indeksy zaczynamy od 0). Skoro elementami tablica2d są inne tablice, to możemy teraz dopisać kolejny zestaw nawiasów kwadratowych z indeksem, aby odnieść się do konkretnego elementu pod-tablicy. Dla przykładu, zapis:

tablica2d[0][0]

to odniesienie się do pierwszego elementu pierwszej pod-tablicy. Z kolei:

tablica2d[2][3]

to odniesienie się do czwartego elementu trzeciej pod-tablicy.

W powyższym przykładowym programie ustawiamy wartości kilku elementów pod-tablic oraz kilka z nich wypisujemy – zauważmy, że wypisujemy kilka elementów, których wartości nie ustawiliśmy – jak już wiemy, domyślne wartości, jakie przyjmują niezainicjalizowane elementy tablic typu int to zera – stąd na ekranie zobaczymy:

5 0 1000 0

Możemy dowiedzieć się, ile ma każdy z wymiarów tablicy wielowymiarowej używając atrybutu length. Poniżej pokazano, jak odczytać rozmiar obu wymiarów:

Nazwa pliku: TablicaDwuwymiarowa.java
System.out.println("Pierwszy wymiar: " + tablica2d.length);
System.out.println("Drugi wymiar: " + tablica2d[0].length);

Wynik działania:

Pierwszy wymiar: 3 Drugi wymiar: 5

W poprzednim rozdziale zobaczyliśmy, że pętle w prosty sposób umożliwiają nam przechodzenie przez elementy tablicy. Aby przejść przez tablicę wielowymiarową, możemy użyć zagnieżdżonych pętli:

Nazwa pliku: TablicaDwuwymiarowa.java
for (int i = 0; i < tablica2d.length; i++) {
  for (int j = 0; j < tablica2d[i].length; j++) {
    System.out.print(tablica2d[i][j] + ", ");
  }

  System.out.println(); // nowa linia
}

W tym przykładzie skorzystaliśmy z zagnieżdżonej pętli for – w pętli zewnętrznej iterujemy po "głównym" wymiarze tablicy – w tym przypadku, ma on trzy elementy – trzy pod-tablice. W pętli wewnętrznej przechodzimy natomiast przez wszystkie elementy każdej pod-tablicy (gdzie każda z nich ma pięć elementów).

Zwróćmy uwagę na to, jak zapisany jest warunek pętli wewnętrznej:

j < tablica2d[i].length

Tak zapisany warunek będzie korzystał z rozmiaru każdej pod-tablicy podczas wykonywania się pętli wewnętrznej.

Na ekranie zobaczymy następujące wartości (część z widocznych wartości ustawiliśmy w jednym z fragmentów kodu powyżej – pozostałe to niezainicjalizowane wartości domyślne, czyli zera):

5, 0, 0, 0, 0, 0, 10, 100, 1000, 0, 0, 50, 0, 0, 0,

Inicjalizacja tablic wielowymiarowych

Tablicę jednowymiarową inicjalizowaliśmy w następujący sposób:

double[] rzeczywiste = { 3.14, 5, -20.5 };

By zainicjalizować tablicę więcej niż jednego wymiaru, należy użyć kolejnego zestawu nawiasów klamrowych:

Nazwa pliku: TablicaDwuwymiarowaInicjalizacja.java
public class TablicaDwuwymiarowaInicjalizacja {
  public static void main(String[] args) {
    char[][] kwadrat = {
        { 'X', 'X', 'X', 'X' },
        { 'X', 'O', 'O', 'X' },
        { 'X', 'O', 'O', 'X' },
        { 'X', 'X', 'X', 'X' }
    };

    for (int rzad = 0; rzad < kwadrat.length; rzad++) {
      for (int kolumna = 0; kolumna < kwadrat[rzad].length; kolumna++) {
        System.out.print(kwadrat[rzad][kolumna]);
      }

      System.out.println(); // nowa linia
    }
  }
}

Aby zainicjalizować tablicę dwuwymiarową kwadrat, w "głównych" nawiasach klamrowych { } zamieściliśmy kolejne zestawy nawiasów klamrowych, w których znajdują się wartości każdej z pod-tabel, jakie mają się w nich znajdować.

W zagnieżdżonej pętli przechodzimy przez wszystkie pod-tablice i wypisujemy je na ekran.

W wyniku działania powyższego programu, na ekranie zobaczymy:

XXXX XOOX XOOX XXXX

Dodaj komentarz

Twój adres email nie zostanie opublikowany.