Seznamy a iterátory. Kolekce obecně. Rozhraní kolekce. Procházení kolekcí

Podobné dokumenty
Abstraktní datové typy: zásobník

boolean hasnext() Object next() void remove() Kolekce

Stromy. Příklady. Rekurzivní datové struktury. Základní pojmy

7. Dynamické datové struktury

Úvod do programovacích jazyků (Java)

Typický prvek kolekce pro české řazení

Kolekce, cyklus foreach

Iterator & for cyklus

Principy objektově orientovaného programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

typová konverze typová inference

Fronta (Queue) Úvod do programování. Fronta implementace. Fronta implementace pomocí pole 1/4. Fronta implementace pomocí pole 3/4

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Vytváření a použití knihoven tříd

Implementace abstraktních datových typů. Zásobník (Stack) Fronta (Queue) Obousměrná fronta (Dequeue) Vektor (Vector) Seznam (List)

Generické programování

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Datové struktury. Obsah přednášky: Definice pojmů. Abstraktní datové typy a jejich implementace. Algoritmizace (Y36ALG), Šumperk - 12.

Spojové struktury. Jan Faigl. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze. Přednáška 10 A0B36PR1 Programování 1

Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní

Datové struktury. alg12 1

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

Část I Spojové struktury

9. přednáška - třídy, objekty

Java Výjimky Java, zimní semestr

součet cvičení celkem. známka. Úloha č.: max. bodů: skut. bodů:

Kolekce ArrayList. Deklarace proměnných. Import. Vytvoření prázdné kolekce. napsal Pajclín

ADT/ADS = abstraktní datové typy / struktury

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Konstruktory a destruktory

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Java - řazení objektů

Seminář Java IV p.1/38

Úvod do programování - Java. Cvičení č.4

Třídy a objekty -příklady

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Programování v C++ 2, 8. cvičení

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

PŘETĚŽOVÁNÍ OPERÁTORŮ

Dynamické datové struktury I.

20. Projekt Domácí mediotéka

Základní datové struktury

Programování v C++ 2, 4. cvičení

Výčtový typ strana 67

Datové struktury strana 81

1. Téma 12 - Textové soubory a výjimky

Komponenty v.net. Obsah přednášky

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

PREPROCESOR POKRAČOVÁNÍ

Abstraktní datové typy

Pokud zadání nerozumíte nebo se vám zdá nejednoznačné, zeptejte se. Pište čitelně, nečitelná řešení nebudeme uznávat.

Správa paměti. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta, 2016

Lineární datové struktury

Stream API. Petr Krajča. Základy programovaní 4 (Java) Katedra informatiky Univerzita Palackého v Olomouci

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Projekty pro výuku programování v jazyce Java

Výčtové typy a kolekce v Javě, generické typy

DSA, První krok: máme dokázat, že pro left = right vrátí volání f(array, elem, left, right)

Jazyk C# (seminář 6)

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Abstraktní třída a rozhraní

Úvod do programovacích jazyků (Java)

Práce s textem. Třída Character. Třída Character. Třída Character. reprezentuje objekty zapouzdřující hodnotu typu char (boxing / unboxing)

Výčtové typy Kolekce a JFC Iterátory Přehled JFC Generické typy Příklad - Spojový seznam

Výčtové typy a kolekce v Javě, generické typy

Výčtové typy Kolekce a JFC Iterátory Přehled JFC Generické typy

OOPR_05. Případové studie

public class Karel { private int position; public boolean issmiling; public int getposition() { return position;

Spojová implementace lineárních datových struktur

Seminář Java V p.1/49

Programování v Javě I. Leden 2008

1. Programování proti rozhraní

Architektura COM. Historie Component Object Model (COM) Komunikace s komponentami Rozhraní komponent COM komponenty v.net.

Šablony, kontejnery a iterátory

Technologie JavaBeans

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Obsah přednášky. 12. Dokumentace zdrojového kódu Tvorba elektronické dokumentace UML. Co je diagram tříd. Ing. Ondřej Guth

IRAE 07/08 Přednáška č. 7. Začátek (head)

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Java a XML. 10/26/09 1/7 Java a XML

KTE / ZPE Informační technologie

Šablony, kontejnery a iterátory

Algoritmizace a programování

Class loader. každá třída (java.lang.class) obsahuje referenci na svůj class loader. Implementace class loaderu

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Java - výjimky. private void vstup() throws IOException {... }

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Programování v Javě I. Únor 2009

Java Řetězce Java, zimní semestr

Pole a kolekce. v C#, Javě a C++

Zadání k 2. programovacímu testu

5. Vyhledávání a řazení 1

ALG 14. Vícedimenzionální data. Řazení vícedimenzionálních dat. Experimentální porovnání řadících algoritmů na vícedimenzionálních datech

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

JAVA V Assertions Java, zimní semestr

IAJCE Přednáška č. 9. int[] pole = new int[pocet] int max = pole[0]; int id; for(int i =1; i< pole.length; i++) { // nikoli 0 if (Pole[i] > max) {

Návrhové vzory. Jakub Klemsa, Jan Legerský. 30. října Objektově orientované programování.

Transkript:

Kolekce obecně Seznamy a iterátory doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Kolekce ::= homogenní sada prvků objektů Opakování Uspořádání Přímý přístup Množina (set) Multimnožina (bag) Seznam (list) Pole (array) Seznamy a iterátory 2 Rozhraní kolekce interface Collection // přidání objektu void add(object elem); // odstranění objektu boolean remove(object elem); // test, zda obsahuje objekt boolean contains(object elem); // zjištění počtu prvků int size(); Procházení kolekcí Typická úloha projít všechny prvky kolekce a s každým něco udělat Obecný průchod kolekcí: příkaz typu foreach např. C#, PHP, foreach( Object o in kolekce ) // dělej něco s objektem o návrhový vzor Iterátor Seznamy a iterátory 3 Seznamy a iterátory 4 1

Návrhový vzor Iterátor Rozhraní iterátoru <<interface>> Collection void add(object) void remove(object) boolean contains(object) int size() iterator() <<interface>> Iterator boolean hasnext() Object next() interface Iterator // test přítomnosti dalšího prvku boolean hasnext(); // získání dalšího prvku Object next(); konkrétní kolekce iterator() konkrétní iterátor // obousměrný iterátor interface ListIterator extends Iterator boolean hasprevious(); Object previous(); Seznamy a iterátory 5 Seznamy a iterátory 6 Příklad // tisk obsahu kolekce static void print(collection coll) Iterator it = coll.iterator(); System.out.print("[ "); while( it.hasnext() ) Object obj = it.next(); System.out.print(obj + " "); System.out.println("]"); Seznam uspořádaná kolekce prvků interface List extends Collection // prvek na zadané pozici Object get(int pos); // vložení prvku na pozici void add(int pos, Object obj); // odstranění prvku na pozici void remove(int pos); // vyhledání pozice prvku int indexof(object obj); Seznamy a iterátory 7 Seznamy a iterátory 8 2

Příklad // tisk obsahu seznamu void print(printstream out, List list) out.print("["); for(int i = 0; i < list.size(); i++) if( i > 0 ) out.print(','); Object obj = list.get(i); out.print(obj); out.println("]"); Implementace seznamu Statické nebo dynamické pole omezená délka seznamu u statického pole rychlý přístup k prvkům podle indexu (get) pomalé vkládání a rušení uvnitř seznamu Vázaná struktura jednosměrně / obousměrně vázaný seznam pomalý přístup podle indexu rychlé vkládání a rušení prvky se nepřesouvají Seznamy a iterátory 9 Seznamy a iterátory 10 Implementace statickým polem public class ArrayList implements List // pole obsahující prvky seznamu protected Object[] data; // počet obsazených prvků protected int pocet; // konstruktor seznamu public ArrayList(int size) data = new Object[size]; Implementace statickým polem // vrátí prvek na zadané pozici public Object get(int pos) assert pos >= 0 && pos < pocet; return data[pos]; // přidá prvek na konec seznamu public void add(object obj) assert pocet < data.length; data[pocet++] = obj; Seznamy a iterátory 11 Seznamy a iterátory 12 3

Implementace statickým polem // vložení prvku na zadanou pozici public void add(int pos, Object obj) assert pos >= 0 && pos <= pocet; assert pocet < data.length; for(int i = pocet; i > pos; i--) data[i] = data[i-1]; data[pos] = obj; pocet++;... atd. Iterátor pro ArrayList musí si pamatovat referenci na seznam aktuální index implementace pomocí vnitřních tříd třída ve třídě má k dispozici všechny proměnné a metody vnější třídy (pomocí skryté reference) Seznamy a iterátory 13 Seznamy a iterátory 14 Iterátor pro ArrayList class ArrayList protected Object[] data; protected int pocet; public Iterator iterator() return new ArrayListIterator(); Iterátor pro ArrayList private class ArrayListIterator implements Iterator private int index; public boolean hasnext() return index < data.length; private class ArrayListIterator implements Iterator...... public Object next() return data[index++]; Seznamy a iterátory 15 Seznamy a iterátory 16 4

Jednosměrně vázaný seznam Jednosměrně vázaný seznam Prvek seznamu = dvojice class ListElem Object data; // hodnota ListElem next; // další prvek Odkaz na další prvek může být přímo součástí dat (jen pro předem známé seznamy) Seznamy a iterátory 17 Seznamy a iterátory 18 Jednosměrně vázaný seznam public class LinkedList implements List protected ListElem first; protected ListElem last; public int size() int pocet = 0; for( ListElem elem = first; elem!= null; elem = elem.next) pocet++; return pocet; Seznamy a iterátory 19 Jednosměrně vázaný seznam void add(object obj) ListElem elem = new ListElem(); elem.data = obj; if( last == null ) first = elem; else last.next = elem; last = elem; Seznamy a iterátory 20 5

Iterátor pro LinkedList class LinkedList implements List ListElem first, last; public Iterator iterator() return new ArrayListIterator(); private class LinkedListIterator implements Iterator...... Iterátor pro LinkedList private class LinkedListIterator implements Iterator private ListElem current = first; public boolean hasnext() return current!= null; public Object next() Object obj = current.data; current = current.next; return obj; Seznamy a iterátory 21 Seznamy a iterátory 22 Obousměrně vázaný seznam Rychlejší vkládání uvnitř seznamu nemusíme hledat předchozí prvek Jednoduchá implementace obousměrného iterátoru (průchod vpřed i vzad) Množina prvky se nemohou opakovat můžeme využít implementace seznamu při vkládání se musí kontrolovat, zda prvek už není v kolekci obsažen: void add(object obj) if( contains(obj) ) return; super.add(obj); Seznamy a iterátory 23 Seznamy a iterátory 24 6

Vyhledávání v seznamu Jak definovat rovnost dvou objektů? operace == porovnává pouze reference (x == y, právě když x a y ukazují na stejný objekt) metoda equals z třídy Object // implicitní implementace pomocí == boolean equals(object obj) return this == obj; Vyhledávání v seznamu class ArrayList implements List... public boolean contains(object obj) for(int i = 0; i < pocet; i++) if( data[i].equals(obj) ) return true; return false; Seznamy a iterátory 25 Seznamy a iterátory 26 Seřazený seznam prvky se ukládají v určitém pořadí zařazení hodnoty na správnou pozici při vkládání pro vyhledávání se dají použít efektivnější metody vrácení false, když narazíme na vyšší hodnotu binární vyhledávání v seřazeném poli iterátor vrací seřazené hodnoty Seřazený seznam Jak porovnat objekty? třída Object nezavádí žádnou operaci rozhraní Comparable int compareto(object obj) vrací hodnotu <0, ==0, >0 rozhraní Comparator pokud chceme (nebo musíme) kritérium řazení definovat odděleně od objektu int compare(object o1, Object o2) Seznamy a iterátory 27 Seznamy a iterátory 28 7

Seřazený seznam public class SortedList extends ArrayList protected Comparator comparator; // konstruktor public SortedList( int size, Comparator comparator) this.comparator = comparator; data = new Object[size]; Seřazený seznam lineární vyhledávání public boolean contains(object obj) for(int i = 0; i < pocet; i++) int c = comparator.compare(data[i],obj); if( c >= 0 ) return c == 0; return false; Seznamy a iterátory 29 Seznamy a iterátory 30 Seřazený seznam binární vyhledávání public boolean contains(object obj) int i = 0, j = pocet-1; while( i <= j ) int k = (i + j) / 2; int c = comparator.compare(data[k],obj); if( c == 0 ) return true; if( c < 0 ) i = k + 1; else j = k 1; return false; Seznamy v Javě balík java.util.* rozhraní Collection, List, Iterator třídy ArrayList pomocí dynamického pole LinkedList pomocí vázané struktury Vector pomocí pole, synchronizovaný přístup Seznamy a iterátory 31 Seznamy a iterátory 32 8

Příklad public static void main(string[] args) List seznam = new ArrayList(); seznam.add( a ); seznam.add( d ); seznam.add( c ); seznam.add( b ); Collections.sort(seznam); // ~merge sort O(n*log(n)) System.out.println(seznam); Seznamy a iterátory 33 Úkol do cvičení Implementujte zásobník pomocí seznamu dědičnost? class ArrayStack extends ArrayList implements Stack... kompozice? class ArrayStack implements Stack private List list = new ArrayList(); Seznamy a iterátory 34 9