Java:Coś przydatnego

Skoro wytrzymałeś dwie pierwsze części, to idzie ci świetnie, młody Zakonniku Klawiatury. Rezygnacja jest drogą dla słabych, a więc wytrzymaj jeszcze trochę, to zdasz u Idzika.

Teraz nauczę cię takich technik jak używanie jednej zmiennej do przechowywania wielu wartości czy używanie pakietów.

## Tablice

Czasami zdarza się, że jako pierdoła nie możesz sobie poradzić z zapamiętaniem listy zakupów. Co można zrobić w tej sprawie? Oczywiście można napisać program, w którym zapiszesz sobie wszystko! Bardzo praktyczne, nieprawdaż?

Jednak trochę bez sensu jest zapisywanie w programie dwudziestu zmiennych o różnych nazwach. A co, jeśli trzeba coś zmienić? Albo dodać? Albo ponumerować?

Java daje ci możliwość utworzenia tablicy. Tablica, to taka zmienna, która przechowuje wiele wartości. Za matematyczny odpowiednik można uznać macierz, ale w Javie zapisuje się o wiele więcej niż tylko liczby. Poza tym, że Java nie wyliczy ci wartości tablicy.

Utwórzmy przykładową tablicę int z czterema liczbami.

```
int tablica[] = {1, 3, 5, 10};

```

Dosyć proste, co nie? Ale teraz pojawia się pytanie, jak uzyskać dostęp do kolejnych liczb? Nie jest to takie trudne, wystarczy użyć indeksów.

Indeksy to takie wskaźniki kolejnych elementów. Indeksy zawsze zaczynają się od zera, a więc w tablicy czteroelementowej mamy indeksy od 0 do 3.

Zauważ, że jest to analogiczne do pięter w bloku - jest ich pięć, ale zaczynają się od partera (poziom 0), a kończą na czwartym (poziom 4). Ot, taka polska logika godna Javy.

Wyświetlmy teraz np. trzecią liczbę:

```
System.out.println(tablica[2]);

```

Program wyświetli nam 5.

### Pusta tablica?

Zdarza się, że będziemy chcieli elementy tablicy dodać w przyszłości. W tym przypadku możemy stworzyć tablicę w ten sposób:

```
int tablica[] = new int[20];

```

Zauważ, że w tym przypadku stworzymy tablicę, która ma dwadzieścia pustych elementów. Ta dwudziestka nie jest indeksem, jest rozmiarem, a więc nie uwzględniamy zera.

To teraz pytanie dla bystrych: jak nadać wartości elementom? Nie odpowiadaj, ja to zrobię. Nadajesz tak jak każdej innej zmiennej, ale używając indeksów:

```
int tablica[] = new int[5];
tablica[0] = -1;
tablica[1] = 69;
tablica[2] = 96;
tablica[3] = 0;
tablica[4] = 10;

```

Ja nadałem wartość wszystkim elementom, ale ty możesz pobawić się w nonkonformistę i nadać wartość tylko niektórym i do tego nie po kolei. Java jak najbardziej pozwala na takie nonkonformistyczne zapędy, a nawet ich nie tłumi.

### Tablica obiektów

A co jeśli bardzo się uprzesz na swoją listę zakupów i jednak chcesz ją zapisać? Pominę fakt, że w tym przypadku będzie to całkowicie bezużyteczne. Ale skoro tak bardzo to chcesz, to musimy od czegoś zacząć. Np. od tablicy Stringów (niezależnie od tego, czy je kupisz, czy nie).

```
String zakupy[] = {"czekoladki", "test ciążowy", "Durexy", "bilet do Moskwy"};

```

Oczywiście to dosyć desperacki i niepraktyczny sposób na tworzenie tablicy, ale może najłatwiejszy. Spróbujmy stworzyć tę samą tablicę drugim sposobem:

```
String zakupy[] = new String()[5];
zakupy[0] = "czekoladki";
zakupy[1] = "życie towarzyskie";
zakupy[2] = "poczucie humoru";
zakupy[3] = "nowy komputer";
zakupy[4] = "Fedora";

```

Zauważ ten nawias przed wielkością tablicy. Jest on tutaj dlatego, że tworzysz pięć obiektów String w tablicy. A jak pewnie tłumaczyłem w poprzedniej części, każdy obiekt jest tworzony przez słowo new i nawias z opcjonalnym argumentem na końcu. Tablice nie są wyjątkiem.

### Zmiana rozmiaru tablicy

Ha! Myślałeś, że będzie tak łatwo od początku, co nie? Niestety, Java cię nienawidzi i nie pozwoli ci na takie sztuczki. Nie da się zmienić rozmiaru tablicy, najwyżej możesz zerować wartości. Dlatego dla pewności zawsze warto tworzyć za duże tablice (nie przesadzając oczywiście) i zerować nadmiar elementów.

Tylko jak zerować? Otóż służy do tego magiczne słówko **null.**

```
tablica[2] = null;

```

Null oznacza dokładnie nic, czyli nic. Każda zmienna, której nie nadasz wartości, będzie właśnie takim nullem.

### Tablice wielowymiarowe

A co jeśli chciałbyś np. przechować sobie planszę do gry w kółko i krzyżyk? Tutaj też nie ma sensu tworzyć oddzielnych dziewięciu zmiennych (jak tak zrobisz to jesteś idiotą po tym, jak się naprodukowałem). Stwórzmy tablicę dwuwymiarową.

Tablica dwuwymiarowa od tablicy jednowymiarowej, która była wyżej, różni się tym, że ma dwa wymiary zamiast jednego. Graficznie możesz sobie wyobrazić to jako tabelę (chociaż Java jest takim nonkonformistą, że nie jest to do końca prawdziwe wyobrażenie).

Taką tablicę tworzymy analogicznie co tablicę jednowymiarową, uwzględniając jednak drugi wymiar:

```
int tablica[][] = new int[3][3];

```

Utworzyłem tablicę int o wymiarach 3x3. Dostęp do elementów też jest analogiczny:

```
tablica[1][0] = 1;

```

## Pakiety

Na początku na temat pakietów powinieneś wiedzieć tyle, że przechowują zestawy klas. W rzeczywistości jest to świetny sposób na utrzymanie porządku, chociaż taka nieogarnięta pierdoła jak ty może tego na początku nie zrozumieć.

Na razie pakiety wyobraź sobie jak ponazywane półki lub szafki. Na przykład w bibliotece. O wiele łatwiej jest wtedy szukać np. podręcznika do Javy pod "informatyką" niż w bałaganie.

W rzeczywistości Java działa trochę jak tajna organizacja komunistyczna, bo ukrywa to, że masz dostęp do tych wszystkich klas. Dodatkowo twierdzi, że każda klasa jest równa i musi być traktowana importami.

```
import java.util.Scanner;

```

W rzeczywistości import jest niepotrzebny, a jedynie wprowadza porządek - do klas można się odwoływać bezpośrednio. Wtedy nie musisz pisać "import", ale za każdym razem musisz pisać pełną nazwę klasy - łącznie z pakietem.

```
java.util.Scanner długaNazwaSkanera = new java.util.Scaner(System.in);

```

### Magiczne pakiety Javy - java.lang.Math

Java zawiera także wiele przydatnych klas i pakietów. Jednym z nich jest klasa java.lang.Math. Nie musisz jej jednak dodawać do importów, bo tak jak java.lang.System znajduje się w pakiecie java.lang, który jest automatycznie importowany.

Z klasy Math będziesz korzystał często, a to z wielu przyczyn. Są to m.in. wymagania Idzika czy to, że pewnie jesteś pierdołą i nie będzie ci się chciało zapamiętać wzorów. Poza tym klasa ta jest bardzo przydatna, bo umożliwia policzenie pierwiastka czy potęgi i posiada w sobie gotową do wykorzystania liczbę pi.

Jednak większość dostępnych tam funkcji (metod) i stałych jest typu double. Oznacza to, że powinieneś wyniki zapisywać w takich to właśnie zmiennych.

 double

Przykładowe zastosowanie tych metod:

```
double cztery = Math.pow(2, 2);
double pierwiastekZDwoch = Math.sqrt(2);
double pierwiastekSzesciennyZ9 = Math.pow(9, (1/3));
double pierwiastekZPi = Math.sqrt(Math.PI);

```

## Rzutowanie

Powyżej musiałeś używać typów double. A co jeśli jesteś pierdołą i zapomniałeś o tym, dlatego przez poprzednie trzysta linijek używałeś float zamiast nieszczęsnego double?

Radą na to jest konwersja typów, nazywana też rzutowaniem.

Po prostu przed wartością z innym typem (ale nie obiektem) dodaj w nawiasie typ, w jakim potrzebujesz swojej zmiennej.

```
float pierdola = 3.0f;
double zmiennoprzecinkowa = (double) pierdola;
int calkowita = (int) zmiennoprzecinkowa;

```

Java odwali za ciebie brudną robotę i zrobi, co w swojej mocy, aby cię zadowolić. Pamiętaj, że zamiana double (lub float) na int (long lub short) nie wiąże się z zaokrągleniem liczby.