10. JAVA – tablice


Tablica w Javie to uporządkowany zbiór elementów jednego typu, funkcjonujący jako zmienna obiektowa.
Inicjując tablicę określamy jej długość, która pozostaje niezmienna.
Elementy tablicy są umieszczane w kolejnych polach zwanych indeksami lub kluczami.
Indeksy możemy przyrównać do „nagłówków” poszczególnych pól, wyrażonych liczbami, których zakres rozpoczyna się zawsze od „0”

Wadą tablic jest ustalona odgórnie ich wielkość, która jest niezmienna oraz ograniczona ilość metod np. do przeszukiwania czy czyszczenia tablicy.
Rozszerzone funkcjonalności posiadają kolekcje, o których będziemy mówili trochę później.

Inicjowanie tablic

Tablicę deklarujemy podając typ danych, który będzie przechowywała, następnie nawiasy kwadratowe [] i nazwa
Nawiasy [] – mogą znajdować się po typie lub nazwie, jednak zwykło się je umieszczać w Javie po zadeklarowanym typie

//deklaracja tablicy typu int

int [] intTable = new int[4]; // gdzie 4 oznacza wielkość tablicy (rozmiar/długość)

pozostałe typy tablic:
byte[] byteTable
short[] shortTable
long[] longTable
float[] floatTable
double[] doubleTable
boolean[] booleanTable
char[] charTable
String[] StringTable

//przykład deklaracji pozostałych typów tablic
String[] strings = new String[] {"x", "y", "z"};
float[] floats = new float[] {11.11f, 21.22f, 31.33f};
char[] chars = new char[] {'a', 'b', 'c'};

Rozmiar tablicy możemy określać poprzez zadeklarowanie go jako np. stałej:

final int ARR_LEN = 5; // Deklaracja stałej
int[] array = new int[ARR_LEN];

Przypisywanie wartości do tablicy

//przypisanie wartości do konkretnego indeksu

intTable[0] = 10;
intTable[1] = 11;
intTable[2] = 12;
intTable[3] = 13;
System.out.println(
intTable[0] + ", " +
intTable[1] + ", " +
intTable[2] + ", " +
intTable[3] + ", "
);


//przypisanie wartości podczas deklaracji

String[] StringTable = new String[]{"jeden", "dwa", "trzy", "cztery"};
System.out.println(
StringTable[0] + ", " +
StringTable[1] + ", " +
StringTable[2] + ", " +
StringTable[3] + ", "
);


//int[] test = new int[]; //generuje błąd: array dimension missing - musimy podać rozmiar

int[] test = new int[3]; //jeżeli nie przypiszemy wartości automatycznie uzupełni się int [0,0,0]

String[] test1 = new String[3]; //jeżeli nie przypiszemy wartości automatycznie uzupełni się String [null,null,null,null]

Przekształcamy tablicę znaków na String

char[] tbl = new char[] {'J', 'A', 'V','A'};

//możemy przekształcić tablicę znaków na String
String napisZtablicy = new String(tbl);
System.out.println(napisZtablicy);

Sprawdzamy długość tablicy – length

System.out.println(StringTable.length);

Tworzymy tablice wielowymiarowe

int[][] multiArray = new int[][] {
{1,2,3},/*to jest w index 0 pierwszego []*/
{4,5,6},/*to jest w index 1 pierwszego []*/
{7,8,9}/*to jest w index 2 pierwszego []*/
};
System.out.println(multiArray[0][0]);//pierwszy wiersz, pierwsza kolumna
System.out.println(multiArray[2][1]);//trzeci wiersz, druga kolumna

//tablicę mozemy tworzyć z innych tablic
//zwróćcie uwagę, że nie muszą mieć tych samych rozmiarów
int[][] multiArrFromArr = new int[][]{test,{1,1,1,1}};//tablice różnych długości
System.out.println(multiArrFromArr[0][2]);//0
System.out.println(multiArrFromArr[1][3]);//1
System.out.println(multiArrFromArr[1][1]);//1

System.out.println(multiArrFromArr[0].length);
System.out.println(multiArrFromArr[1].length);
//spróbujcie sobie wyobrazić konstrukcję tablic 3 i 4ro wymiarowych

Wyświetlamy tablicę za pomocą toString

int[] dane = {2,3,4,5,7};

//korzystamy z klasy Arrays - należy ją zaimportować ->import java.util.Arrays;
System.out.println(Arrays.toString(dane));

Wypełniamy tablicę jedną wartością

int [] oneValue = new int[5];
Arrays.fill(oneValue, 2);
System.out.println("Wypełnienie jedną wartością: " + Arrays.toString(oneValue));

Porównujemy tablice – equals i compare

int[] a = {1,2,3};
int[] b = {1,2,3};
System.out.println("Wynik działania equals: " + Arrays.equals(a, b));
System.out.println("Wynik działania compare: " + Arrays.compare(a,b));

Dzielimy tekst na tablicę – split i toCharArray

//Split - zwraca tablicę dzieląc tekst wg zadanego znaku
String text1 = "Tekst do podziału wg spacji.";
String [] textArr = text1.split(" ");
System.out.println(textArr[0]);
System.out.println(textArr[1]);
System.out.println(textArr[2]);
System.out.println(textArr[3]);
System.out.println(textArr[4]);

// toCharArray - zwraca tablicę znaków typu char
char[] charArr = text1.toCharArray();
System.out.println(charArr);
System.out.println(Arrays.toString(charArr)); // wyświetlanie jako łańcucha

Kopiujemy tablice

//kopiowanie tablic
int[] tbl_a = new int[] {9, 5, 2};

/*
PRZYPISANIE
UWAGA! przypisanie jest równoznaczne z referenencją - nie tworzy nowej tablicy
każda zmiana na tablicy, która ma przypisanie - powoduje zmianę w tablicy przypisywanej
tak jak poniżej
*/

int[] tbl_b = tbl_a;
System.out.println("tbl_a przed zmianą: " + Arrays.toString(tbl_a));
System.out.println("tbl_b przed zmianą: " + Arrays.toString(tbl_b));
tbl_b[0] = 0;
System.out.println("tbl_a po zmianie: " + Arrays.toString(tbl_a));
System.out.println("tbl_b po zmianie: " + Arrays.toString(tbl_b));

/*
copyOf - wykonuje kopię w zależności od parametrów
*/

int[] tbl_c = Arrays.copyOf(tbl_a, tbl_a.length);
System.out.println("tbl_a przed zmianą: " + Arrays.toString(tbl_a));
System.out.println("tbl_c przed zmianą: " + Arrays.toString(tbl_c));
tbl_c[1] = 0;
System.out.println("tbl_a po zmianie: " + Arrays.toString(tbl_a));
System.out.println("tbl_c po zmianie: " + Arrays.toString(tbl_c));

int[] tbl_d = Arrays.copyOf(tbl_a, 1); //możemy podać krótszą wartość
System.out.println("tbl_d skopiowane nie wszystkie elementy: " + Arrays.toString(tbl_d));

int[] tbl_e = Arrays.copyOf(tbl_a, 5); //możemy podać dłuższą wartość
System.out.println("tbl_e skopiowane więcej elementów: " + Arrays.toString(tbl_e));

Sortujemy tablice

/*
SORTOWANIE
Klasa arrays zawiera metodę sorowania rosnąco, nie ma jednak metody do sortowania malejąco.
W tej drugiej sytuacji musimy skorzystać z kolekcji.
*/

char[] tbl_notsorted = new char[] {'y', 'b', 'a','z'};
System.out.println("Tablica przed sortowaniem: " + Arrays.toString(tbl_notsorted));
Arrays.sort(tbl_notsorted); //sortowanie rosnąco
System.out.println("Posortowana tablica: " + Arrays.toString(tbl_notsorted));

//sortowanie malejąco z wykorzystaniem kolekcji (o nich samych w innym temacie)
Character [] tblCharacter = {'y', 'b', 'a','z'};
Arrays.sort(tblCharacter, Collections.reverseOrder());
System.out.println("Sortowanie w porządku malejącym: " + Arrays.toString(tblCharacter));

Inicjujemy tablicę z losowymi liczbami i sortujemy tablicę

import java.util.Arrays;
import java.util.Random;

class Tb{
//inicjujemy tablicę
int[] tab = new int[5];

//tworzymy metodę wypełniającą tablicę
public void wypelnij(){
Random rnd = new Random();
System.out.println("Wypełniona tablica: ");
for (int i=0;i<5;i++){
tab[i] = rnd.nextInt();
System.out.println(tab[i]);
}
}
public void sortuj(){
System.out.println("Posortowana tablica: ");
Arrays.sort(tab);
for (int t:tab) {
System.out.println(t);
}
}
}

public class RandomExample {
public static void main(String[] args) {
Tb newTable = new Tb();
newTable.wypelnij();
newTable.sortuj();
}
}

Ćwiczenia:

  1. Zadeklaruj dwie tablice, jedną o długości 10, a drugą o długości 11. Wypisz co drugi element każdej z tablic.
  2. Zadeklaruj dowolną tablicę i wypełnij ją liczbami, następnie znajdź największą i najmniejszą wartość w tablicy.
  3. Napisz skrypt, który sprawdzi, czy podany element znajduje się w zadeklarowanej tablicy (możesz wykorzystać tablicę z poprzedniego zadania).
  4. Zadeklaruj dowolną tablicę i wypełnij ją liczbami, następnie wyświetl tylko liczby parzyste.
  5. Napisz skrypt, który pobierze od użytkownika:
    • czy użytkownik chce wprowadzać liczby, czy ciągi znaków
    • liczbę elementów jakie chce wprowadzić np. 5,
    • następnie zapyta użytkownika o te elementy rozdzielane przecinkami np. „podaj elementy rozdzielane przecinkami: „

Na podstawie otrzymanych danych stwórz tablicę, posortuj ją rosnąco.