Implementacja ekstensji klasy
description
Transcript of Implementacja ekstensji klasy
2004-03-16 1
Implementacja ekstensji klasyMałachowska Anna, Karwowski Piotr, gr. 622
2004-03-16 2
Plan prezentacji:1. Drobne przypomnienie teorii ;-)2. Implementacja ekstensji klasy:
i) przy użyciu tablicy statycznejii) przy użyciu kolekcji
a) lista (list) b) mapa (map) c) zbiór (set)
iii) w postaci wystąpienia odrębnej klasy3. Dodatki :)
a) implementacja metod obiektowych i klasowych
4. Zadania do rozwiązania
2004-03-16 3
1 Drobne przypomnienie teoriiEkstensja 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óboglądających tylko rysunki :)
PRACOWNIKNAZWISKOROK_UKZAROBEKDZIAŁ
:PRACOWNIKNAZWISKO=KluskaROK_UR=1970ZAROBEK=2500DZIAŁ=handlowy
:PRACOWNIKNAZWISKO=WałekROK_UR=1976ZAROBEK=2800DZIAŁ=marketing
instancja klasy
klasa
instancja klasy
zbiór instancji = ekstensja klasy
2004-03-16 4
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 5
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 6
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:// klasaclass Pracownik {String imie;String nazwisko;int pensja;
// deklaracja listyArrayList pracownicy = new ArrayList();
// dodawanie do listypublic Pracownik (String imie, String nazwisko, int pensja) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; pracownicy.add(this);}
// pobieranie z listyPracownik n = (Pracownik)pracownicy.get(id);
// usuwanie z listypracownicy.remove(id);
2004-03-16 7
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:// klasaclass Pracownik {String imie;String nazwisko;int pensja;
// deklaracja mapy HashMap pracownicy = new HashMap();
// dodawanie do mapypublic 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 8
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:// klasaclass Pracownik {String imie;String nazwisko;int pensja;
// deklaracja zbioru TreeSet pracownicy = new TreeSet();
// dodawanie do zbiorupublic Pracownik (String imie, String nazwisko, int pensja) { this.imie = imie; this.nazwisko = nazwisko; this.pensja = pensja; pracownicy.add(this);
}
// usuwanie ze zbiorupracownicy.remove(new Pracownik("Jan", "Kluska"));
2004-03-16 9
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 10
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życiuwystąpienia innej klasy – KLIKNIJ TUTAJ.
2004-03-16 11
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 nazwiskoint wynagrodzenie;ArrayList listaPracownikow = new ArrayList();...
int ileZarabia (String nazwisko) { // ...znajdź pracownika wewnątrz ArrayList // ...jeśli istnieje to return wynagrodzenie}
}
2004-03-16 12
4 Zadanie 1Problem:
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 13
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 14
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 15
Dziękujemy za uwagę