Tablice

Po ostatnich zmaganiach z tworzeniem warunków logicznych i używania instrukcji warunkowy i sterujących czas na nowe zagadnienie. Nadszedł czas na tablice.

Czym są tablice?

Tablice to zbiór wielu zmiennych jednego typu – można wyobrazić sobie ją jaką wielką szafę z dużą ilościa szuflad, do których się odwołujemy przez nazwę szafy i numer szuflady. Bez sensem byłoby nazywać sto szuflad, skoro można je ponumerować.

Dodatkowym założeniem jest to, że we wszystkich szufladach przechowujemy rzeczy (wartości) tego samego typu. Nie możemy mieć szafy (tablicy) na imiona i wagę – te typy po prostu się różnią.

Jeżeli wiemy czym teoretycznie jest tablica to czas na jej deklarację i inicjalizację.

Tablice

Tak jak w przypadku zmiennych tablicę możemy zadeklarować i zainicjalizować – ze względu, że to jest coś innego niż taka zwykła zmienna to i deklaracja musi się nieco różnić.

Deklaracja

Do deklaracji tablicy używamy dododatkowo nawiasów kwadratowych – schemat wygląda tak:

typ-zmiennych-tablicy [] nazwa_tablicy;

I w taki o to sposób możemy zadeklarować tablicę – zróbmy to dla liczb całkowitych int.

int [] values;

Jednak podczas deklaracji jeszcze nie wiadomo jak duża ta całą szafa będzie – to musimy zrobić podczas inicjalizacji.

Inicjalizacja

Tablicę – tak samo jak obiekty np. Scanner – inicjalizujemy przy użyciu słowa kluczowego new.

Schemat inicjalizacji wygląda tak:

typ-zmiennych-tablicy [] nazwa-tablicy = new typ-zmiennych-tablicy[rozmiar-tablicy];

Operator new na nasze życzenie tworzy właśnie tablicę o określonym typie i o określonym rozmiarze – zwraca nam on zarezerwowany obszar pamięci na tą tablicę (a dokładniej jej adres), a my przypisujemy go do naszej utworzonej tablicy. Tak po krótce wygląda etap tworzenia tablicy.

Zainicjalizujmy sobie tablicę na 10 wartości.

int [] values = new int[10];

I teraz w szafie (tablicy) values mamy 10 szufladek, do których możemy się odwoływać w następujący sposób:

values[0] = 3;
values[4] = 4;
values[9] = 10;

Liczby w nawiasach kwadratowych to indeksy, które są własnie numerami szufladek – zawsze zaczynamy od 0!

Indeksowanie

Nadszedł czas na ciekawe zagadnienie – indeksowanie (numerowanie) szufladek w tablicy.

Trzeba zapamiętać jedną zasadę: w programowaniu tablice są indeksowane od 0 do n – 1. Co to oznacza?

Skoro zainicjalizowaliśmy 10 miejsc w tablicy – czyli nasze n jest równe 10 – to nasze szufladki znajdują się pod indeksami od numeru 0 do 9. Próbując się dostać do elementu pod indeksem 10 otrzymamy błąd!

Inicjalizacja v2

Tablicę możemy zainicjalizować jeszcze w inny sposób – nie podając rozmiaru tablicy, lecz wszystkie elementy, jakie chcielibyśmy w niej zawrzeć.

int [] newValues = {1, 8, 4, 5, 6};

Jak widać mamy 5 elementów, więc indeksowanie jest od 0 do 4. Wypiszmy wszystkie elmenty na ekran konsoli.

int [] newValues = {1, 8, 4, 5, 6};
System.out.println(newValues[0]);
System.out.println(newValues[1]);
System.out.println(newValues[2]);
System.out.println(newValues[3]);
System.out.println(newValues[4]);

W taki o to sposób wypisywały nam się wszystkie wartości tablicy.

1
8
4
5
6

Oczywiście wszystkie wartości tablicy możemy bez problemu edytować.

Length

Tablice dostarczają nam ciekawą możliwość, która może się z pewnością przydać m.in. w kolejnych lekcjach – jest to length.

length jak sama nazwa wskazuje zwraca nam długość – długość tablicy – czyli liczbę jej zainicjalizowanych elementów. Warto podkreślić – zainicjalizowanych.

Nawet jeżeli druga połowa tablicy nie ma przypisanych wartości to one nadal fizycznie są zarezerwowane w pamięci i length weźmie je pod uwagę.

Stwórzmy sobie ponownie kolejną tablicę – tym razem liczb zmiennoprzecinkowych.

float [] weights = {55.4f, 64.2f, 43.9f, 94.0f, 90.2f, 78.3f };

I teraz możemy sprawdzić liczbę elementów w tablicy:

System.out.println("Liczba wag w tablicy: "+weights.length);

Po uruchomieniu programu otrzymamy wtedy:

Liczba wag w tablicy: 6

Tablice wielowymiarowe

O ile w pierwszym przypadku stworzyliśmy wspólnie tablice jednowymiarowe – to w programowaniu możemy tworzyć tablicę wielowymiarowe – choć my stworzymy tylko tablicę dwuwymiarową.

Inicjalizacja takiej tablicy wygląda nastepującą:

typ [][] nazwa-tablicy = new typ [rozmiarPierwszejTablicy][rozmiarDrugiejTablicy];

Dlaczego napisałem rozmiarPierwszejTablicy oraz rozmiarDrugiejTablicy? Ponieważ tablice dwuwymiarowe to tak naprawdę tablice tablic itd. – przejdźmy lepiej do przykładu.

Stwórzmy tablicę dwuwymiarową z pozycjami na planszy 2d – pierwszy index będzie mógł odpowiadać za pozycję X, drugi zaś za pozycję Y – taka tablica może się przydać m.in. do symulowania planszy gry 2d np. szachów.

int [][] positions = new int[8][8];

I takim o to sposobem stworzyliśmy tablicę dwuwymiarową 8×8 – łącznie mając do wykorzystania 64 komórki.

Gdybyśmy mieli je wszystkie wypełniać ręcznie to byłoby to samobójstwo – wypełnimy ich tylko kilka na próbę. W następnej lekcji pokażę Ci jak wypełnić je wszystkie w szybki sposób.

Wypełnijmy kilka z nich:

positions[0][0] = 3;
positions[1][0] = 4;
positions[0][1] = 7;
positions[7][7] = 18;

Tak jak wspomniałem o tablicy dwuwymiarowej musimy myśleć jak o tablicy tablicy – jeżeli zakumasz już  tablice jednowymiarowe to tablice wielowymiarowe są tylko ich rozszerzeniem.

Jak na razie tyle teorii Ci wystarczy, wrócimy do tablic w następnej lekcji.

Podsumowanie

W tej lekcji poznałeś tablice – czyli miejsca, w których możemy przechowywać n zmiennych. Najważniejszym zagadnieniem tej lekcji było indeksowanie – pamiętaj, że tablice są indeksowane od 0 do n-1! 

Tablice dwuwymiarowe nie są niczym innym niż tablicami tablic – mogą się przydać, gdy chcemy np. zasymulować planszę gry 2d – wtedy tablica dwuwymiarowa jest idealna do odwzorowania sytuacji na planszy.

Przygotowałem dla Ciebie trzy krótkie zadania, które pomogą Ci przyswoić zagadnienie tablic.

  1. Stwórz tablicę na 3 imiona, którą wypełnisz imionami podanymi przez użytkownika. Na koniec wyświetl je wszystkie.
  2. Zainicjalizuj tablicę 5 liczb, następnie wymnóż wszystkie te liczby i wypisz na ekran konsoli.
  3. Zainicjalizuj tablicę dwuwymiarową 3×3, wypełnij ją całą liczbami i na koniec wyświetl sumę wszystkich liczb na ekran konsoli.

Rozwiązania do zadań możesz znaleźć tutaj.

Zadania mogą wydawać się nurzące – w końcu tyle trzeba pisać ręcznie podczas obliczania wartości – jednak w następnej lekcji o pętlach pokażę Ci jak to zrobić w kilku linijkach!

 

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
3 komentarzy
najstarszy
najnowszy oceniany
Inline Feedbacks
View all comments
Maciej Wawrzyniak
Maciej Wawrzyniak
5 lat temu

Witam, mam pewien problem z zadaniami. Rozwiązałem drugie i trzecia ale pierwszego za cholery nie mogę zrozumieć. Wyskakuje mi błąd: Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: 25
at Zad1.main(Zad1.java:12)

a kod wygląda następująco:

import java.util.Scanner;

public class Zad1 {
public static void main(String[] args) {
String names;
String tab[] = new String[25]; //Stworzenie tablicy na imiona
Scanner scanner = new Scanner(System.in);
names = scanner.nextLine(); // Wczytanie imion do zmiennej names
tab[25] = names; // dodanie do tablicy imion
System.out.println(“Imiona: “+tab);

}
}

Czekam na pomoc 😉 Pozdrawiam!

Kamil Klimek
Kamil Klimek
5 lat temu

Cześć Maciej, już staram Ci się pomóc.

W pierwszym zadaniu naszym celem jest wczytanie trzech imion, zapisanie ich do tablicy, a na końcu musimy je wyświetlić.
Pierwszym krokiem będzie stworzenie tablicy – wystarczy tylko na 3 imiona – nie musisz tworzyć aż na 25.
Następnie w pętli (3 razy) musisz poprosić o podanie imienia od użytkownika.
Na koniec w kolejnej pętli musisz wyświetlić wszystkie imiona – warto użyć pętli foreach.

Twój kod pozwala na wczytanie imion za “jednym zamachem” do jednej zmiennej. Nie o to chodziło, chodziło o to, aby każde imię wczytać osobno i każde imię zapisać do osobnej komórki w tablicy. W swoim kodzie starasz się przypisać wszystkie imiona do JEDNEJ komórki – robisz to w linii tab[25] = names.

Dodatkowo w linii tab[25] = names masz właśnie błąd: “ArrayIndexOutBoundsException”, który mówi że wyszedłeś poza zakres tablicy. Przejrzyj jeszcze raz akapit o indeksowaniu tablic.

Pamiętaj, że zawsze uzyskasz szybciej odpowiedź pytając na grupie fb: https://www.facebook.com/groups/519188538511913/?ref=bookmarks

Maciej Wawrzyniak
Maciej Wawrzyniak
5 lat temu
Reply to  Kamil Klimek

ooo dziękuje bardzo za odpowiedź :D! Biorę się do roboty :)!

3
0
Would love your thoughts, please comment.x