CodeGym /Blog Java /Poland /Tablice w Javie
Autor
Oleksandr Miadelets
Head of Developers Team at CodeGym

Tablice w Javie

Opublikowano w grupie Poland
Wyobraź sobie półki w magazynie. Każda z nich ma swój numer i każda przechowuje jakiś obiekt — Bagaż. Albo kartę win, w której każdy rodzaj wina jest ponumerowany i zamawiasz, podając numer swojego trunku. Czy listę uczniów, w której „Adams” jest zapisany na pierwszym miejscu, a „Zimmer” na ostatnim. Lub spis pasażerów w samolocie, z których każdy ma przydzielone miejsce z odpowiednim numerem. W Javie do pracy z takimi strukturami często wykorzystywane są tablice, czyli zbiory jednorodnych danych.

Tablice w ramach kursu CodeGym

W CodeGym pracę z tablicami rozpoczyna się na 7. poziomie zadania Składnia Javy. Poświęcono im trzy lekcje oraz 8 zadań na różnych poziomach, które utrwalą dane umiejętności. Jednak w trakcie kursu wielokrotnie napotkasz tablice (w szczególności klasa Array będzie studiowana w zadaniu Kolekcje Javy oraz jako część twojej przyszłej pracy.

Czym jest tablica?

Tablica to struktura danych, w której przechowywane są elementy tego samego typu. Możesz myśleć o nich jako o zestawie ponumerowanych komórek. W każdej z nich można umieścić pewne dane (każda zawiera jeden element danych). Dostęp do określonej komórki uzyskuje się za pomocą jej numeru. Numer elementu w tablicy nazywany jest także indeksem. W Javie tablica jest jednorodna, tzn. wszystkie jej komórki zawierają elementy tego samego typu. Zatem tablica liczb całkowitych zawiera tylko liczby całkowite (int), tablica ciągów - tylko ciągi, a tablica instancji utworzonej przez nas klasy Dog będzie zawierała tylko obiekty Dog. Innymi słowy, Java nie pozwoli nam umieścić w pierwszej komórce tej samej tablicy liczby całkowitej, w drugiej ciągu - String, a w trzeciej psa (obiektu typu Dog). Czym jest tablica?

Deklaracja tablicy

Jak zadeklarować tablicę?

Jak każda zmienna, tablica musi być zadeklarowana w Javie. Można to zrobić na jeden z dwóch sposobów. Są one równoważne, ale pierwszy sposób jest bardziej zgodny ze stylem Java. Drugi jest pozostałością po języku C: wielu programistów języka C przeszło na Javę i dla ich wygody zachowano alternatywną metodę. W tabeli przedstawiono oba sposoby deklarowania tablicy w Javie:
Nr. Deklaracja tablicy, składnia Javy Przykłady Komentarz
1.
dataType[] arrayName;

int[] myArray;

Object[] 
arrayOfObjects;  
It is advisable to declare an array this way. This is Java style.
2.
dataType arrayName[];

int myArray[];

Object 
arrayOfObjects[];
Array declaration method inherited from C/C++, works in Java
W obu przypadkach dataType jest typem zmiennych w tablicy. W przykładach zadeklarowaliśmy dwie tablice. W jednej będą przechowywane inty, a w drugiej — obiekty Object. Tak więc deklaracja tablicy ma nazwę i typ (typ elementów tablicy). Natomiast ArrayName oznacza jej nazwę.

Tworzenie tablicy

Jak stworzyć tablicę?

Jak każdy inny obiekt, tablicę w Javie można utworzyć, czyli zarezerwować dla niej miejsce w pamięci, za pomocą operatora new. Oto, jak to się robi:

new typeOfArray[length]; 
gdzie typeOfArray jest typem tablicy, a length jest jej długością (tj. liczbą komórek) wyrażoną jako liczba całkowita (int). Zwróćmy jednak uwagę, że w tym przypadku przypisaliśmy pamięć tylko dla tablicy - nie skojarzyliśmy zadeklarowanej tablicy z żadną wcześniej zadeklarowaną zmienną. Zazwyczaj najpierw deklaruje się tablicę, a następnie tworzy się jej instancję, np:

int[] myArray; // Array declaration
myArray = new int[10]; // Create (allocate memory for) an array of 10 ints
W tym miejscu utworzyliśmy tablicę liczb całkowitych o nazwie myArray, informując kompilator, że składa się ona z 10 komórek (każda z nich będzie zawierała liczbę całkowitą). Jednak znacznie częściej stosuje się następującą skróconą składnię, aby utworzyć tablicę natychmiast po jej zadeklarowaniu:

int[] myArray = new int [10]; // Declare the array and allocate memory "in one blow"
Należy zwrócić uwagę na poniższe: Po utworzeniu tablicy za pomocą operatora new jej komórki zawierają wartości domyślne. Dla typów numerycznych (jak w naszym przykładzie) domyślną wartością jest 0, dla typu boolean jest to false, a dla typów referencyjnych null. Zatem po wykonaniu tego polecenia

int[] myArray = new int[10];
otrzymujemy tablicę dziesięciu liczb całkowitych i dopóki program nie zmieni ich wartości, każda komórka będzie zawierała 0.
Więcej informacji na ten temat można znaleźć w artykule „Something about arrays”.

Długość tablicy w Javie

Jak już wspomnieliśmy, długość tablicy to liczba elementów, które ma za zadanie pomieścić. Długości nie można zmienić po jej utworzeniu. Pamiętaj, że elementy tablicy są numerowane w Javie od zera. Tak więc, jeśli składa się ona z 10 elementów, to indeks pierwszego elementu wynosi 0, a ostatniego 9. Długość tablicy w JavieDługość tablicy można uzyskać za pomocą zmiennej length. Na przykład:

int[] myArray = new int[10]; // Create an int array for 10 elements and name it myArray
System.out.println(myArray.length); // Display the array's length, i.e. the number of elements we can put into the array
Output:

10

Inicjowanie tablicy i dostęp do jej elementów

Teraz już wiemy, jak utworzyć tablicę w Javie. W wyniku tego procesu otrzymujemy nie pustą tablicę, ale tablicę wypełnioną wartościami domyślnymi. Na przykład dla tablicy int jest to 0, a jeśli jest ona dowolnego typu referencyjnego, wartością domyślną w każdej komórce jest null. Dostęp do elementu tablicy (na przykład w celu ustawienia jego wartości, wyświetlenia na ekranie lub wykonania na nim jakiejś innej operacji) uzyskuje się za pomocą jego indeksu. Inicjalizacja tablicy to proces jej wypełniania określonymi wartościami (innymi niż domyślne). Przykład: stwórzmy tablicę ciągów dla 4 pór roku i wypełnijmy ją nazwami pór roku.

String[] seasons = new String[4]; /* Declare and create an array. Java allocates memory for an array of 4 strings, and each cell is set to null (since String is a reference type) */ 

seasons[0] = "Winter"; /* We set the first cell, i.e. the cell with index zero, to "Winter". Here we access the zeroth element of the array and write a specific value to it. */ 
seasons[1] = "Spring"; // We follow a similar procedure for the cell with index 1 (the second cell)
seasons[2] = "Summer"; // ... index 2
seasons[3] = "Autumn"; // and finally, index 3
Teraz nazwy pór roku są zapisywane w czterech komórkach naszej tablicy. Tablicę można zainicjować w inny sposób, łącząc deklarację i inicjalizację:

String[] seasons = new String[] {"Winter", "Spring", "Summer", "Autumn"};
Co więcej, operator new może zostać pominięty:

String[] seasons = {"Winter", "Spring", "Summer", "Autumn"};

Jak wyświetlić tablicę na ekranie w Javie?

Elementy tablicy można wyświetlać na ekranie (np. na konsoli) za pomocą pętli for. Inny, krótszy sposób jej wyświetlania zostanie omówiony w akapicie zatytułowanym „Przydatne metody do pracy z tablicami”. W międzyczasie warto przyjrzeć się przykładowi, w którym tablica wyświetlana jest za pomocą pętli:

String[] seasons = new String {"Winter", "Spring", "Summer", "Autumn"}; 
for (int i = 0; i < 4; i++) {
System.out.println(seasons[i]); 
}
Program wyświetli następujące informacje:

Winter 
Spring 
Summer 
Autumn

Tablice jednowymiarowe i wielowymiarowe w Javie

Lecz co zrobić, jeśli chcemy utworzyć nie tablicę liczb, ciągów lub innych obiektów, ale tablicę tablic? Java pozwala to zrobić. Rodzaj tablicy, który już znamy (int[] myArray = new int[8]) nazywamy jednowymiarową. Natomiast tablica złożona z innych tablic nazywana jest dwuwymiarową. To tak jak w tabeli, która ma numer wierszy i kolumn. Jeśli znasz podstawy algebry liniowej, możesz myśleć o tym jak o macierzy. Tablice w Javie - 4Dlaczego potrzebujemy takich tablic? Otóż do programowania macierzy i tabel, a także innych obiektów o podobnej strukturze. Na przykład szachownica może być reprezentowana przez tablicę 8x8. Tablica wielowymiarowa jest deklarowana i tworzona w następujący sposób:

Int[][] myTwoDimentionalArray = new int[8][8];
Ta tablica ma dokładnie 64 elementy: myTwoDimentionalArray[0][0], myTwoDimentionalArray[0][1], myTwoDimentionalArray[1][0], myTwoDimentionalArray[1][1] i tak dalej aż do myTwoDimentionalArray[8][8]. Jeśli więc użyjemy jej do przedstawienia szachownicy, to A1 odpowiada myTwoDimentionalArray[0][0], natomiast E2 myTwoDimentionalArray[4][1]. Ale jak daleko możemy to posunąć? W Javie można określić tablicę tablic... tablicę tablic tablic i tak dalej. Oczywiście trójwymiarowe i wielowymiarowe są używane bardzo rzadko. Można jednak użyć tablicy trójwymiarowej do zaprogramowania na przykład kostki Rubika.

Przydatne metody do pracy z tablicami

Java posiada klasę java.util.Arrays służącą do pracy z tablicami. Najczęstsze operacje wykonywane na tablicach to inicjalizacja (wypełnianie elementami), pobieranie elementu (według indeksu), sortowanie i wyszukiwanie. Wyszukiwanie i sortowanie informacji zawartych w tablicach to tematy na inny dzień. Z jednej strony dobrą praktyką jest samodzielne napisanie kilku algorytmów dotyczących tych zagadnień. Z drugiej strony, wszystkie najlepsze algorytmy zostały już zaimplementowane i włączone do standardowych bibliotek Javy, więc można z nich legalnie korzystać. Oto trzy przydatne metody tej klasy.

Sortowanie tablicy

Metoda void sort(int[] myArray, int fromIndex, int toIndex) sortuje tablicę lub podtablicę liczb całkowitych w porządku rosnącym.

Wyszukiwanie elementu w tablicy

int binarySearch(int[] myArray, int fromIndex, int toIndex, int key). Ta metoda szuka elementu key w posortowanej tablicy lub podtablicy myArray, od fromIndex do toIndex. Jeśli element zostanie znaleziony, zwracany jest jego indeks. W przeciwnym razie zwraca (-fromIndex)-1.

Konwersja tablicy na ciąg

Metoda String toString(int[] myArray) konwertuje tablicę na ciąg. W Javie tablice nie nadpisują toString(). Oznacza to, że jeśli spróbujesz wyświetlić całą tablicę naraz (System.out.println(myArray)) zamiast po jednym elemencie, jak w akapicie zatytułowanym „Wyświetl tablicę na ekranie”, otrzymasz nazwę klasy i szesnastkowy hash tablicy (zdefiniowany przez Object.toString()). Jeśli dopiero zaczynasz przygodę z językiem Java, możesz nie zrozumieć wyjaśnienia dotyczącego metody toString. Początkowo nie jest to konieczne, ale użycie tej metody ułatwia wyświetlanie tablicy. Java pozwala w prosty sposób wyświetlić tablicę bez użycia pętli. Pokazano to na poniższym przykładzie.

Przykład użycia sort, binarySearch i toString

Utwórzmy tablicę liczb całkowitych, wyświetlmy ją za pomocą metody toString, posortujmy ją za pomocą metody sort, a następnie znajdźmy w niej pewną liczbę.

class Main {
    public static void main(String[] args) {
        int[] array = {1, 5, 4, 3, 7}; // Declare and initialize the array
        System.out.println(array); // Try to display our array without using the toString method — the result is a hexadecimal number
        System.out.println(Arrays.toString(array)); // Display the array correctly 
        Arrays.sort(array, 0, 4); // Sort the entire array from the zeroth to the fourth element
        System.out.println(Arrays.toString(array)); // Display the sorted array
        int key = Arrays.binarySearch(array, 5); // Look for the number 5 in the sorted array. 
        // The binarySearch method will return the index of the array element we are searching for
        System.out.println(key); // Display the index of the number we searched for 
System.out.println(Arrays.binarySearch(array, 0)); // Now try to find a number that isn't in the array, 
        // and immediately display the result

    }
}

[I@1540e19d 
[1, 5, 4, 3, 7] 
[1, 3, 4, 5, 7] 
3 
-1
Pierwszy ciąg jest próbą wyświetlenia tablicy bez użycia toString. Drugi to tablica wyświetlana za pomocą toString. Trzecim natomiast jest tablica posortowana. Czwarty to indeks szukanej liczby (5) w posortowanej tablicy (pamiętaj, że liczymy od zera, więc indeksem jej czwartego elementu jest 3). W piątym ciągu widzimy -1. Jest to jednak nieprawidłowy indeks. Sygnalizuje, że szukana liczba (w tym przypadku 0) nie znajduje się w tablicy.

Tablice w pigułce:

  • Podstawowe cechy tablicy: typ umieszczonych w niej danych, jej nazwa i długość.
    Ostatnia właściwość jest określana w momencie tworzenia tablicy (gdy przydzielana jest dla niej pamięć). Pierwsze dwie właściwości są określane podczas deklaracji tablicy.

  • Rozmiar tablicy (liczba komórek) musi być typu int

  • Nie można zmienić długości tablicy po jej utworzeniu.

  • Dostęp do elementu tablicy można uzyskać za pomocą jego indeksu.

  • Elementy w tablicach, jak wszystko inne w Javie, są numerowane zaczynając od zera.

  • Po utworzeniu tablicy jest ona wypełniana wartościami domyślnymi.

  • Tablice w Javie nie są takie same jak w języku C++. Są one prawie jak wskaźniki tablic dynamicznych.

Tablice w Javie - 5

Przydatne materiały o tablicach

Chcesz dowiedzieć się więcej o tablicach? Sprawdź poniższe artykuły. Znajduje się tam wiele interesujących i przydatnych materiałów na ten temat.
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION