Programowanie średniozaawansowane #14: tablice dynamiczne

W poprzednim wpisie napisałem mały wstęp do kolekcji, w tym także do tablicy dynamicznej (ArrayList). Teraz postaram się przybliżyć funkcjonalność struktury, którą na pewno będziesz używać podczas Twojej pracy jako programista.

ArrayList<String> arrayList = new ArrayList<String>();

W ten sposób możesz stworzyć swoją pustą tablicę dynamiczną (lub w skrócie listę). Użyłem tutaj klasy ArrayList, która przechowuje implementację dla listy jednokierunkowej*. Klasa ta jest klasą generyczną**, co oznacza, że jest kontenerem dla innego obiektu. Jak widzisz w kodzie, który napisałem, zarówno przy deklaracji, jak i definicji znajdują się znaki mniejszy – większy (<>), pomiędzy którymi umieszczasz inną nazwę klasy. W ten sposób decydujesz na jakim rodzaju obiektów chciałbyś pracować. Na przykład, jeśli potrzebujesz listę zarobków swojej firmy, to napiszesz: ArrayList<Integer>, co oznacza tablicę dynamiczną liczb całkowitych. Musisz pamiętać, że generyki mają jedną znaczącą różnicę w stosunku do tablic – mogą zawierać tylko typy obiektowe. Także nie da się stworzyć np. ArrayList<int> jest nie poprawne, inaczej niż w przypadku klasycznych tablic. Musisz tu zawsze używać typów opakowujących (np. Double, Long, Integer, itp.).

Ponieważ wiesz, że zgodnie z zasadą polimorfizmu w deklaracji zmiennej można używać interfejsu zamiast implementacji, to swój kod możesz poprawić w ten sposób:

List<String> list = new ArrayList<String>();

To jest dużo lepsze, ponieważ wpierw działasz na abstrakcji, a dopiero później wskazujesz konkretną implementację interfejsu. Dodatkowo od Javy w wersji 7 (praktycznie wszystkie projekty komercyjne używają co najmniej tą wersję) możesz skrócić zapis i nie powtarzać rodzaju obiektu, który będzie używany przez klasę generyczną po stronie jej definicji. Czyli kolejnym uproszczeniem będzie:

List<String> list= new ArrayList<>();

Tak stworzona lista, przypominam, w przeciwieństwie do tablicy nie ma od górnie ustalonego rozmiaru. Teraz dodaj jakieś elementy do niej.

list.add("Pierwszy");
list.add("Drugi");
list.add("Trzeci");

Dodałem sobie trzy elementy. Nie muszę, tak jak w przypadku tablic, pisać indeksu bo oczywiste jest, że indeksuje każdy dodany element od wartości 0 wzwyż. Jeśli chcesz dodać element z indeksem, to wtedy piszesz:

list.add(4, "Czwarty");

W podobny sposób możesz usuwać elementy.

list.remove("Czwarty");

Albo:

list.remove(list.indexOf("Trzeci"));

Tutaj usuwasz wpisując numer indeksu. Jeśli go nie znasz (lub nie pamiętasz), najłatwiej go zlokalizować używając metody indexOf w nawiasie wpisując nazwę elementu.

Teraz chcę podejrzeć co jest lista zawiera na pierwszej pozycji.

System.out.println(list.get(0));

Przejrzenie całej listy można łatwo zrobić używając pętli for-each.

for (String element : list) {
	System.out.println(element);
}

Czasami chcesz użyć konkretnego warunku, żeby wykonać jakąś akcję.

if(list.contains("Drugi")) {
        System.out.println("Lista posiada drugi element");
}

Pamiętasz, że lista może zawierać zduplikowane elementy?

list.add("Drugi");
if(list.contains("Drugi")) {
        System.out.println("Lista posiada drugi element");
}

Ponieważ wcześniej już na liście znajdował się element o nazwie „Drugi”, rezultat w konsoli powinien wyglądać tak:

Lista posiada drugi element
Lista posiada drugi element

Jak wiesz listy i tablice są odzwierciedleniem siebie, także w Javie jest prosty sposób, aby jedną strukturę zmapować na drugą.

String[] array = list.toArray(new String[0]);
List<String> listFromArray = Arrays.asList(array);

Jeśli chcesz stworzyć nową listę z pewnego zakresu danych zawartych w poprzedniej, to możesz to zrobić używając subList.

List<String> mySubList = listFromArray.subList(0, 2);

Sprawdzenie rozmiaru nowej listy wykonasz funkcją size

mySubList.size();

Ostatnią rzeczą, którą chciałbym Ci pokazać jest czyszczenie tablicy przy wcześniejszym sprawdzeniu, czy nie jest pusta.

if (!list.isEmpty()) {
	list.clear();
}

To wszystko w tej lekcji. Powyższe informacje powinny na razie wystarczyć Ci do swobodnej pracy na listach.

*Istnieje też lista dwukierunkowa (LinkedList).

**Więcej o klasach generycznych napiszę pod koniec kursu.

Dodaj komentarz