Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011
Kolekcja obiekt, który grupuje inne obiekty, traktując je jako jeden zestaw danych i pozwalający na wykonywanie operacji na tym zestawie danych np. aktualizacji. Jaka jest znana Państwu najprostsza kolekcja? Po co stosować kolekcje? Przykład: Książka adresowa dane osób zapisane są w pliku tekstowym. Należy te dane sczytać i zapisać w strukturze danych, ale nie ma informacji o tym ile jest już dodanych osób. Możliwe rozwiązania: Odczyt pliku by policzyć ile jest rekordów i na tej podstawie określić rozmiar tablicy przechowującej dane osób. Narzucenie maksymalnej liczby przechowywanych rekordów, bądź przepisywanie do innej tablicy jeśli przekroczony zostanie założony limit. Wykorzystanie kolekcji ArrayList
1995: JDK 1.0 niezależne klasy kolekcji: tablice Vector, Hashtable o niespójnym sposobie dostępu do elementów brak wydzielonych interfejsów 1998: JDK 1.2 oparcie kolekcji na interfejsach Collection, Set, List i Map oraz różnorodnych implementacjach iteratory, algorytmy, porównania 2005: JDK 1.5 wprowadzenie typów generycznych
ArrayList (z pakietu java.util) lista zrealizowana za pomocą tablicy o dynamicznie rozszerzającej się (w miarę potrzeby) tablicy. Wybrane metody ArrayList: add(obiekt) dodanie elementu do końca listy get(index) pobranie elementu znajdującego się na pozycji index. size() liczba przechowywanych elementów. Jan Nowak Jan Kowalski Jan Kowalski
dostęp pozycyjny do elementów Object get(int indeks) Object set(int indeks) Object add(int indeks) Object remove(int indeks) wyszukiwanie int indexof(object obiekt) int lastindexof(object obiekt) rozszerzona iteracja ListIterator listiterator() widok przedziałowy List sublist(int poczatek, int koniec)
Iterator obiekt służący do przechodzenia (przeglądania) po elementach kolekcji. Metoda iterator() zdefiniowana dla wszystkich kolekcji, zwraca obiekt-iterator służący do jej przeglądania. Metoda next() pozwala uzyskać dostęp do kolejnych elementów. Metoda hasnext() służy do sprawdzenia czy kolejny element można pobrać, czy też osiągnięto koniec kolekcji. Po co używać iteratorów?
A co jeśli chcemy dane przechowywane w ArrayList posortować? Można skorzystać z odpowiedniej metody statycznej klasy Collections.
A jeśli nie podamy typu przechowanego w kolekcji: Algorytmy kolekcyjne metody wykonujące operacje obliczeniowe na kolekcjach. Są one polimorficzne.
Reprezentacja kolejki (LIFO, FIFO, priorytetowa) Podział na pierwszy element (głowę) i pozostałą część kolejki (ogon) Najważniejsze implementacje: LinkedList, PriorityQueue. dodawanie elementu boolean offer(object obiekt) usuwanie elementu Object remove() Object poll() inspekcja Object element() Object peek()
Zbiór kolekcja reprezentująca zestaw niepowtarzających się elementów. W zbiorze elementy nie mają przyporządkowanej sobie pozycji brak indeksów. Porządek przeglądania zbioru nie jest ściśle określony. Jan Nowak Jan Kowalski
W przypadku zbiorów uporządkowanych, kolejność przeglądania jego elementów za pomocą iteratora jest ściśle określona (np. w porządku alfabetycznym rosnąco). Jan Kowalski Jan Nowak
HashMap jednoznacznie odwzorowuje klucze w wartości. Zaimplementowane za pomocą tablicy asocjacyjnej nazywanej w Javie mapą. Klucze, wartości i pary klucz-wartość dostępne jako obiekty Collection Wybrane metody HashMap: put(klucz, wartosc) dodanie nowej pary <klucz, wartość> get(klucz) pobranie wartości znajdującej się pod danym kluczem. Jeśli nie ma podanego klucza w kolekcji, zwracana jest wartość null.
operacje podstawowe Object put(object klucz, Object wartosc) Object get(object klucz) Object remove(object klucz) boolean containskey(object klucz) boolean containsvalue(object wartosc) operacje grupowe void putall(map zrodlo) widoki-kolekcje Set keyset() Collection values() Set entryset()
Klasa JCF Pozycja elementów Porządek Duplikaty Przykładowe użycie TreeSet Brak Rosnąco Nie Posortowana lista unikalnych słów HashSet Brak Brak Nie Lista unikalnych słów z szybkim dostępem ArrayList Numerycznie Brak Dozwolone Dynamicznie alokowana tablica LinkedList Numerycznie Kolejnośd wstawiania Dozwolone Lista słów, które często się zmieniają HashMap Obiekt jako klucz Brak Unikalne klucze Mapowanie słów na liczbę ich wystąpieo TreeMap Obiekt jako klucz Rosnąco Unikalne klucze Mapuje posortowane słowa na liczbę ich wystąpieo
Wspólny interfejs dla większości kolekcji Reprezentuje obiekt zarządzający grupą elementów Brak ograniczeń dotyczących elementów Dwa obligatoryjne konstruktory: bezparametrowy: Collection() kopiujący: Collection(Collection src) Konstruktor zapewnia utworzenie obiektu zgodnego z semantyką danej kolekcji Metody nieobowiązkowe mogą zgłaszać wyjątek java.lang.unsupportedoperationexception Brak bezpośredniej implementacji w JDK
operacje podstawowe wykonywane na obiektach boolean add(object obj) boolean remove(object obj) boolean contains(object obj) int size() boolean isempty(object obj) Iterator iterator() Object[] toarray() Object[] toarray(object[] type) operacje grupowe wykonywane na kolekcjach obiektów boolean addall(collection coll) boolean removeall(collection coll) boolean containsall(collection coll) boolean retainall(collection coll) void clear()
1. Napisz program, który tworzy 3 różne kolekcje: jedną typu List i dwa typu Set. Do tych kolekcji dodać na przemian zawartość tablicy znaków i tablicy liczb. W wyniku działania programu powinno zostać wykonane: Wyświetlenie zawartości całej kolekcji (korzystając z iteratora) Konkatenacja wszystkich napisów. Zsumowanie wszystkich liczb. Zapewnić minimum kodowania. Wyświetlić informacje o wykorzystanej kolekcji. Przykład: String[] s = { ala, kot, pies, zebra, ala } int[] num = {1, 2, 7, 9, 2} Przy użyciu ArrayList: [ala, 1, kot, 2, pies, 7, zebra, 9, ala, 2] Konkatenacja: ala kot pies zebra ala Suma: 21 Przy użyciu HashSet [9, pies, zebra, 7, ala, kot, 2, 1] Konkatenacja: pies zebra ala kot Suma 19