PGO Kolekcje Michail Mokkas
Spis treści Generic Tablica Collection Kontenery TreeSet ArrayList PriorityQueue HashMap Działania na kolekcjach Zadania
Generic Mechanizm w Javie, pozwalający metodom na działanie na różnych typach danych/obiektów. Notacja Generics: parametry typu T - wskazuje na typ E - wskazuje na element (np. List<E>) K - wkazuje na klucz V - wskazuje na wartość (np. Map<K,V>) wildcard ? - użycie jakiegokolwiek typu stosowane, kiedy nie wiemy z jakim typem mamy do czynienia
Tablica (Array) Kontener, który przechowywuje statycznie zadeklarowaną ilość wartości jednego typu. Tablica otrzymuje swój rozmiar przy deklaracji. Rozmiar nie może być zmieniony po jej utworzeniu. Indeks tablicy wskazuje na pozycję w kolejności elementów przetrzymywanych przez nią. Zaczyna się od 0.
Tablica kont. 1 Alternatywny sposób deklaracji: Wielowymiarowa tablica: Alternatywny sposób deklaracji wielowymiarowej tablicy:
Collection Najwyższy w hierarchii interfejs, po którym dziedziczą (rozszerzają lub implementują) inne klasy związane z przetrzymywaniem danych jak m.in.: Set (zbiór) SortedSet (zbiór uporządkowany) List (lista) ArrayList (lista na podstawie tablicy dynamicznej) LinkedList (lista na podstawie łączeń pomiędzy elementami) Vector (to samo co ArrayList + thread-safe) Queue (kolejka)
Collection Dysponuje metodami: boolean Add(E e) - dodaje element do kolekcji. boolean addAll(Collection<? extends E> c) - dodaje kolekcje do kolekcji. void clear() - usuwa wszystkie elementy. boolean contains(Object o) - sprawdza czy dany obiekt istnieje już w kolekcji. boolean equals(Object o) - porównuje dwie kolekcje. boolean isEmpty() - sprawdza czy kolekcja jest pusta. boolean remove(Object o) - usuwa jeden z obiektów podanych jako parametr. boolean removeAll(Collection<?> c) - usuwa obiekty znajdujące się w kolekcji c z naszej kolekcji. int size() - zwraca ilość elementów. Object[] toArray() - zwraca tablice elementów kolekcji. <T> T[] toArray(T[] a) - to samo co wyżej + ustalamy typ tablicy.
Kontenery źródło: http://www.programcreek.com/wp-content/uploads/2009/02/java-collection.jpg
TreeSet Implementacja interfejsu Set na podstawie TreeMap. Gwarantuje koszt czasowy log(n) dla operacji (add, remove i contains). Gwaratuje, że elementy zbioru będą uporządkowane (pod warunkiem, że implementują interfejs Comparable jak np. Integer i String) Nie dopuszcza duplikatów elementów. Nie jest thread-safe. Przykład: Rezultat w konsoli: [1, 2, 3, 4, 5]
ArrayList Implementuje interfejs List. W praktyce ArrayList stosuje się, jako alternatywa do zwykłych tablic, które są statyczne. Elementy ArrayList są indeksowane. Rozmiar ArrayList jest możliwy do zmiany po jej deklaracji. Przykład: Rezultat w konsoli: [A, B, D, C] A
PriorityQueue Kolejka priorytetowa na bazie stosu. Element z wyższym priorytetem obsługiwany jest wcześniej niż z niższym, a jeżeli mają taki sam to według swojej kolejności w kolejce. Nie dopuszcza elementów o wartości null. Dysponuje dodatkowo metodami: boolean offer(E e) - dodaje element do kolejki. E peek() - wyszukuje i nie usuwa głowy (element kolejny) kolejki. E poll() - wyszukuje i usuwa głowę (element kolejny) kolejki. Przykład: Rezultat w konsoli:
HashMap Implementacja tablicy mieszającej, bazująca na tablicy asocjacyjnej (mapy). Przechowuje pary (unikatowy klucz, wartość). Dostęp do jej elementów jest możliwy poprzez podanie klucza. Dopuszcza klucze i wartości null. Dodatkowo wykorzystuje metody: boolean containsKey(Object key) - sprawdza czy zawiera wartość przypisaną do klucza k boolean containsValue(object value) - sprawdza czy zawiera klucz do podanej wartości v V get(Object key) - zwraca wartość przypisaną do klucza k V put(K key, V value) - dodaje parę klucz-wartość do mapy
HashMap kont. 1 Przykład: Rezultat w konsoli: {1=C, 2=A, 3=B} {1=C, 2=A, 3=D, 4=A}
Działania na kolekcjach Synchronizacja kolekcji (thread-safe): Collections.synchronizedList() Collections.synchronizedMap() Collections.synchronizedSet() Collections.synchronizedCollection() Przykład: Pętla for each:
Zadanie 1 Stwórz tablicę przetrzymującą zdefiniowane już daty urodzin (skorzystaj z klasy Calendar lub GregorianCalendar). Następnie za pomocą pętli for each przerób tablicę na ArrayList tak, aby było możliwe dodawanie kolejnych dat urodzin do stworzonej już listy.
Zadanie 2 Zaprojektuj klasy reprezentujące numer seryjny (SerialNumber) oraz urządzenie (Device). Klasa SerialNumber powinna dysponować zmienną numer a klasa Device zmienną nazwa. Na podstawie tych klas stwórz HashMap przetrzymujący pary (SerialNumber, Device).
Zadanie 3 Stwórz kontener przetrzymujący obiekty różnego typu (co najmniej dwa). Dorób metody poprawnie klasyfikujące zwracane/otrzymywane obiekty z kontenera. skorzystaj ze stałej class klas obiektów oraz metody getClass() np. obj.getClass().equals(Integer.class) - zwraca true, jeżeli obj jest typu Integer
Zadanie 4 Stwórz klasę MyArrayList rozszerzającą klasę ArrayList. Obiekty klasy MyArrayList powinny wyświetlać w konsoli zawartość listy w następujący sposób (System.out.ptintln(mal)) : To jest lista o ID: 1234 w skład której wchodzą następujące elementy: A B C Lista posiada 3 elementy.