TABLICE W JAVIE
Załóż nowy projekt i nazwij jego główną klasę TestTablic. Od razu wykasuj z kodu wszelkie komentarze.
Tablicę tworzy się przez dodanie pary nawiasów kwadratowych do typu zmiennej, czyli na przykład:
int[] mojWektor = null;
lub po prostu
int[] mojWektor;
Jednak w tym momencie nie można dodawać elementów do tablicy. Dzieje się tak, ponieważ sama deklaracja
int[] mojWektor; nie rezerwuje miejsca w pamięci na tą tablicę. Takie coś jest dopiero odnośnikiem do tablicy,
czyli zawiera adres miejsca w pamięci gdzie znajdować się będą dane. To znaczy w tym momencie jeszcze nie
zawiera danych, bo został jej przypisany adres null, czyli brak adresu.
śeby tablica wskazywała na jakiś adres pamięci, trzeba użyć operatora new, który rezerwuje miejsce w pamięci i
zwraca jej adres. Czyli prawidłowe zarezerwowanie miejsca w pamięci na 5-elementową tablicę liczb całkowitych i
przypisanie jej do zmiennej będzie wyglądało tak:
int[] mojWektor = new int[5];
Operator new zwraca adres miejsca w pamięci, który jest przypisywany do zmiennej mojWektor. W tym
momencie można już normalnie korzystać z tablicy.
Każda tablica posiada dodatkową zmienną zawierającą ilość elementów w tej tablicy. Nazywa się ona length.
Przykład użycia:
for(int i=0;i<mojWektor.length; i++){
mojWektor[i] = 22+i*15;
System.out.println(mojWektor[i]);
}
Ćwiczenie: Umieść w funkcji main linijki:
int[] mojWektor = new int[5];
for(int i=0;i<mojWektor.length; i++){
mojWektor[i] = 22+i*15;
System.out.println(mojWektor[i]);
}
Jak można łatwo zauważyć, nie trzeba od razu podawać rozmiaru tablicy. Przypuśćmy, że chcemy najpierw
odczytać dane z pliku i dopiero, gdy już będziemy wiedzieli ile tych danych jest, możemy podać liczbę elementów
w tablicy. Jest ot bardzo przydatne – nie trzeba już używać list z dowiązaniami do przechowywania nieznanej
liczby danych.
Ćwiczenie: Przerób funkcję main następująco:
public static void main(String[] args) {
int[] mojWektor;
// w tym miejscu możemy odczytać ile jest danych w pliku
// np. 7 danych do przechowania w tablicy
int n = 7;
mojWektor = new int[n];
for(int i=0;i<mojWektor.length; i++){
mojWektor[i] = 22+i*15;
System.out.println(mojWektor[i]);
}
}
Ale to jest tylko jeden ze sposobów tworzenia tablic. Drugi to wypełnienie tablicy od razu wartościami. Robi się to
tak:
int[] mojWektor = { 1, 2, 3, 4, 5 };
Tablica mojWektor będzie wówczas zawierała 5 elementów.
Tablice mogą być także wielowymiarowe - dwu, trzy i więcej. Zmienną będącą dwuwymiarową tablicą liczb
całkowitych definiuje się tak:
int[][] dwuwymiarowa = new int[10][10];
Tak zdefiniowana tablica jest tablicą kwadratową - ma tyle samo wierszy, co kolumn. Trzeba pamiętać, że
pierwsza liczba jest ilością wierszy, a druga ilością kolumn.
Ilość wierszy uzyskuje się przez dwuwymiarowa.length a liczbę kolumn w danym wierszu uzyskuje się przez
dwuwymiarowa[numerWiersza].length.
mgr Agnieszka Patyk, Wydział FTiMS, Politechnika Gdańska, 2007
Ćwiczenie: Doklej w funkcji main linijki:
int[][] dwuwymiarowa = new int[7][6];
for(int i = 0; i < dwuwymiarowa.length ; i++){
for(int j = 0; j < dwuwymiarowa[i].length ; j++){
dwuwymiarowa[i][j] = i*j;
System.out.print(dwuwymiarowa[i][j]+" ");
}
System.out.println("");
}
Tablicę dwuwymiarową można zadeklarować także przez podanie wartości:
int[][] vec = {
{ 1, 2, 3},
{ 2, 3, 4},
{ 3, 4, 5},
{ 4, 5, 6}
};
Tablica wcale nie musi być kwadratem, czy prostokątem! Można także tworzyć też tablice „szarpane”:
int[][] vec = {
{ 1, 2 },
{ 2, 3, 4, 5 },
{ 3 }
};
Takie tablice są bardzo przydatne przy stosowaniu niektórych metod numerycznych.
Tablice można też tworzyć dwuetapowo. Pierwszym etapem będzie stworzenie tablicy odnośników na tablice:
int[][] vec = new int[10][];
Jak widać, vec jest już zdefiniowaną tablicą, ale nie jest tablicą dwuwymiarową, ponieważ nie został stworzony
drugi wymiar. Na razie jest to tablica 10 elementów, z których każdy jest odnośnikiem do miejsca w pamięci, w
którym znajdować się będzie tablica liczb całkowitych. Teraz, mając taką tablicę odnośników można każdemu
elementowi przypisać tablicę:
vec[0] = new int[10];
vec[1] = new int[5];
vec[2] = new int[1];
i tak dalej… Jak widać to też jest sposób na tworzenie tablic szarpanych.
Ćwiczenie: Stwórz tablicę szarpaną, w której każdy wiersz będzie losowej długości:
System.out.println("");
int[][] vec = new int[10][];
for(int i = 0; i < vec.length; i++){
vec[i] = new int[
(int)(Math.random()*10)
];
for(int j = 0; j < vec [i].length ; j++){
vec [i][j] = i*j;
System.out.print(vec [i][j]+" ");
}
System.out.println("");
}
W powyższych przykładach wszystkie tablice są tablicami liczb całkowitych, ale mogą to być tablice dowolnych
typów, np. liczb rzeczywistych czy Stringów a także własnych obiektów, np.:
Samochod[] tablicaAut = new Samochod[3];
tablicaAut[0] = new Samochod("Polonez",34234,9.0);
tablicaAut[1] = new Samochod("Maybach",4231,10.0);
tablicaAut[2] = new Samochod("Maluch",3423,0.1);
for(int i=0;i<tablicaAut.length;i++){
System.out.println(tablicaAut[i]);
}
mgr Agnieszka Patyk, Wydział FTiMS, Politechnika Gdańska, 2007