Zanim przejdę do długo wyczekiwanych kolekcji*, należałoby rozszerzyć odrobinę Twoją wiedzę o tablicach. Znasz już ich podstawy. Wiesz, że można trzymać w nich zarówno typy proste (int, float, itp.) jak i referencyjne (np. obiekty klas). Skoro można trzymać tam typy referencyjne, a tablica jest też typem referencyjnym, to znaczy, że możesz trzymać też tablicę w tablicy. W takim właśnie sposób w Javie są zaimplementowane tablice wielowymiarowe – jako tablice tablic.
Tablice wielowymiarowe – przykładowa implementacja
Spróbuj zaimplementować korzystając z tej funkcji języka Java trójkąt Pascala**.
public class MultiArray { public static void main(String[] args) { int level = 10; int[][] pascal = pascalTriangle(level); System.out.println(Arrays.deepToString(pascal)); } private static int[][] pascalTriangle(int level) { int [][] pascal = new int [level][]; for (int i = 0; i < pascal.length; i++) { pascal[i] = new int[i+1]; pascal[i][0] = 1; pascal[i][i]= 1; for (int j = 1; j < i; j++) { pascal[i][j] = pascal[i - 1][j - 1] + pascal[i-1][j]; } } return pascal; } }
Jedna z najprostszych implementacji będzie wyglądać tak, jak powyżej.
Wpierw deklarujesz tablice dwuwymiarową (int [][] pascal = new int [level][];). Tablica dwuwymiarowa to inaczej macierz***, którą możesz sobie zilustrować, tak jak na obrazku poniżej:
W przypadku jednak trójkąta Pascala wygląda to trochę inaczej, bo nasza dwuwymiarowa tablica przypomina bardziej piramidę, której wierzchołek jest równy jeden (pascal[i][0] = 1;). Następnie w kolejnych wierszach, aż do momentu osiągnięcia odpowiedniego poziomu trójkąta (zmienna level), liczba elementów macierzy rośnie (najpierw jest jeden, później dwa, następnie trzy, itp.) . Wyliczana jest konkretna wartość każdej komórki zgodnie z algorytmem trójkąta Pascala. Na samym końcu można sprawdzić rezultat wyświetlając całą macierz za pomocą klasy pomocniczej Arrays i metody deepToString.
Tablice wielowymiarowe – podsumowanie
To proste ćwiczenie ma na celu pokazać Ci, że tablice nie muszą operować na jednym wymiarze, ale wielu więcej, jeśli zajdzie tylko taka potrzeba.
*Niestety poznasz je dopiero teraz, bo uważam, że nie było sensu je wprowadzać bez znajomości interfejsów i polimorfizmu.
**https://pl.wikipedia.org/wiki/Trójkąt_Pascala
***http://www.math.edu.pl/macierze
Link do lekcji: https://github.com/developeronthego/java-middle/tree/master/src/main/java/middle/lesson12