Implementacja ekstensji klasy Małachowska Anna, Karwowski Piotr, gr. 622 2004-03-16
Plan prezentacji: Drobne przypomnienie teorii ;-) Implementacja ekstensji klasy: i) przy użyciu tablicy statycznej ii) przy użyciu kolekcji a) lista (list) b) mapa (map) c) zbiór (set) iii) w postaci wystąpienia odrębnej klasy Dodatki :) a) implementacja metod obiektowych i klasowych Zadania do rozwiązania 2004-03-16
1 Drobne przypomnienie teorii Ekstensja klasy (class extent) - aktualny (zmienny w czasie!) zestaw wszystkich wystąpień (instancji) tej klasy. WAŻNE: jest to zbiór wszystkich wystąpień danej klasy (bezpośrednich i pośrednich), ALE obcięty do atrybutów wyspecyfikowanych w tej klasie. Dlaczego zbiór ekstensji zawiera także wystąpienia pośrednie? Ponieważ obiekt jest wystąpieniem bezpośrednim swojej klasy ale i wystąpieniem pośrednim wszystkich jej nadklas. W implementacji, ekstensja jest specjalną strukturą danych dołączoną do klasy. Ta struktura przechowuje wszystkie obiekty będące członkami danej klasy. Przykład obrazkowy dla osób oglądających tylko rysunki :) klasa PRACOWNIK NAZWISKO ROK_UK ZAROBEK DZIAŁ :PRACOWNIK NAZWISKO=Kluska ROK_UR=1970 ZAROBEK=2500 DZIAŁ=handlowy :PRACOWNIK NAZWISKO=Wałek ROK_UR=1976 ZAROBEK=2800 DZIAŁ=marketing instancja klasy instancja klasy zbiór instancji = ekstensja klasy 2004-03-16
2 Implementacja (i - tablica stat.) Zalety: Całkiem prosta implementacja Łatwy i szybki dostęp do dowolnego elementu tablicy Wydajność Wady: Stały, niezmienny rozmiar Mało efektywne rozwiązanie od strony usuwania elementów Brak zaimplementowanych użytecznych metod (wstawianie, usuwanie, przesuwanie... itp) Obsługa narzuconego typu danych (np. nie można umieścić w tablicy dowolnych obiektów) Listing implementacja przy użyciu tablicy statycznej – KLIKNIJ TUTAJ. Skrócony przykład implementacji: class Pracownik { // klasa pracownik String imie; // i jej atrybuty String nazwisko; int pensja; int id_pracownika; public static void main(String args[]) {} static Pracownik pracownicy[] = new Pracownik[100]; // tablica stat. static int index = 0; // wskaźnik static final int max = 100; // rozmiar tab. public Pracownik(String imie, String nazwisko, int pensja) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; if(index<max) { pracownicy[index] = this; // wstaw do tablicy index++; } // przykład realizacji usuwania public static void usunPracownika (int id_pracownika){ // znajdź pracownika po id (pętla for) // zastąp pracownika ostatnim pracownikiem w tabeli // lub wartością NULL jeśli tylko 1 prac. w tab. 2004-03-16
2 Implementacja (ii - kolekcje - wstęp) Co to jest kolekcja? Kolekcja (Collection), określana jako obiekt grupujący elementy w jedną „bryłę”. Struktura znacznie bardziej zaawansowana od tablic statycznych – kolekcje posiadają własne metody do wyszukiwania czy sortowania oraz umożliwiają przechowywanie dowolnego typu obiektów. Więcej o kolekcjach: http://java.sun.com/docs/books/tutorial/collections/index.html 2004-03-16
2 Implementacja (ii kolekcje – lista) Lista (interfejs) – uporządkowana kolekcja, określana czasem jako sekwencja Cechy: Daje dużą kontrolę nad tym gdzie chcemy wstawić nowy element praktyczny dostęp do dowolnego elementu (indeksowanie) Może zawierać duplikaty Przechowuje obiekty w takiej kolejności jak je wstawimy Główne implementacje: ArrayList – stosunkowo podobna do tablicy. Szybki dostęp do elementów ale wolniejsza przy wstawianiu i usuwaniu do/z wnętrza. LinkedList – tanie usuwanie i wstawianie w środek listy (stały czas w przeciwieństwie do liniowego w ArrayList). Lista dwukierunkowa, obsługuje kolejki i stosy. Listing implementacji przy użyciu kolekcji (ArrayList) – KLIKNIJ TUTAJ. Skrócony przykład implementacji: // klasa class Pracownik { String imie; String nazwisko; int pensja; // deklaracja listy ArrayList pracownicy = new ArrayList(); // dodawanie do listy public Pracownik (String imie, String nazwisko, int pensja) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; pracownicy.add(this); } // pobieranie z listy Pracownik n = (Pracownik)pracownicy.get(id); // usuwanie z listy pracownicy.remove(id); 2004-03-16
2 Implementacja (ii kolekcje - mapa) Mapa (interfejs) – określana też jako słownik, jest odzworowaniem klucz-element. Mapa nie jest w sensie stricte kolekcją, choć jest związana z Java Collection Framework Cechy: Każdy element identyfikowany jest przez unikatowy klucz (1 klucz ident. max 1 el.) Nie mogą wystąpić duplikaty kluczy Obiekty są uporządkowane wg wewnętrznej kolejności a nie w kolejności dodawania! Główne implementacje: HashMap (praktyczne to samo co HashTable) - zapewnia wstawianie / szukanie el. w stałym czasie. Nieposortowane (oparte na tablicy haszującej/mieszającej). TreeMap - implementacja w formie drzewa, zapewnia sortowanie rosnące po kluczach. Złożoność oczywiście logarytmiczna. Skrócony przykład implementacji: // klasa class Pracownik { String imie; String nazwisko; int pensja; // deklaracja mapy HashMap pracownicy = new HashMap(); // dodawanie do mapy public Pracownik (String imie, String nazwisko, int pensja) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; pracownicy.put(klucz, this); } // pobieranie z mapy Pracownik p = (Pracownik)pracownicy.get(klucz); if (p != null) { System.out.println("pierwszy = " + p.imie); // usuwanie z mapy pracownicy.remove(klucz); 2004-03-16
2 Implementacja (ii kolekcje - zbiór) Zbiór (interfejs) – oparty na matematycznym pojęciu zbioru Cechy: Bardzo prosta implementacja Brak jakiejkolwiek kolejności (uporządkowania) Nie mogą wystąpić duplikaty elementów ani więcej niż 1 element null Nie ma opcji bezpośredniego pobierania obiektów ze zbioru – konieczne jest uprzednie rzutowanie zbioru np. na tablicę! Główne implementacje: HashSet - umożliwia szybkie wyszukiwanie elementów. Zawartość nieuporządkowana. TreeSet - zbiór uporządkowany na podstawie drzewa, gwarantuje iż elementy są posortowane rosnąco. Złożonośc logarytmiczna. Skrócony przykład implementacji: // klasa class Pracownik { String imie; String nazwisko; int pensja; // deklaracja zbioru TreeSet pracownicy = new TreeSet(); // dodawanie do zbioru public Pracownik (String imie, String nazwisko, int pensja) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; pracownicy.add(this); } // usuwanie ze zbioru pracownicy.remove(new Pracownik("Jan", "Kluska")); 2004-03-16
2 Implementacja (ii - kolekcje - iterator) Co to jest iterator? Iterator (Collection) służy do poruszania się „do przodu” po elementach kolekcji oraz umożliwia ich łatwe wyświetlanie i usuwanie (next() zwraca kolejny element, hasNext()określa czy kolejny element istnieje, wreszcie remove()usuwa dany element). Ponadto, iterator interfejsu List umożliwia cofanie się (analogiczne previous() oraz hasPrevious()). Podstawową korzyścią przy korzystaniu z iteratora jest to, iż do wykonywania podstawowych zadań nie musimy znać metod obsługiwanych przez dany interfejs czy implementację kolekcji. 2004-03-16
2 Implementacja (iii jako ekstensja innej kl.) Skrócony przykład implementacji: class Pracownik { String imie; String nazwisko; int pensja; int id_pracownika; public Pracownik(String imie, String nazwisko, int pensja, int id_pracownika) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; this.id_pracownika = id_pracownika; } class Pracownicy { static int nastepne_id = 0; static ArrayList listaPracownikow; public static void main(String args[]) { Pracownicy p = new Pracownicy(); p.dodajPracownika("Jan", "Kluska", 1200); p.dodajPracownika("Ben", "Kenobi", 2000); public Pracownicy() { listaPracownikow = new ArrayList(); public void dodajPracownika (String imie, String nazwisko, int pensja) { listaPracownikow.add (new Pracownik (imie, nazwisko, pensja)); } Kompletny listing implementacja przy użyciu wystąpienia innej klasy – KLIKNIJ TUTAJ. 2004-03-16
3 Dodatki (metody obiektowe i klasowe) Metoda obiektowa – operuje na atrybutach obiektu (tego dla którego została wywołana). Skrócony przykład implementacji: class pozycjaNaLisciePlac { ... int wynagrodzenie; int premia; int policzWynagrodzenie() { return wynagrodzenie+premia; } Metoda klasowa – operuje na ekstensji klasy (posiada dostęp do wszystkich instancji). Skrócony przykład implementacji: class Pracownik { ... String nazwisko int wynagrodzenie; ArrayList listaPracownikow = new ArrayList(); ... int ileZarabia (String nazwisko) { // ...znajdź pracownika wewnątrz ArrayList // ...jeśli istnieje to return wynagrodzenie } } 2004-03-16
4 Zadanie 1 Problem: Chcemy, aby program wczytał z pliku listę miast (nie wiemy ile ich jest), a następnie wypisał nazwy miast na konsolę w alfabetycznym porządku rosnącym bez powtarzających się nazw miejscowości. Pytanie: Która z omówionych struktur danych będzie najodpowiedniejsza do implementacji programu i dlaczego? Implementacja 2004-03-16
4 Zadanie 2 Zaimplementować kolekcję miast z zadania 1 w postaci listy (ArrayList). Zapewnić uporządkowanie nazw miast poprzez zastosowanie gotowego algorytmu sortowania (sort() -statyczna metoda klasy Collections). Elementy kolekcji są obiektami klasy Object. Iterator zwróci wartość ogólnego typu Object. Dokonać konwersji do właściwego typu. Implementacja 2004-03-16
4 Zadanie 3 Problem: W pliku „miasta.txt” znajdują się teraz nazwy miast wraz z kodem pocztowym. Zaimplementować wyszukiwanie kodu pocztowego dla zadanej nazwy miejscowości. Pytanie: Która z omówionych struktur danych będzie najodpowiedniejsza do implementacji programu i dlaczego? Implementacja 2004-03-16
Dziękujemy za uwagę 2004-03-16