Implementacja ekstensji klasy
Małachowska Anna, Karwowski Piotr, gr. 622
Plan prezentacji:
1. Drobne przypomnienie teorii ;-) 2. 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 3. Dodatki :)
a) implementacja metod obiektowych i klasowych
4. Zadania do rozwiązania
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 :)
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
klasa
instancja klasy
zbiór instancji = ekstensja klasy
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.
}
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
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);
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);
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"));
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.
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.
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 }
}
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