Kolekce, cyklus foreach



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

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

Konstruktory a destruktory

Abstraktní datové typy: zásobník

Dynamické datové struktury I.

Lineární datové struktury

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

Základní datové struktury

Úvod Přetěžování Generika Kolekce Konec. Programování v C# Další jazykové konstrukce. Petr Vaněček 1 / 31

Algoritmizace prostorových úloh

Generické programování

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.

Algoritmizace prostorových úloh

Datové struktury. alg12 1

Abstraktní datové typy

ADT/ADS = abstraktní datové typy / struktury

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

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

Programování v C++ 1, 5. cvičení

Dynamické datové struktury IV.

Zadání k 2. programovacímu testu

Lineární datové struktury

Úvod do programovacích jazyků (Java)

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

ABSTRAKTNÍ DATOVÉ TYPY (ADT)

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

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

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

Šablony, kontejnery a iterátory

Šablony, kontejnery a iterátory

Da D to t v o é v ty t py IB111: Datové typy

2 Datové struktury. Pole Seznam Zásobník Fronty FIFO Haldy a prioritní fronty Stromy Hash tabulky Slovníky

5 Rekurze a zásobník. Rekurzivní volání metody

Algoritmy a datové struktury

Jazyk C# (seminář 3)

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

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

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

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

PB161 Programování v jazyce C++ Přednáška 3

Datové typy a struktury

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

Algoritmizace a programování

Simulace. Martin Pergel

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

7. Dynamické datové struktury

Bázové třídy platformy.net

Část I Spojové struktury

Maturitní téma: Programovací jazyk JAVA

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

Abstraktní třídy, polymorfní struktury

Výčtový typ strana 67

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

Jazyk C# a platforma.net

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

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) {

Spojový seznam. Jan Kybic.

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

Programování v C++ 1, 16. cvičení

8 Třídy, objekty, metody, předávání argumentů metod

Jazyk C# (seminář 5)

Jazyk C++ II. STL knihovna kontejnery část 1

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

ABSTRAKTNÍ DATOVÉ TYPY

prohled av an ı graf u Karel Hor ak, Petr Ryˇsav y 16. bˇrezna 2016 Katedra poˇ c ıtaˇ c u, FEL, ˇ CVUT

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

Mělká a hluboká kopie

Základy algoritmizace. Hašování

SOUBORY, VSTUPY A VÝSTUPY POKRAČOVÁNÍ

PREPROCESOR POKRAČOVÁNÍ

Semestrální práce 2 znakový strom

Stromy. Karel Richta a kol. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze Karel Richta a kol.

IRAE 07/08 Přednáška č. 1

Jazyk C# (seminář 6)

Lineární spojový seznam (úvod do dynamických datových struktur)

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

Jazyk C++ II. STL knihovna kontejnery část 2

ALGORITMIZACE 2010/03 STROMY, BINÁRNÍ STROMY VZTAH STROMŮ A REKURZE ZÁSOBNÍK IMPLEMENTUJE REKURZI PROHLEDÁVÁNÍ S NÁVRATEM (BACKTRACK)

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

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

Zásobník (LIFO) Opakem zásobníku LIFO je fronta FIFO (First In, First Out první dovnitř, první ven)

Dynamicky vázané metody. Pozdní vazba, virtuální metody

Datové struktury 1: Základní datové struktury

Dědičnost (inheritance)

PB161 Programování v jazyce C++ Přednáška 3

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

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

Úvod do programovacích jazyků (Java)

Programování v C++ 1, 6. cvičení

Dynamické datové struktury III.

Více o konstruktorech a destruktorech

Zápis programu v jazyce C#

Standardní algoritmy vyhledávací.

Iterator & for cyklus

Datové typy v Javě. Tomáš Pitner, upravil Marek Šabo

Fakulta elektrotechniky a informatiky Univerzita Pardubice 2014/2015. poslední přednáška a materiál k samostudiu

V případě jazyka Java bychom abstraktní datový typ Time reprezentující čas mohli definovat pomocí třídy takto:

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

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

Transkript:

Kolekce, cyklus foreach Jen informativně Kolekce = seskupení prvků (objektů) Jednu již známe pole (Array) Kolekce v C# = třída, která implementuje IEnumerable (ICollection) Cyklus foreach ArrayList pro každý Určen pro procházení kolekcí jen pro čtení, jen celé (pořadí určuje kolekce) Syntaxe: foreach (typprvku prvek in kolekce) Příklad, pole typu int, vytištění na konzoli porovnání s for int[] pole = 1, 2, 3, 4 ; // for for (int i = 0; i < pole.length; i++) Console.WriteLine(pole[i]); // foreach foreach (int prvek in pole) Console.WriteLine(prvek); Pole s automatickým růstem velikosti Jmenný prostor System.Collections Konstruktor: o ArrayList() počáteční kapacita 16 o ArrayList(int capacity) počáteční kapacita capacity ArrayList al = new ArrayList(10); Pracuje s object pomalé Vlastnosti: o int Capacity velikost kolekce Vlastnosti jen pro čtení o int Count aktuální počet prvků v kolekci Přístup přes metody: o public virtual int Add(object value) přidá objekt na konec kolekce pokud Count < Capacity O(1) pokud Count = Capacity (kolekce je plná nutné autozvětšení Capacity ) O(Count) vytvoření nového úložiště + kopie všech prvků o public virtual void Insert(int index, object value) vloží value na pozici index pokud index < Count odsunutí prvků s vyšším indexem 1

pokud index > Count ArgumentOutOfRangeException o public virtual void Remove(object obj) pokusí se najít obj a vyjme jej z kolekce (nenalezen = nic se neděje) porovnání objektů realizuje Object.Equals() (je virtuální!) o Další viz MSDN obsahuje např. i Sort(), BinarySearch(), Reverse(), RemoveRange(), o Příklad: ArrayList al = new ArrayList(); // 16 prvků al.add("malá "); al.add("černá "); al.add("kočka"); // Malá černá kočka al.insert(1, "bílá "); // Malá bílá černá kočka al.remove("černá "); // Malá bílá kočka foreach (string slovo in al) Console.Write(slovo); Přístup jako do pole (přes indexy) o Pozor jen v rozsahu 0; Count, jinak ArgumentOutOfRangeException al[0] = Velká "; // přepíše prvek!!! string text = (string)al[2]; // přetypování nutné Datové struktury datová struktura = kontejner pro uložení informací, obsahuje o o algoritmy (operace nad daty) dělení o základní (obvykle v každém VPJ) proměnná, pole, objekt o odvozené zásobník, fronta, seznam, strom, slovník, graf používají základní datové struktury Starší jazyky nemají, moderní ano (C# v BCL) Spojový seznam (Linked list) pro neomezené délky varianty: o dopředně vázaný prvek 0 1 2 N null hlava Odkazy (referenční proměnné) nutno pamatovat: ukazatel na první prvek (hlava) (konec) 2

lze procházet pouze dopředu o zpětně vázaný 0 1 2 N null predch predch predch (hlava) konec nutno pamatovat: ukazatel na poslední prvek (konec, pata, ocas) lze procházet pouze odzadu o obousměrně vázaný (doubly linked list) 0 1 2 N null null predch predch predch hlava konec průchod oběma směry nevýhoda: sekvenční přístup Základní operace (dopředně vázaný seznam) přidat na konec vložit dovnitř seznamu o vstup: reference na prvek, za (před) který se bude vkládat vyhledat hodnotu o návratová hodnota operace = reference na vyhledaný prvek smazat poslední prvek vyjmout zevnitř seznamu o vstup: reference na mazaný prvek 3

smazat celý seznam Implementace v C# příklad dopředně vázaného seznamu prvků typu int prvek seznamu (node) class Prvek public int hodnota; public Prvek = null; vlastní seznam // odkaz na sebe samu (typ) class Seznam Prvek hlava = null; Prvek konec; // při přidávání nemusíme procházet seznam od začátku v Main: public void PridejNaKonec(int hodnota) Prvek prvek = new Prvek(); prvek.hodnota = hodnota; if (hlava == null) // = prazdny seznam hlava = konec = prvek; return; konec. = prvek; // predchazeji prvek spojime s novym konec = prvek; // operace viz cviceni Seznam S = new Seznam(); S.PridejNaKonec(5); S.PridejNaKonec(10); Generická implementace: class Prvek<T> public T hodnota; public Prvek<T> = null; class Seznam<T> Prvek<T> hlava = null; Prvek<T> konec; public void PridejNaKonec(T hodnota) Prvek<T> prvek = new Prvek<T>(); // dale stejne // v Main: Seznam<int> S = new Seznam<int>(); S.PridejNaKonec(5); // novy prvek = novy konec // odkaz na sebe samu (typ) 4

Seznam v BCL Ve jmenném prostoru System.Collections.Generic (platí i pro další datové struktury) LinkedList<T> obousměrný spoj. seznam, prvky = LinkedListNode<T> Vkládání: o void AddFirst(T value) Na začátek vloží value o void AddLast(T value) Na konec vloží value o void AddAfter(LinkedListNode<T> node, T value) Za prvek node vloží value o void AddBefore(LinkedListNode<T> node, T value) Před prvek node vloží value o Kromě T value lze vkládat i LinkedListNode<T> node (přetížení) Mazání: o bool Remove(T value) vyjme první výskyt value vrací true prvek nalezen a vyjmut, jinak false přetížena i pro LinkedListNode<T> node o void RemoveFirst() vyjme první prvek o void RemoveLast() vyjme poslední prvek o void Clear() vymaže všechny prvky ze seznamu Vyhledávání: o bool Contains(T value) vrací true pokud seznam obsahuje value o LinkedListNode<T> Find(T value) Vyhledá první výskyt value (hledá zepředu) Vrací: odkaz na prvek, pokud nenalezeno null o LinkedListNode<T> FindLast(T value) Jako Find(), ale hledá odzadu Informace: o Vlastnosti jen pro čtení o int Count aktuální počet prvků v seznamu o LinkedListNode<T> First odkaz na první prvek o LinkedListNode<T> Last odkaz na poslední prvek Příklad použití: LinkedList<string> veta = new LinkedList<string>(); veta.addlast("dobrý "); veta.addlast("večer"); veta.addlast(", mami"); veta.remove("večer"); LinkedListNode<string> node = veta.find("dobrý "); // chybí kontrola node na null! 5

veta.addafter(node, "den"); Tvoří zároveň kolekci (implementuje ICollection<T> a další) foreach (string slovo in veta) Console.Write(slovo); Zásobník (Stack) // Dobrý den, mami LIFO Last In First Out (poslední dovnitř, první ven) Vložení položky (Push) Vyjmutí položky (Pop) Vrchol zásobníku (Top) Přidávání prvků na vrchol Dno zásobníku (Bottom) Odebírání o v opačném pořadí než byly vloženy o z vrcholu (znalost pozice i zvnitřku) Použití: Přechodné úložiště, systémové programování (mikroprocesory) Implementace o Přes pole o zpětně vázaný spojový seznam hlava seznamu = vrchol Chybové stavy o Přetečení zásobníku (stack overflow) = push() do plného zásobníku o Podtečení zásobníku (stack underflow) = pop() z prázdného zásobníku Využití o v architektuře počítače o překladač VPJ o rekurze Příklad implementace zásobník přes pole nutno pamatovat vrchol class Zasobnik<T> T[] ; int vrchol = 0; public Zasobnik(int kapacita) = new T[kapacita]; // ukazuje na prvni volny prvek 6

public void Push(T co) if (vrchol >=.Length) throw new InvalidOperationException("Stack Overflow"); [vrchol++] = co; public T Pop() if (vrchol <= 0) throw new InvalidOperationException("Stack Underflow"); return [--vrchol]; // v Main: Zasobnik<int> z = new Zasobnik<int>(5); z.push(-10); z.push(55); int prvek = z.pop(); // 55 z.push(1234); // z: -10, 1243 Zásobník v BCL Třída Stack<T> o Může měnit svoji kapacitu rozšiřování automaticky, zmenšování ručně (oboje časově náročné!!! O(n), viz ArrayList ) Konstruktory: o Stack() vytvoří zásobník o kapacitě 4 prvky o Stack(int capacity) vytvoří zásobník o kapacitě capacity prvků Vkládání: o void Push(T item) vloží item na vrchol zásobníku (plný zásobník = autozvětšení) Vyjímání: o T Pop() vrací prvek z vrcholu zásobníku o T Peek() jako Pop(), ale prvek v zásobníku zůstává o void Clear() vymaže všechny prvky ze zásobníku (kapacita se nemění) Převody na pole: o T[] ToArray() vytvoří nové pole a zkopíruje do něj obsah zásobníku o void CopyTo(T[] array, int arrayindex) zkopíruje obsah zásobníku do již existujícího pole array od indexu arrayindex Vlastnosti jen pro čtení: o Int Count počet prvků v zásobníku (ne kapacita!) Příklad použití: Stack<int> S = new Stack<int>(10); S.Push(10); S.Push(22); S.Push(-33); S.Pop(); S.Push(-1256); int posledni = S.Peek(); // -1256 7

// zasobnik jako kolekce foreach (int prvek in S) Console.WriteLine(prvek); // 10, 22, -1256 // prevod na pole int[] pole = S.ToArray(); // pole: 10, 22, -1256 8