Java niezbędnik programisty spotkanie nr 8 Kolekcje c.d. 1
Kontenery (rysunek pożyczony z Thinkin in Java ed. 3) Legenda: kreski-interfejsy kropki-kl. Abstr. 2
Przykład static Collection fill(collection c) { c.add("dog"); c.add("dog"); c.add("cat"); return c; } static Map fill(map m) { m.put("dog", "Bosco"); m.put("dog", "Spot"); m.put("cat", "Rags"); return m; } public static void test() { System.out.println(fill(new ArrayList())); System.out.println(fill(new HashSet())); System.out.println(fill(new HashMap())); } [dog, dog, cat] [dog, cat] {dog=spot, cat=rags} 3
Co może być w zbiorze? Set zbior = new HashSet(); Kot[] koty = {new Kot("Bonifacy"),new Kot("Filemon"),new Kot("Filemon")}; //czy w zbiorze mogą być trzy takie same koty? zbior.addall(arrays.aslist(koty)); System.out.println(zbior.size()); //??? zbior.add(new Pies("Reksio")); for (Iterator iter = zbior.iterator(); iter.hasnext();) { System.out.println(iter.next()); } //zbior.add(new Pies("Reksio")); //for (Iterator iter = zbior.iterator(); iter.hasnext();) { // Kot element = (Kot) iter.next(); // System.out.println(element); //} 4
Interfejs Collection boolean add(object) po poprawny wykonaniu tej operacji kontener zawiera dodawany element. false jeżeli elementu nie trzeba dodawać, bądź nie można. (optional) boolean addall(collection) analogicznie tylko dla kolekcji (optional) void clear( ) po wykonaniu kontener będzie pusty (optional) boolean contains(object) true jeżeli kontener zawiera dany argument boolean containsall(collection) analogicznie boolean isempty( ) true jeżeli kontener nie zawiera żadnych elementów Iterator iterator( ) zwraca iterator do przeglądania elementów kontenera boolean remove(object) jeżeli element znajduje się w kontenerze to usuwa jeden egzemplarz. Wynik wskazuje czy coś usunięto (optional) boolean removeall(collection) analogicznie (optional) boolean retainall(collection) kontener będzie zawierał teoriomnogościowe przecięcie. Wynik wskazuje czy coś się zmieniło (optional) int size( ) ilość elementów w kontenerze Object[] toarray( ) tablica zawierająca elementy kontenera (nie ma nic wspólnego z tym jak kontener trzyma obiekty) Object[] toarray(object[] a) zwracana tablica będzie miała rzeczywisty typ jak tablica przekazana jako argument, co więcej jeżeli kolekcja mieści się w przekazanej tablicy to właśnie ona będzie wypełniona (na końcu będą nulle) 5
O co chodzi z optional? Nie wszystkie klasy muszą implementować wszystkie metody. Niezaimplementowane metody powinny zgłaszać UnsupportedOperationException (podklasa RuntimeException). Takie wyjątki nie zdarzają się często, a łatwiej się nauczyć posługiwać biblioteką z prostą hierarchią Dokumentacja metod, które jako argument przyjmują kolekcje powinna wskazywać jakie metody będą używane. List l = Arrays.asList(new String[] {"a", "b", "c"}); System.out.println(l.getClass().getName()); l.add("d"); Wynik: java.util.arrays$arraylist Exception in thread "main" java.lang.unsupportedoperationexception at java.util.abstractlist.add(unknown Source) at java.util.abstractlist.add(unknown Source) at w8.test.main(test.java:90) 6
Własne niezmienialne kolekcje Klasa Collections zawiera metody zwracające wersję tylko do odczytu, dla podanej kolekcji, zbioru, listy, mapy. List l = new LinkedList(); l.add("a"); l.add("b"); l.add("c"); List u = Collections.unmodifiableList(l); l.set(0, "x"); //u.set(0, "x"); System.out.println(l); System.out.println(u); Wynik: [x, b, c] [x, b, c] 7
Klasa Collections max(collection), min(collection) Zwraca największy/najmniejszy element kolekcji. Elementy muszą implementować Comparable. Są też przeciążone odpowiedniki przyjmujące Comparator. indexofsublist(list source, List target) Zwraca indeks pierwszego wystąpienia taget w source lastindexofsublist(list source, List target) Produces starting index of the last place where target appears inside source. replaceall(list list, Object oldval, Object newval) Zamienia wszystkie wystąpienia oldval na newval. reverse(list list) Odwraca listę w liniowym czasie. rotate(list list, int distance) Przepycha elementy listy do przodu (te wypychane z końca przeskakują na początek). Można używać w połączeniu z lista.sublist(i,j). copy(list dest, List src) Kopiuje elementy z src na te same indeksy w dest (musi starczyć miejsca). Pozostałych nie rusza. fill(list list, Object o) Zamienia wszystkie elementy listy na o. ncopies(int n, Object o) Podobnie jak powyżej, ale tworzona jest lista o zadanej długości. shuffle(list list) Losowo miesza listę. 8