Tablice wielowymiarowe

W poprzednim wpisie zapoznaliśmy się z tablicami w Java. Dla uproszczenia zaczęliśmy od tablic jednowymiarowych w których to na danej pozycji przechowana jest tylko jedna wartość. Analogią takiej tablicy wykorzystaną w poprzednim wpisie jest lista obecności w dzienniku szkolnym, gdzie jednemu numerowi odpowiada jedna osoba. Taką jednowymiarową tablicę deklarujemy w następujący sposób:

Natomiast dostajemy się do danego elementu w następujący sposób:

Zauważ, że pierwszy element posiada numer zero. To tyle powtórzenia, czas na nowe rzeczy!

Więc co to jest ta tablica wielowymiarowa? Korzystając dalej z naszej analogii dziennika szkolnego, tablica wielowymiarowa odpowiada stornie z ocenami z danego przedmiotu. Na takiej stronie do jednego numeru przypisana jest lista ocen danej osoby z tego przedmiotu. Inaczej mówiąc na jednej pozycji przechowywanych jest wiele wartości.

Taka strona z ocenami jest przykładem tablicy dwuwymiarowej. Jest to zagnieżdżenie tablicy w tablicy. Zdeklarujmy tera taką tablicę dwuwymiarową:

Na pierwszy rzut oka możesz zauważyć drugą parę nawiasów kwadratowych za int[], właśnie ta dodatkowa prawa nawiasów dodaje dodatkowy wymiar do tablicy. Zapis int[][][] oznacza tablice trójwymiarową, natomiast int[][][][] czterowymiarową… i tak dalej. Zazwyczaj w programach Java spotyka się tablice jedno- bądź dwuwymiarowe.

Drugą rzeczą godną zauważenia jest to że wymiary nie muszą być jednakowe. Jak widzisz na powyższym przykładzie pierwszy wymiar posiada cztery elementy, drugi pięć natomiast trzeci ma tylko trzy elementy.

Żeby dostać się do dowolnego elementu tablicy wielowymiarowej należy podać pozycje w każdym wymiarze, tj. żeby dostać się do elementu o wartości zero w naszej tablicy scores należy napisać scores[1][2]. Dlaczego tak? Gdyż zero znajduje się na pozycji trzeciej w drugim wymiarze, pamiętając, że numeracja zaczyna się od zera, należy odjąć jeden od każdej wartości.

Jeszcze kilka słów o deklaracji tablic wielowymiarowych. Otóż przy deklaracji najważniejszy jest rozmiar pierwszego wymiaru tj. rozmiar pierwszej tablicy, najważniejszy jest on dlatego, że nie może on zostać potem zmieniony. Jeżeli w momencie deklaracji znasz rozmiary wszystkich wymiarów np.:

zadeklaruje nam tablicę ciągów znakowych (tekstów) o wymiarze dwa na dwa. Jeżeli nie znasz rozmiarów kolejnych wymiarów lub rozmiary w danym wymiarze nie są jednakowe, nie ma problemu możesz potem ręcznie zadeklarować każdy element tablicy wielowymiarowej:

Powyższy fragment kodu zadeklaruje nam tablicę dwuwymiarową pod nazwą example2, elementami tablicy są zmienne typu String. Następnie w linii drugiej przypisujemy do pierwszego elementu tej tablicy tablicę o rozmiarze dwa, natomiast w linii trzeciej do drugiego elementu przypisujemy tablicę o rozmiarze trzy. W rezultacie otrzymujemy zmienną o dwóch wymiarach, pierwszy z nich ma dwa elementy, natomiast w drugim wymiar nie ma stałego rozmiaru.

To tyle jeżeli chodzi o tablice wielowymiarowe. Jeżeli masz jakieś pytania lub wątpliwości zachęcam do umieszczenia ich w komentarzach pod tym wpisem.

W kolejnym wpisie zajmiemy się praktycznym zastosowaniem tablic wielowymiarowych.

Używanie tablic w Java

W poprzednim wpisie zapoznaliśmy się wstępnie z teorią zmiennych tablicowych w Java. Jeżeli nie wiesz czym są tablice w Java, warto żebyś tam spojrzał.

Dziś zajmiemy się wykorzystaniem zmiennych tablicowych. Najpierw warto przypomnieć jak wygląda deklaracja tablicy w Java.

Powyższy fragment kodu deklaruje zmienną o nazwie names typu String. Warto tutaj od razu zauważyć, że nazwa tej zmiennej jest rzeczownikiem w liczbie mnogiej; otóż wszystkie zmienne tablicowe w Java zgodnie z konwencją zwykło się właśnie nazywać w liczbie mnogiej. Nasza tablic names, została od razu zainicjalizowana trzema elementami:

  1. ala
  2. magda
  3. kasia

Elementy te będą dostępne w kolejnych komórkach tablicy pod numerami: 0, 1, 2. Ponieważ nasza tablica została od razu zainicjalizowana wartościami nie musimy podawać jej rozmiaru (ilości elementów które pomieści). W takim wypadku JVM sam policzy liczbę elementów i ustawi rozmiar tablicy na trzy.

W przypadku kiedy nie znamy elementów tablicy musimy posłużyć się trochę innym zapisem:

W tym wypadku zmienna users będzie zawierać pustą dziewięcioelementową tablicę. Elementy tej tablicy mogą zostać przypisane później ale o tym za chwilę.

Przyjrzyjmy się jeszcze jednemu przykładowi:

Cóż to jest za dziwny stwór? Otóż zmienna examples jest pustą tablicą, nie zawierającą żadnych elementów, nie można też do niej nic przypisać gdyż zawiera ona zero miejsc na zapisanie danych. Zmienna ta jest praktycznie bezużyteczna.

Dobrze, to jak przypisać wartość do danego elementu tablicy? Bardzo prosto, spójrz na poniższy przykład:

Obie zmienne names będą takie same. Z tym, że w tym przykładzie dokładnie widzimy jak przypisać wartość do danego miejsca w tablicy. Wykorzystywane do tego celu ponownie są nawiasy kwadratowe ([]), tym razem w ich wnętrzu podajemy numer pod którym chcemy zapisać daną wartość. UWAGA! w tym momencie liczymy od ZERA, a nie od jedynki (tak jak to widać na powyższym przykładzie), natomiast podając rozmiar tablicy (new String[3];) liczymy od JEDNEGO.

Oczywiście do jednej pozycji w tablicy można przypisać wartość wielokrotnie. W takim wypadku ostatnia przypisana wartość jest zapamiętywana, np.:

W takim wypadku ostatnim elementem tablicy names będzie wartość zosia.

Jak to sprawdzić? Trzeba by odczytać co znajduje się na danym miejscu w tablicy. Jak to zrobić? Tak samo jak z zapisywaniem:

Na ekranie wyświetli się: zosia. Takie to proste :)

Rzadko kiedy będziesz w sytuacji w której będziesz dokładnie znał rozmiar tablicy. Zazwyczaj jest tak że jej rozmiar ustalany jest dynamicznie w programie. Jak to się robi?

W tym momencie zmienna values będzie zawierała pięcioelementową tablicę. Jak widzisz rozmiar tablicy może pochodzić z innej zmiennej, może również być obliczony w trakcie działania programu np. na podstawie danych otrzymanych od użytkownika.

Skoro tablica może być dowolnych rozmiarów to jak pobrać drugi element od końca? Do takich zadań służy specjalna właściwość tablicy zwana length, zawiera ona informację o rozmiarze właśnie tej tablicy. Więc problem wyświetlenia drugiego elementu od końca jest prosty do rozwiązania:

Jak zatem wypisać wszystkie elementy z tablicy? Wystarczy do tego wykorzystać length oraz pętlę for:

W bardzo podobny sposób można wypisać również wszystkie elementy tablicy:

To tyle na dziś! Jeżeli coś jest nie jasne, bądź czegoś nie rozumiesz napisz mi o tym w komentarzach!

Tablice w Java

Nadszedł najwyższy moment żeby zapoznać się ze zmiennymi tablicowymi w Java. Jakiś czas tamu poznałeś już podstawowe typy proste oraz typ String, następnym krokiem są właśnie tablice!

Zanim przejdziemy jednak do opisu tablic w Java przypomnijmy sobie czasy szkolne. Konkretnie, chcę nawiązać do dziennika lekcji obecnego w każdej szkolnej klasie. Każdy dziennik zawierał uporządkowaną alfabetycznie listę uczniów. Lista ta nadawała nie jako każdemu uczniowi unikalny numer, który czasem był używany do wywoływania do tablicy lub odpowiedzi (“Numer osiem, Gruca do tablicy!“). Jak już wspomniałem kolejność uczniów zazwyczaj była alfabetyczna, ustalana raz na początku roku szkolnego. Jeżeli zdarzyło się, że do danej klasy dochodził nowy uczeń w ciągu roku, to dostawał on pierwszy wolny numer (dopisywany był na końcu listy). Każdy z nas powinien wiedzieć jak to działa…

Read On…

Konwersja typu String do wartości liczbowych

Dopełniając wiedzę na temat typu String zajmiemy się dzisiaj konwersją z tego typu do poznanych wcześniej typów:

  • int
  • long
  • short
  • float
  • double

W poprzednim wpisie omówiona została kwestia łączenia Stringów (konkatenacja) oraz konwersja wyżej wymienionych typów zmiennych do typu String.

Dla szybkiego przypomnienia. W Java Stringi łączy się za pomocą operatora + (plus):

Powyższy kod spowoduje, że w zmiennej sentence znajdzie się ciąg: Ala ma kota!.

Natomiast żeby zamienić dowolny typ liczbowy na typ String posłużyć się następującym kodem:

JVM zamieni nam posłusznie obie podane liczby na typ String.

Po tym krótkim przypomnieniu możemy przejść do sedna tego postu, a mianowicie jak dokonać operacji odwrotnej tj. z typu String uzyskać typ liczbowy?

Przede wszystkim musimy mieć pewność że dany ciąg znakowy zawiera odpowiednią wartość. Co przez to rozumiem? Na przykład to, że w Stringu który będziemy konwertować nie ma liter oraz to że w momencie konwersji do typu int nasz wejściowy ciąg znaków nie zawiera kropki która to oddziela część całkowitą od ułamkowej. Co się w takiej sytuacji stanie? Otóż JVM się na nas trochę obrazi i rzuci wyjątkiem… wyjątkami dokładniej później.

Napiszmy teraz program który doda nam dwie liczby:

Po uruchomieniu tego programu na ekranie zobaczymy napis: Wynikiem dodania 2 do 3 jest 5.

Najciekawszą rzeczą w tym programie jest linia piąta. W której to konwertujemy dwa Stringi do typu int używając wywołania: Integer.valueOf().

A co w przypadku innych typów niż int? Dla pozostałych typów istnieją analogiczne wywołania:

Dostrzegasz analogię? Każdy typ liczbowy w Java posiada odpowiednik pisany z dużej litery na którym można wywołać statyczną metodę valueOf z typem String jako parametr. Metoda ta skonwertuje podany argument do żądanej wartości liczbowej.

Ale dlaczego muszę napisać Integer.valueOf zamiast po prostu int.valueOf lub Float.valueOf zamiast float.valueOf? Cóż, żeby odpowiedzieć na to pytanie musimy poznać trochę dokładniej javę. Niestety na razie musisz to przyjąć jako prawdę objawioną. W jednym z kolejnych wpisów wyjaśnię Tobie dlaczego tak właśnie jest.

Jak łączyć ze sobą ciągi znaków (String) w Java

W poprzednim wpisie poznaliśmy typ String. Wiesz już, że tekst pomiędzy podwójnymi cudzysłowami w Java jest właśnie typu String. Wiesz też jak zdeklarować zmienną tego typu oraz jak wypisać jej zawartość na ekranie… Ale co zrobić żeby dokleić “coś” to istniejącego już ciągu znaków? Lub jak połączyć istniejące ciągi znaków?

Read On…