Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016



Podobne dokumenty
Kurs programowania. Wykład 9. Wojciech Macyna

Technologie programowania Wykład 4. Szablony funkcji Notes. Szablony funkcji Notes. Szablony funkcji Notes. Notes. Przemek Błaśkiewicz.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

Tworzenie aplikacji w języku Java

Szablony funkcji i szablony klas

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

Programowanie i struktury danych

Realizacja ekstensji klasy. Paulina Strzelecka, Tomasz Roszkowski

Podstawy otwartych języków programowania Przechowywanie danych

Programowanie obiektowe

Platformy Programistyczne Podstawy języka Java

Wykład 4. Klasa List Kolejki Stosy Słowniki

Programowanie obiektowe

Programowanie w języku Java. Kolekcje

Dawid Gierszewski Adam Hanasko

Kolekcje - pakiet Java Collections Framework

Język C++ część 9 szablony klas. Jarosław Gramacki Instytut Informatyki i Elektroniki. szablony funkcji

Wstęp do ruby dla programistów javy

Język JAVA podstawy. Wykład 4, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wprowadzenie do szablonów szablony funkcji

Język C++ wykład VIII

Wprowadzenie do szablonów szablony funkcji

Programowanie w C++ Wykład 6. Katarzyna Grzelak. 1 kwietnia K.Grzelak (Wykład 6) Programowanie w C++ 1 / 43

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Java Collections Framework

2. Klasy cz. 2 - Konstruktor kopiujący. Pola tworzone statycznie i dynamicznie - Funkcje zaprzyjaźnione - Składowe statyczne

Kolekcje obiektów. Wyj tki.

Abstrakcyjny typ danych

Kolekcje - pakiet Java Collections Framework

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

JAVA W SUPER EXPRESOWEJ PIGUŁCE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Szablony funkcji i klas (templates)

Wykład 4: Klasy i Metody

Języki i metody programowania Java INF302W Wykład 3 (część 2)

Programowanie Obiektowe (Java)

Typy uogólnione. Programowanie obiektowe. Jacek Sroka na podstawie materiałów Janusza Jabłonowskiego. 8 kwietnia 2013

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Projektowanie klas c.d. Projektowanie klas przykład

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Java SE Laboratorium nr 7. Temat: Kolekcje

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Wstęp do Programowania 2

Algorytmy i Struktury Danych.

Paradygmaty programowania

Kiedy potrzebne. Struktura (rekord) Struktura w języku C# Tablice struktur. struktura, kolekcja

Programowanie obiektowe

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Programowanie w C++ Wykład 7. Katarzyna Grzelak. 23 kwietnia K.Grzelak (Wykład 7) Programowanie w C++ 1 / 40

Klasy abstrakcyjne, interfejsy i polimorfizm

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Java: interfejsy i klasy wewnętrzne

Paradygmaty programowania. Paradygmaty programowania

Operatory na rzecz typu TString

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Klasy abstrakcyjne i interfejsy

Języki i metodyka programowania. Język C# pętle, sterowanie, wyjątki

Stos LIFO Last In First Out

java.util.* :Kolekcje Tomasz Borzyszkowski

Systemy Rozproszone - Ćwiczenie 6

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Programowanie obiektowe

Podstawy programowania obiektowego

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Pętle while, for, do while, instrukcje break, continue, switch 1. Pętle

Programowanie obiektowe

Programowanie obiektowe

Java niezbędnik programisty spotkanie nr 8. Kolekcje c.d.

Kolekcje mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Wartości domyślne, szablony funkcji i klas

1 Atrybuty i metody klasowe

Comparable<Klasa_uzytkownika>

Wstęp do Programowania 2

Algorytmy i Struktury Danych.

TEMAT : KLASY POLIMORFIZM

Klasy generyczne. ZbiórLiczb. ZbiórCzegokolwiek. Zbiór

FUNKCJE WZORCOWE. Wykład 10. Programowanie Obiektowe (język C++) Funkcje wzorcowe wprowadzenie (2) Funkcje wzorcowe wprowadzenie (1)

Aby uzyskać zaliczenie w pierwszym terminie (do 30 stycznia 2018) rozliczyć trzeba co najmniej 8 projektów, po 4 z każdej z części: C++ oraz Python.

Języki i paradygmaty programowania Wykład 2. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/18

Kolekcje w Javie cz. 1

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Środowisko programistyczne GEANT4

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Ćwiczenia IV - Kontenery (pojemniki)

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Dokumentacja do API Javy.

Programowanie w środowiskach graficznych. Wykład 3 Język C#

Języki i metody programowania Java Lab4 podejście obiektowe, zastosowanie pojemników

Programowanie obiektowe

Transkrypt:

Wykład 9 28 kwiecień 2016

Java Collections Framework (w C++ Standard Template Library) Kolekcja (kontener) Obiekt grupujacy/przechowuj acy jakieś elementy (obiekty lub wartości). Przykładami kolekcji sa zbiór, lista czy wektor. Składniki Interfejsy Implementacje (klasy) Algorytmy Iteratory

Przykład - Zbiory w Javie Interfejs java.util.set (java.util.sortedset) Zbiór elementów bez powtórzeń. Przykładowe Implementacje java.util.hashset java.util.linkedhashset java.util.treeset (automatycznie posortowane) Klasa java.util.collections Zawiera pomocnicze metody statyczne do operowania na kolekcjach (zobacz także klasę java.util.arrays dla tablic). Szczegółowy spis metod w dokumentacji.

Przykład użycia - zbior.java 1 import java. util. Collections ; 2 import java. util. Set ; 3 import java. util. HashSet ; 4 5 public class zbior { 6 7 public static void main ( String args []) { 8 Set < String > nazwiska = new HashSet < String >(); 9 nazwiska. add (" Nowak " ); nazwiska. add (" Kowalski " ); 10 nazwiska. add (" Bielecki " ); nazwiska. add (" Adamski " ); 11 nazwiska. add (" Kowalski " ); 12 13 for ( String s : nazwiska ) System. out. println (" -> "+s ); 14 15 System. out. println ( Collections. min ( nazwiska )); 16 System. out. println ( Collections. max ( nazwiska )); 17 18 nazwiska. remove (" Kowalski " ); System. out. println ( nazwiska ); 19 System. out. println ( nazwiska. contains (" Kowalski " )); 20 } 21 }

Przykład - Listy w Javie Interfejs java.util.list Uporzadkowany zbiór elementów, z dostępem przez indeks, można używać jak tablicy. Przykładowe Implementacje java.util.arraylist java.util.linkedlist java.util.vector

Przykład użycia - lista.java 1 import java. util. Collections ; 2 import java. util. List ; 3 import java. util. ArrayList ; 4 public class lista { 5 public static void main ( String args []) { 6 List < String > nazwiska = new ArrayList < String >(); 7 nazwiska. add (" Nowak " ); nazwiska. add (" Kowalski " ); 8 nazwiska. add (" Bielecki " ); nazwiska. add (" Adamski " ); 9 nazwiska. add (" Kowalski " ); 10 for ( String s : nazwiska ) System. out. println (" -> "+s ); 11 Collections. sort ( nazwiska ); System. out. println ( nazwiska ); 12 Collections. shuffle ( nazwiska ); System. out. println ( nazwiska ); 13 Collections. reverse ( nazwiska ); System. out. println ( nazwiska ); 14 System. out. println ( Collections. min ( nazwiska )); 15 System. out. println ( Collections. max ( nazwiska )); 16 17 System. out. println ( nazwiska. get (2)); 18 nazwiska. remove (2); System. out. println ( nazwiska ); 19 nazwiska. remove (" Adamski " ); System. out. println ( nazwiska ); 20 System. out. println ( nazwiska. contains (" Kowalski " )); 21 } 22 }

Podobny przykład w C++ lista.cpp 1 # include < iostream > 2 # include < list > 3 # include < string > 4 using namespace std ; 5 int main ( int argc, char * argv []) { 6 list < string > * nazwiska = new list < string >(); 7 nazwiska -> push_back (" Nowak " ); nazwiska -> push_back (" Kowalski " ); 8 nazwiska -> push_back (" Bielecki " ); nazwiska -> push_back (" Adamski " ); 9 nazwiska -> push_back (" Kowalski " ); 10 list < string >:: iterator it ; 11 for ( it = nazwiska -> begin (); it!= nazwiska -> end (); it ++) 12 cout << " - " << * it << endl ; 13 nazwiska -> sort (); 14 for ( it = nazwiska -> begin (); it!= nazwiska -> end (); it ++) 15 cout << " + " << * it << endl ; 16 nazwiska - > reverse (); 17 for ( it = nazwiska -> begin (); it!= nazwiska -> end (); it ++) 18 cout << " - " << * it << endl ; 19 nazwiska -> remove (" Kowalski " ); 20 for ( it = nazwiska -> begin (); it!= nazwiska -> end (); it ++) 21 cout << " + " << * it << endl ; 22 delete ( nazwiska ); 23 }

Przykład - Mapy w Javie Interfejs java.util.map (java.util.sortedmap) Kolekcja przechowujaca pary klucz-wartość, inaczej tablica asocjacyjna. Przykładowe Implementacje java.util.hashmap java.util.hashtable java.util.sortedmap (automatycznie posortowane) java.util.treemap

Przykład użycia - mapa.java 1 import java. util. Collections ; 2 import java. util. Map ; 3 import java. util. TreeMap ; 4 5 public class mapa { 6 7 public static void main ( String args []) { 8 Map < String, Integer > nazwiska = new TreeMap < String, Integer >(); 9 nazwiska. put (" Nowak ",1); nazwiska. put (" Kowalski ",2); 10 nazwiska. put (" Bielecki ",1); nazwiska. put (" Adamski ",2); 11 nazwiska. put (" Kowalski ",1); 12 13 for ( String s : nazwiska. keyset ()) 14 System. out. println (" -> "+s+" - "+ nazwiska. get (s )); 15 for ( int s : nazwiska. values ()) System. out. println (" -> "+s ); 16 17 System. out. println ( nazwiska. get (" Kowalski " )); 18 nazwiska. remove (" Kowalski " ); System. out. println ( nazwiska ); 19 System. out. println ( nazwiska. containskey (" Kowalski " )); 20 System. out. println ( nazwiska. containsvalue (2)); 21 } 22 }

Klasy parametryzowane typami W językach obiektowych można definiować klasy uogólnione zawierajace pola, których typy sa parametrami, tzw. szablony klas (np. klasy z JCF czy STL). Parametry typów podaje się w nawiasach (<>) po nazwie klasy, odzielajac je od siebie przecinkami.

Typy uogólnione w Javie W Javie typem uogólnionym może być tylko klasa (stad typ Integer zamiast int). Jednak dzięki automatycznemu konwertowaniu nie jest to uciażliwe. Pola typów uogólnionych przechowuja tylko referencje do tych typów a nie kopie obiektów (w Javie nie ma niejawnego kopiowania). Typem nie jest klasa parametryzowana ale dopiero jej ukonkretnienie z podanymi konkretnymi parametrami. Kompilator zakłada, że typ podany jako parametr jest dowolna podklasa klasy Object - czyli dla obiektów klasy podanej jako parametr możemy używać tylko metod klasy Object (eventualnie możemy je nadpisać w klasie parametryzowanej).

Przykład - klasa implementujaca stos - Stos.java 1 class ElemStosu <T > { 2 final T elem ; 3 final ElemStosu <T > nast ; 4 ElemStosu ( T elem, ElemStosu <T> nast ) { 5 this. elem = elem ; this. nast = nast ; 6 } 7 } 8 class PustyStos extends Exception {} 9 public class Stos <T> { 10 private ElemStosu <T > wierzch ; 11 public Stos () { wierzch = null ; } 12 public boolean empty () { return wierzch == null ; } 13 public void push ( T elem ) { 14 wierzch = new ElemStosu <T >( elem, wierzch ); 15 } 16 public T pop () throws PustyStos { 17 if ( empty () ) throw new PustyStos (); 18 T wynik = wierzch. elem ; 19 wierzch = wierzch. nast ; 20 return wynik ; 21 } 22 }

Przykład - cd - StosTest.java 1 public class StosTest { 2 public static void main ( String [] args ) { 3 Stos < Integer > a = new Stos < Integer >(); 4 Stos < String > b = new Stos < String >(); 5 a. push (2); a. push (3); 6 try { 7 System. out. println (a. pop ()+ " "+a. pop ()); 8 System. out. println (a. pop ()+ " "+a. pop ()); 9 } 10 catch ( PustyStos e) { 11 System. out. println (" PustyStos!" ); 12 } 13 b. push (" Marek " ); b. push (" Ala " ); 14 try { 15 while (!b. empty () ) 16 System. out. println (b. pop ()); 17 } 18 catch ( PustyStos e) { 19 System. out. println (" PustyStos!" ); 20 } 21 } 22 }

Ten sam przykład w C++ stos.cpp 1 template < typename T > class ElemStosu { 2 public : 3 T elem ; 4 ElemStosu <T >* nast ; 5 ElemStosu ( T elem, ElemStosu <T >* nast ) { 6 this -> elem = elem ; 7 this -> nast = nast ; 8 } 9 }; 10 template < typename T > class Stos { 11 private : 12 ElemStosu <T >* wierzch ; 13 public : 14 Stos () { wierzch = NULL ; } 15 bool empty () { return wierzch == NULL ; } 16 void push ( T elem ) { wierzch = new ElemStosu <T >( elem, wierzch ); 17 T pop () { 18 if ( empty () ) throw ( string )" PustyStos!"; 19 T wynik = wierzch - > elem ; 20 wierzch = wierzch - > nast ; 21 return wynik ; 22 } 23 };

Ten sam przykład w C++ stos.cpp (cd) 24 int main ( int argc, char * argv []) { 25 Stos <int > a; 26 Stos < string > b; 27 a. push (2); a. push (3); 28 try { 29 cout << a. pop () << " " << a. pop () << endl ; 30 cout << a. pop () << " " << a. pop () << endl ; 31 } 32 catch ( string e) { 33 cout << e << endl ; 34 } 35 b. push (" Marek " ); b. push (" Ala " ); 36 try { 37 while (!b. empty () ) 38 cout << b. pop () << endl ; 39 } 40 catch ( string e) { 41 cout << e << endl ; 42 } 43 }

Dodanie specjalnych własności typu podanego jako parametr Jeśli potrzebujemy aby nasza klasa podawana jako parametr posiadała dodatkowe metody możemy to w Javie uzyskać dodajac jaka klasę (interfejs) nasza klasa ma dziedziczyć. Na przykład jeśli klasa użyta jako parametr powinna mieć porzadek liniowy to powinna dziedziczyć interfejs Comparable z metoda compareto. Deklaracja takiego interfejsu (jest już w języku Java) wyglada nastapuj aco: 1 public interface Comparable <T >{ 2 public int compareto ( T o ); 3 }

Przykład - drzewo binarne - Drzewo.java (1/2) 1 class ElemDrzewa <T extends Comparable <T >> { 2 final T elem ; 3 ElemDrzewa <T > lewy ; 4 ElemDrzewa <T > prawy ; 5 ElemDrzewa ( T elem ) 6 { 7 this. elem = elem ; 8 lewy = null ; 9 prawy = null ; 10 } 11 public String tostring () { return elem. tostring (); } 12 } 13 public class Drzewo <T extends Comparable <T >> { 14 private ElemDrzewa <T > korzen ; 15 public Drzewo () { korzen = null ; } 16 public void insert ( T elem ) { korzen = ins ( elem, korzen ); } 17 public boolean iselement ( T elem ) { 18 return iselem ( elem, korzen ); } 19 public String tostring () { return tos ( korzen ); }

Przykład - drzewo binarne - Drzewo.java (2/2) 21 private ElemDrzewa <T> ins ( T elem, ElemDrzewa <T> w) { 22 if ( w== null ) return new ElemDrzewa <T >( elem ); 23 if ( elem. compareto (w. elem ) <0 ) 24 w. lewy = ins ( elem, w. lewy ); 25 else if ( elem. compareto (w. elem ) >0) 26 w. prawy = ins ( elem, w. prawy ); 27 return w; 28 } 29 private boolean iselem ( T elem, ElemDrzewa <T> w) { 30 if ( w== null ) return false ; 31 if ( elem. compareto ( w. elem )==0 ) return true ; 32 if ( elem. compareto (w. elem ) <0) 33 return iselem ( elem, w. lewy ); 34 else 35 return iselem ( elem, w. prawy ); 36 } 37 private String tos ( ElemDrzewa <T> w) { 38 if ( w!= null ) 39 return "("+w. elem +":"+ tos (w. lewy )+ ":"+ tos (w. prawy )+ ")"; 40 return " () "; 41 } 42 }

Przykład - drzewo binarne - DrzewoTest.java 1 public class DrzewoTest 2 { 3 public static void main ( String [] args ) 4 { 5 Drzewo < String > d = new Drzewo < String >(); 6 7 d. insert (" Marek " ); d. insert (" Ala " ); d. insert (" Kot " ); 8 System. out. println (d. iselement (" Ala " )); 9 System. out. println (d. iselement (" ma " )); 10 System. out. println (d ); 11 } 12 }

Podsumowanie Realizacja mechanizmu typów uogólnionych w Javie wystarcza do większości zastosować pewne niedogodności wynikaja z braku tego mechanizmu w pierwszych wersjach języka. Rozwiazania przyjęte w C++ sa bardziej elastyczne (umożliwiaja posługiwanie się niezdefiniowanymi metodami przy pisaniu schematów czego poprawność jest sprawdzana dopiero podczas kompilacji konkretnej instancji szablonu). W Javie trzeba jawnie podać wymagania danej klasy będacej parametrem.