JavaRush /Blog Java /Random-PL /Tablice wielowymiarowe

Tablice wielowymiarowe

Opublikowano w grupie Random-PL
Tablice wielowymiarowe - 1

Co to jest jednowymiarowa tablica Java?

Tablica to uporządkowany zbiór elementów tego samego typu, pierwotnych lub referencyjnych. Ogólne informacje na temat tablic (głównie jednowymiarowych) można znaleźć w artykule „ Tablice w Javie ” oraz w kursie JavaRush . W tym artykule porozmawiamy o tablicach, których elementami są inne tablice. Takie tablice nazywane są wielowymiarowymi. Tablicę, której elementami są inne tablice, czyli tablicę tablic, nazywa się dwuwymiarową. Nie wszystkie języki mają tablice wielowymiarowe skonstruowane w ten sposób, ale w Javie tak jest.

Tablice wielowymiarowe w Javie, składnia ogólna

Ogólnie tablice wielowymiarowe w Javie wyglądają następująco:
Data_type[dimension1][dimension2][]..[dimensionN] array_name = new data_type[size1][size2].[sizeN];
Gdzie Data_typejest typ elementów w tablicy. Może być pierwotny lub referencyjny (klasa). Liczba par nawiasów z dimensionwewnątrz to wymiar tablicy (w naszym przypadku - N). array_name— nazwa tablicy size1...sizN— liczba elementów w każdym wymiarze tablicy. Deklarowanie tablic wielowymiarowych:
int[][] twoDimArray; //tablica dwuwymiarowa
String[][][] threeDimArray; //trójwymiarowa tablica
double[][][][][] fiveDimArray; // tablica pięciowymiarowa
Być może wszystko to wygląda bardzo abstrakcyjnie, więc przejdźmy teraz do konkretnych przejawów tablic wielowymiarowych - dwuwymiarowych i trójwymiarowych. Faktem jest, że programiści Java czasami korzystają z tablic dwuwymiarowych, znacznie rzadziej - trójwymiarowych, a jeszcze większe tablice są niezwykle rzadkie. Istnieje duże prawdopodobieństwo, że ich nie spotkasz.

Tablice wielowymiarowe w kursie JavaRush

W JavaRush „zwykłe” tablice rozpoczynają się na poziomie 7 zadania Java Syntax , a w dalszej części kursu spotyka się je więcej niż raz. Czasami w trakcie kursu natkniesz się na problemy związane z tablicami dwuwymiarowymi (lub takimi, które można rozwiązać za ich pomocą). Tablice dwuwymiarowe są również wykorzystywane w silniku gry w specjalnej sekcji „ Gry na JavaRush ”. Jeśli jeszcze tam nie byłeś, zajrzyj i stwórz grę lub dwie. Regulamin zawiera szczegółowe instrukcje i zapewnia doskonałe szkolenie w zakresie umiejętności programowania. Trójwymiarową tablicę można znaleźć w grze Space Invaders . Za jego pośrednictwem określany jest zestaw klatek do animacji (a każda z tych klatek jest tablicą dwuwymiarową). Jeśli ukończyłeś już zadanie JavaSyntax lub po prostu czujesz się pewnie w programowaniu w języku Java, spróbuj napisać własną wersję tej klasycznej gry.

Co to jest dwuwymiarowa tablica Java?

Tablica dwuwymiarowa w Javie to tablica tablic, co oznacza, że ​​każda komórka zawiera odwołanie do tablicy. Dużo łatwiej jest jednak przedstawić to w formie tabeli, która ma określoną liczbę wierszy (pierwszy wymiar) i liczbę kolumn (drugi wymiar). Tablicę dwuwymiarową, w której wszystkie wiersze mają taką samą liczbę elementów, nazywamy tablicą prostokątną.

Deklarowanie, tworzenie i inicjowanie tablic dwuwymiarowych

Procedura deklarowania i tworzenia tablicy dwuwymiarowej jest prawie taka sama jak w przypadku tablicy jednowymiarowej:
int[][] twoDimArray = new int[3][4];
Ta tablica ma 3 wiersze i 4 kolumny. Rozmiar prostokątnej tablicy dwuwymiarowej (mogą nie być prostokątne, więcej o tym poniżej), czyli całkowitą liczbę elementów można określić mnożąc liczbę wierszy przez liczbę kolumn. Jest teraz inicjowany (wypełniany) wartościami domyślnymi. Czyli zera. Wypełnijmy go potrzebnymi nam wartościami.
twoDimArray[0][0] = 5;//wpisz wartość 5 do komórki na przecięciu wiersza zerowego i kolumny zerowej
twoDimArray[0][1] = 7; //wpisz wartość 7 do komórki na przecięciu wiersza zerowego i pierwszej kolumny
twoDimArray[0][2]  = 3;
twoDimArray[0][3] = 17;
twoDimArray[1][0] = 7;
twoDimArray[1][1] = 0;
twoDimArray[1][2] = 1;
twoDimArray[1][3] = 12;
twoDimArray[2][0] = 8;
twoDimArray[2][1] = 1;
twoDimArray[2][2] = 2;
twoDimArray[2][3] = 3;
Podobnie jak w przypadku tablic jednowymiarowych, możesz szybciej wykonać procedurę inicjalizacji:
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
W obu przypadkach otrzymamy dwuwymiarową tablicę z trzema wierszami i czterema kolumnami, wypełnioną liczbami całkowitymi. Tablice wielowymiarowe - 2

Wyświetlanie na ekranie tablicy dwuwymiarowej

Najbardziej logicznym sposobem wykonania tej operacji jest wyświetlenie najpierw elementu linii zerowej element po elemencie, następnie drugiego i tak dalej. Najpopularniejszym sposobem wyprowadzania dwuwymiarowej tablicy w Javie jest użycie dwóch zagnieżdżonych pętli.
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};// zadeklarowałem tablicę i wypełniłem ją elementami
for (int i = 0; i < 3; i++) {  //przejść przez linie
            for (int j = 0; j < 4; j++) {//przejrzyj kolumny
                System.out.print(" " + twoDimArray[i][j] + " "); // element wyjściowy
            }
            System.out.println();// zawijanie linii w celu wizualnego zachowania formy tabelarycznej
        }

Szybkie wyjście tablicy dwuwymiarowej

Najkrótszym sposobem wyświetlenia na ekranie listy elementów tablicy dwuwymiarowej jest użycie metody deepToStringklasowej Arrays. Przykład:
int[][] myArray = {{18,28,18},{28,45,90},{45,3,14}};
System.out.printLn(Arrays.deepToString(myArray));
Wynikiem programu jest następujący wynik: [[18, 28, 18], [28, 45, 90], [45, 3, 14]]

„Długości” tablicy dwuwymiarowej

Aby uzyskać długość tablicy jednowymiarowej (czyli liczbę jej elementów), możesz użyć zmiennej length. Oznacza to, że jeśli zdefiniujemy tablicę int a[] = {1,2,3}, operacja a.lengthzwróci 3. A co, jeśli zastosujemy tę samą procedurę do naszej dwuwymiarowej tablicy?
int [][] twoDimArray = {{5,7,3,17}, {7,0,1,12}, {8,1,2,3}};
System.out.println(twoDimArray.length);
Dane wyjściowe: 3 Zatem ta operacja zwraca liczbę wierszy w tablicy. Jak uzyskać liczbę kolumn? Jeśli mamy do czynienia z prostokątnymi tablicami dwuwymiarowymi (czyli takimi, w których wszystkie linie mają tę samą długość), to możemy zastosować operację twoDimArray[0].lengthlub zamiast elementu zerowego (w zasadzie linii zerowej) - dowolną inną istniejącą. Możemy to zrobić, ponieważ w Javie tablica dwuwymiarowa jest tablicą tablic, a element zero twoDimArray[0]jest tablicą o długości 4. Możesz to sprawdzić sam.

Przykład wykorzystania tablicy dwuwymiarowej: szachownica

Tablice dwuwymiarowe można wykorzystać do stworzenia dowolnego skończonego pola dwuwymiarowego, na przykład w grach, a w szczególności w szachach. Łatwo jest myśleć o szachownicy jako o tablicy dwuwymiarowej. Można do tego „dołączyć” grafikę, ale na razie zdefiniujmy szachownicę za pomocą symboli i wyprowadźmy ją na konsolę. Tablice wielowymiarowe - 3Lewy dolny kwadrat szachownicy jest pomalowany na czarno, następny jest biały, podobnie jak ten nad nim. Zatem kolor zmienia się za każdym razem, gdy przechodzisz do komórki sąsiadującej z boku. Aby ustawić kolorowanie szachów nie ręcznie, ale za pomocą algorytmu, możesz zastosować kontrolę parzystości: jeśli suma indeksu wiersza i kolumny jest parzysta lub zerowa, wówczas komórka będzie biała, w przeciwnym razie będzie czarna. Do tego sprawdzenia używamy w algorytmie operatora reszty %. Ponieważ nie pracujemy z grafiką, ale z symbolami, białą komórkę oznaczymy literą W(biała), a czarną komórkę literą B(czarną).
//ustaw szachownicę jako tablicę dwuwymiarową
String [][] chessBoard = new String[8][8];
        for (int i = 0; i< chessBoard.length; i++) {
            for (int j = 0; j < chessBoard[0].length; j++) {
                if ((i + j) % 2 == 0) chessBoard[i][j] = "W";
                else chessBoard[i][j] = "B";
            }
        }
Wynik programu jest następujący: WBWBWBWBBWBWBWBWWBWBW BWBBWBWBWBWWBWBWBWBBW BWBWBWWBWBWBWBBWBWBWB W Wszystko jest jak na prawdziwej szachownicy, możesz to sprawdzić. Tablice wielowymiarowe - 4Napiszmy teraz metodę poprawnego numerowania komórek nie w języku tablic, ale w języku „szachowym”. Lewa dolna komórka na tablicy nazywa się A1, natomiast w naszej tablicy jest to chessBoard[7][0]. Powiążmy każdą parę indeksów tablicy dwuwymiarowej z ich „szachowym” odpowiednikiem. Aby to zrobić, używamy dwóch linii - „ abcdefgh” i „ 87654321” (w odwrotnej kolejności - dla uproszczenia, tak aby szachownica 8 odpowiadała kolumnie zerowej).
public static String chessBoardCoord(int a, int b) {
            String letters = "abcdefgh";
            String numbers = "87654321";
            if ((a > 7)|| (b>7)) return null; //jeśli liczba jest poza tablicą, zwróć wartość domyślną - null
            else return (Character.toString(letters.charAt(a)) + numbers.charAt(b)); /*charAt - metoda, za pomocą której wyciągamy ze stringa element pod przekazaną liczbą, tutaj - pod liczbami a i b. Character.toString - metoda konwertująca otrzymany znak na napis */
        }
Teraz wyświetlmy w każdej komórce nie tylko jej kolor, ale także numer, korzystając z metodychessBoardCoord
String [][] chessBoard = new String[8][8];
        for (int i = 0; i < chessBoard.length; i++) {
            for (int j = 0; j < chessBoard[0].length; j++) {
                if ((i + j) % 2 == 0) chessBoard[i][j] = "W" + chessBoardCoord(j,i);
                else chessBoard[i][j] = "B"+ chessBoardCoord(j,i);
            }
        }

            for (int i = 0; i < chessBoard.length; i++) {
                for (int j = 0; j < chessBoard[0].length; j++) {
                    System.out.print(" " + chessBoard[i][j] + " ");
                }
                System.out.println();
            }
Dane wyjściowe programu: Wa8 Bb8 Wc8 Bd8 We8 Bf8 Wg8 Bh8 Ba7 Wb7 Bc7 Wd7 Be7 Wf7 Bg7 Wh7 Wa6 Bb6 Wc6 Bd6 We6 Bf6 Wg6 Bh6 Ba5 Wb5 Bc5 Wd5 Be5 Wf5 Bg5 Wh5 Wa4 Bb4 Wc4 Bd4 We4 Bf4 Wg4 Bh4 Ba3 Wb3 Bc3 Wd 3 Be3 Wf3 Gg3 Wh3 Wa2 Gb2 Wc2 Bd2 We2 Bf2 Wg2 Bh2 Ba1 Wb1 Gc1 Wd1 Be1 Wf1 Gg1 Wh1 Gdzie We2oznacza biały kwadrat oznaczony numerem e2.

Przykład wykorzystania tablicy dwuwymiarowej: mnożenie macierzy

Uwaga!Ten przykład wymaga podstawowej znajomości macierzy. Tutaj niewiele się o nich powie, a ta informacja jest przeznaczona dla tych, którzy studiowali, ale nieco zapomnieli, arytmetykę macierzową. Tę wiedzę można jednak zaczerpnąć z otwartych źródeł, w szczególności z artykułu na Wikipedii . To dobry przykład wykorzystania tablic dwuwymiarowych, ale możemy obejść się bez niego. Jeśli więc wydaje Ci się to teraz niezrozumiałe z matematycznego punktu widzenia i nie chcesz się w to zagłębiać, możesz pominąć ten przykład. Jeśli studiowałeś podstawową algebrę liniową, być może dowiedziałeś się o tablicach prostokątnych jako o macierzach prostokątnych. Tablice wielowymiarowe - 5Gdzie a11, a12...aNN to pewne liczby. Na rysunku macierz nie jest nawet prostokątna, ale kwadratowa (liczba wierszy jest równa liczbie kolumn, ale nie zawsze tak jest). W prawdziwym życiu takie macierze spotyka się rzadko, natomiast w programowaniu i informatyce są one bardzo powszechne. W szczególności znajdują zastosowanie w grafice komputerowej i silnikach gier. Przykładowo obrót obiektu na ekranie o dowolny kąt można zaprogramować za pomocą macierzy obrotu. W przestrzeni dwuwymiarowej macierz obrotu wygląda następująco: Tablice wielowymiarowe - 6Gdzie theta jest kątem, o który należy obrócić obiekt. Macierze o jednakowych wymiarach można dodawać do siebie, a dodawanie następuje element po elemencie (dodajemy elementy o tych samych indeksach). Ale operacja mnożenia macierzy jest mniej znana. Zatem macierze można mnożyć i otrzymaną macierz można otrzymać tylko wtedy, gdy liczba kolumn pierwszej macierzy pokrywa się z liczbą wierszy drugiej macierzy. Macierz wynikowa będzie miała taką samą liczbę wierszy jak pierwsza i taką samą liczbę kolumn jak druga. Mnożenie wykonuje się w następujący sposób. Miejmy macierz a[l][m]i b[m][n]. W wyniku ich pomnożenia powinniśmy otrzymać macierz c[l][n]. Aby otrzymać element c[0][0]macierzy iloczynu należy a[0][0]pomnożyć element zerowy wiersza zerowego pierwszej macierzy przez element zerowy drugiej macierzy, następnie pomnożyć pierwszy element pierwszego wiersza pierwszej macierzy przez pierwszy element pierwszej kolumny drugiej matrycy i tak dalej, po czym dodawane są wszystkie powstałe produkty.

a[0][0]*b[0][0] + a[0][1]*b[1][0] + … + a[0][m-1]*b[m-1][0]
Aby uzyskać drugi element pierwszego wiersza macierzy wyników, wykonujemy tę samą procedurę z drugim wierszem

a[1][0]*b[0][0] + a[1][1]*b[0][1] + … + a[0][m-1]*b[m-1][0]
I tak dalej, aż do końca wiersza. Następnie przechodzimy do następnej linii i powtarzamy procedurę, aż skończą nam się linie. Oznacza to, że mnożymy wiersze pierwszej macierzy przez kolumny drugiej macierzy. Poniżej znajduje się kod mnożenia macierzy. Można go uzupełnić sprawdzeniem zgodności z powyższym warunkiem dotyczącym liczby wierszy i kolumn.
//deklaracja dwóch macierzy
int [][] twoDimArray1 = {{1,0,0,0},{0,1,0,0},{0,0,0,0}};
int[][] twoDimArray2 = {{1,2,3},{1,1,1},{0,0,0},{2,1,0}};

//proces mnożenia macierzy
int[][]twoDimArray3 = new int [twoDimArray1.length][twoDimArray2[0].length];
        for (int i=0; i<twoDimArray3[0].length; i++)
            for (int j=0; j<twoDimArray3.length; j++)
                for (int k=0; k<twoDimArray1[0].length; k++)
                              twoDimArray3[i][j] = twoDimArray3[i][j] + twoDimArray1[i][k] * twoDimArray2[k][j];

//wyjście na wyświetlaczu
        for (int i = 0; i < twoDimArray3.length; i++) {
            for (int j = 0; j < twoDimArray3[0].length; j++) {
                System.out.print(" " + twoDimArray3[i][j] + " ");
            }
            System.out.println();
        }
Program wyświetli następujący wynik: 1 2 3 1 1 1 0 0 0

Nieprostokątne tablice dwuwymiarowe

Ponieważ tablice dwuwymiarowe w Javie są tablicami tablic, każda z tablic wewnętrznych może mieć różną długość. Tworząc tablicę, możemy podać jedynie liczbę wierszy, a nie liczbę kolumn (czyli tak naprawdę długość tych samych wierszy). Spójrzmy na przykład.
//deklaracja i tworzenie tablicy, podając tylko ilość wierszy
int [][] twoDimArray = new int[5][];

// zainicjuj tablicę, wypełniając ją tablicami o różnej długości
        twoDimArray[0] = new int[]{1, 2, 3, 4, 5};
        twoDimArray[1] = new int[]{1,2,3,4};
        twoDimArray[2] = new int[]{1,2,3};
        twoDimArray[3] = new int[]{1,2};
        twoDimArray[4] = new int[]{1};
//wyświetl wynikową dwuwymiarową tablicę nieprostokątną na ekranie
        for (int i = 0; i < twoDimArray.length; i++) {
            for (int j = 0; j < twoDimArray[i].length; j++) {
                System.out.print(" " + twoDimArray[i][j] + " ");
            }
            System.out.println();
        }
Wynik programu: 1 2 3 4 5 1 2 3 4 1 2 3 1 2 1 Zatem linia zerowa naszej tablicy zawiera tablicę {1,2,3,4,5}, a czwarta linia zawiera tablicę {1}.

Tablice trójwymiarowe w Javie

Kierując się zdrowym rozsądkiem i logiką języka Java, tablicę trójwymiarową można nazwać „tablicą tablic” lub „tablicą, której każdy element jest tablicą dwuwymiarową”. Co więcej, te dwuwymiarowe tablice mogą być różne. Przykład:
// utwórz tablicę trójwymiarową składającą się z dwóch tablic dwuwymiarowych
int[][][] threeDimArr = new int[2][][];
//utwórz pierwszą tablicę 2D z tablicy 3D 5x2
        threeDimArr[0] = new int[5][2];
//utwórz drugą tablicę 2D z tablicy 1x1 3D
        threeDimArr[1] = new int[1][1];
Ale częściej w praktyce istnieją tablice trójwymiarowe, w których wszystkie trzy wielkości są zdefiniowane jednocześnie, co jest analogiem prostokątnych tablic dwuwymiarowych. Tablice wielowymiarowe - 7Jak już wspomnieliśmy, tablice trójwymiarowe lub więcej są używane bardzo rzadko. Można jednak zaprogramować coś interesującego za pomocą tablicy 3D. Na przykład parking wielopoziomowy. Każde piętro można uznać za dwuwymiarowy układ, a miejsce parkingowe można uznać za konkretny element trójwymiarowego układu. Element takiej tablicy może być reprezentowany przez typ booleano wartości false , jeśli miejsce jest wolne, i true , jeśli miejsce jest zajęte.
//ustaw trójwymiarową tablicę logiczną. Ten parking ma 3 kondygnacje, z których każda może pomieścić 2x5 = 10 samochodów. Domyślnie wszystkie komórki są puste (fałsz)
boolean[][][] parkingLot = new boolean[3][2][5];
//dwa samochody przyjechały i zaparkowały na parterze w celi [1][0] i [1][3]
        parkingLot[0][1][0] = true;
        parkingLot[0][1][3] = true;

//Wyślij tablicę do konsoli
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 2; j++) {
                for (int k = 0; k < 5; k++) {
                    System.out.print("arr[" + i + "][" + j + "][" + k + "] = " + parkingLot[i][j][k] + "\t");

                }
                System.out.println();
            }
        }

Tablice wielowymiarowe w prawdziwej pracy programisty Java

W rzeczywistości większość programistów Java nie spotyka się zbyt często z tablicami wielowymiarowymi. Istnieje jednak wiele zadań, do których ta struktura danych jest bardzo dobrze dostosowana.

  1. Do testów i ustawiania macierzy jako stałych w celu sprawdzenia konkretnego algorytmu.
  2. Czasami w sieciach neuronowych stosuje się tablice wielowymiarowe.
  3. Tablice wielowymiarowe są odpowiednie dla archiwizatorów.
  4. Praca z obrazami.

Interesujące problemy dotyczące tablic dwuwymiarowych i trójwymiarowych

Wiesz wystarczająco dużo o tablicach wielowymiarowych w Javie i jeśli czujesz się pewnie, możesz spróbować rozwiązać niektóre z poniższych problemów. Nie są łatwe, ale ciekawe. Kółko i krzyżyk. Ustaw pole 3x3, utwórz dwóch graczy, którzy na zmianę. Początkowo pole jest puste i w każdym z pustych pól pierwszy gracz może postawić krzyżyk, a drugi zero. Zwycięzcą zostaje ten, kto jako pierwszy zbierze trzy krzyżyki lub trzy zera ułożone w jednym rzędzie, w jednej kolumnie lub po przekątnej.

Co jeszcze przeczytać

Gra Java dla początkujących

Mrówka Langtona . Istnieje pewne pole podzielone na komórki (tablica dwuwymiarowa), pomalowane na czarno lub biało (można ustawić funkcją losową). „Mrówka” materializuje się losowo w jednej z komórek i na każdym kroku może poruszać się w jednym z czterech kierunków do sąsiedniej komórki, poziomo lub pionowo. Zasady ruchu mrówek:
  • Na czarnym kwadracie mrówka musi obrócić się o 90° w lewo, zmienić kolor swojej komórki na biały, a następnie przejść do następnego kwadratu.
  • Na białym kwadracie mrówka obraca się o 90° w prawo i zmienia kolor swojej komórki na czarny, po czym przechodzi do następnego kwadratu.
Napisz metodę obliczającą iterację w kroku numer, nbiorąc pod uwagę początkową pozycję mrówki. Pole można wypełnić losowo zerami i jedynkami (lub oznaczyć literami Wi B, tak jak to zrobiliśmy w przykładzie z szachownicą). Potrzebujemy jeszcze dwóch parametrów - poziomej i pionowej pozycji mrówki oraz jej kierunku na tym etapie (północ, południe, zachód, wschód), przy czym mrówka domyślnie patrzy na północ. Możesz spróbować modelować kostkę Rubika za pomocą tablic trójwymiarowych. Standardowa kostka Rubika ma 6 ścian, a każda z nich jest trójwymiarowym układem kolorowych kwadratów Color[][][] rubik = new Color[6][3][3]. Jednak wykonanie kostki Rubika nie jest zadaniem trywialnym.

Przydatne materiały o tablicach

Wiele artykułów na JavaRush poświęconych jest tablicom (głównie jednowymiarowym, gdyż są one znacznie częściej stosowane w praktyce). Zwróć na nie uwagę.
  1. Tablice w Javie - o tablicach dla początkujących z przykładami
  2. Coś o tablicach - Dobry szczegółowy artykuł na temat tablic
  3. Klasa Arrays i jej zastosowanie - w artykule opisano niektóre metody tej klasyArray
  4. Arrays to pierwszy wykład JavaRush poświęcony tablicom.
  5. Zwróć tablicę o zerowej długości, a nie null — autor efektywnego programowania, Joshua Bloch, mówi o tym, jak lepiej zwracać puste tablice
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION