W poprzednim wpisie napisałem mały wstęp do kolekcji, w tym także do tablicy dynamicznej (lub inaczej lista). 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ę).
Lista jednokierunkowa
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 niepoprawne, inaczej niż w przypadku klasycznych tablic. Musisz tu zawsze używać typów opakowujących (np. Double, Long, Integer, itp.).
Interfejs zamiast implementacji
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<>();
Podstawowe operacje
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 znajdziesz w kursie Java zaawansowane.
Link do kodu: https://github.com/developeronthego/java-middle/blob/master/src/main/java/middle/lesson14