Tablouri si Colectii - Alexandru Ioan Cuza Universityiasimin/csharp/C2_2011 Tablouri si...

Post on 20-Feb-2020

4 views 0 download

transcript

Tablouri si Colectii

Definire tablou.

Tablouri unidimensionale, multidimensionale, de lungimivariabile (jagged arrays).

Colectii nongenerice

Colectii generice

Colectii specializate

Clasificare colectii

Spatiile de nume:

System.Collections;

System.Collections.Generic;

System.Collections.Specialized;

Tablouri - Arrays

• Tablourile au lungimea fixata. Primul element are indexul = 0 (zero).

• Exemplu declarare tablou unidimensional:

int[] numbers = new int[3];

numbers[0] = 1;

numbers[1] = 2;

numbers[2] = 3;

Initializare in momentul crearii:

int[] nums = new int[3] { 1, 2, 3 };

string[] orase = new string[2] { "Iasi", "Botosani" };

Stabilire dimensiune:

int n = 10;

int[] sir = new int[n];

// class Persoana { … }

Persoana[] persoana = new Persoana[2];

Tablouri multidimensionale

• Tablou bidimensional (matrice cu 2 linii

si 3 coloane = 6 elemente):

int[,] nums = new int[2,3];

• Tablou cu 3 dimensiuni: 2*3*4 = 24

elemente:

int[,,] nums3 = new int[2,3,4];

Tablouri de tablouri (jagged arrays)

• Poate fi “vazut” ca un tablou cu o dimensiune in care fiecare element este la randullui un tablou cu o dimensiune.

• Exemplu:

• int[][] nums = new int[2][] {new int[2], new int[3]};

• // elementul nums[0] contine un tablou cu dimensiunea 2, etc.

• Reprezentarea vizuala ar putea fi aceasta:

0 1

----------

* *

* *

*

• Forma de apel:

nums[0][1] = 10;

int x = nums[0][1];

Definitie colectii

• Colectiile contin o grupare de

articole. Colectiile contin obiecte

(tipurile valoare sunt convertite la

tipuri referinta – boxing).

• Element = un articol al colectiei.

Clasificare colectii

• Dupa continut:– Liste de elemente;

– Liste de perechi (cheie, valoare).

• Dupa proprietati – ex:– Sortate

– Nesortate

• Sau– Colectii non-generice

– Colectii generice

– Colectii specializate

Colectii non-generice

• Spatiul de nume: System.Collections

• Clase de baza:

• CollectionBase: clasa de baza abstractapentru o colectie puternic tipizata.

• DictionaryBase: clasa de baza abstractapentru o colectie puternic tipizata de perechi(key, value).

• ReadOnlyCollectionBase: clasa de bazaabstracta pentru colectii non-generice, read-only si puternic tipizate.

Colectii non-generice

• Lista de elemente

• ArrayList: implementeaza interfata IList. Foloseste un tablou a carui dimensiune este modificata in mod dinamic.

ArrayList al = new ArrayList();

al.Add(“Colectie");

al.Add(“ArrayList");

al.Add(“ in .NET");

// scanare elemente

foreach(object o in al)

Console.Write(“ {0} “, o);

Colectii non-generice: ArrayList

• Metode uzuale – consultati MSDN

pentru sintaxa completa:

• Add, AddRange, Clear, Contains,

Insert, InsertRange, Remove,

ToArray, Reverse.

Colectii non-generice: BitArray

• BitArray: zona compacta de valori pe biti, reprezentati ca Boolean (true = bitul este 1; false = bitul este 0).

• Elementele pot fi accesate folosind un index (0 indexul primului element).

int[] nums = new int[3] { 1, 2, 3 };

BitArray ba = new BitArray(nums);

foreach (object o in ba)

Console.Write("{0} ", o);

Rezultat la BitArray

• Citeste de la drepta la stanga

• 1 ���� 0...01

• True False False False False False False False

• False False False False False False False False

• False False False False False False False False

• False False False False False False False False

• 2 ����0...010

• False True False False False False False False

• False False False False False False False False

• False False False False False False False False

• False False False False False False False False

• 3 ����0...011

• True True False False False False False False

• False False False False False False False False

• False False False False False False False False

• False False False False False False False False

Modificare BitArray

int[] nums = new int[3] { 1, 2, 3 };

BitArray ba = new BitArray(nums);

ba[3] = true;

foreach (object o in ba)

Console.Write("{0} ", o);

Rezultat BitArray: ba[3] = true;

• Citeste de la drepta la stanga

• 9 ���� 0...01001• True False False True False False False False

• False False False False False False False False

• False False False False False False False False

• False False False False False False False False

• 2 ����0...010

• False True False False False False False False

• False False False False False False False False

• False False False False False False False False

• False False False False False False False False

• 3 ����0...011

• True True False False False False False False

• False False False False False False False False

• False False False False False False False False

• False False False False False False False False

Colectii non-generice: BitArray

• Metode uzuale – consultati MSDN

pentru sintaxa completa:

• And, CopyTo, Get, Not, Or, Set,

SetAll.

Colectii non-generice: Queue

• Queue: colectie de obiecte si respecta FIFO (First In, First Out).

• Implementeaza colectia ca un tablou circular.

• Coada de mesaje din Windows respectaaceasta structura.

• Queue q = new Queue();

• q.Enqueue(“Mesaj:Desenare fereastra");

• q.Enqueue(“Mesaj:Afisare fereastra");

• q.Enqueue(“Mesaj:Inchide fereastra");

Colectii non-generice: Queue

• Metode uzuale – consultati MSDN

pentru sintaxa completa:

• Clear, Contains, Enqueue, Dequeue,

Peek, CopyTo, etc.

Clase non-generice: Stack

• Stack: colectie de obiecte si respecta

LIFO (Last In, First Out).

• Este implementat ca un buffer circular.

Stack ms = new Stack();

ms.Push(“1");

ms.Push(“0");

ms.Push(“1");

Clase non-generice: Stack

• Metode uzuale – consultati MSDN

pentru sintaxa completa:

• Clear, Contains, CopyTo, Peek, Pop,

Push.

Colectii non-generice

• Lista perechi (key, value):

• Hashtable: colectie de perechi(key,value), bazate pe codul hash al

cheii.

• SortedList: colectie de perechi(key,value) sortate dupa valoarea cheii

si accesibile prin cheie sau index.

Colectii non-generice: HashTable

• Fiecare element este o pereche (key,value) memorat intr-un obiectDictionaryEntry.

• Cheia nu poate fi null, valoarea poate fi.

• Obiectele folosite in cheie trebuie sa suprascrie metodeleObject.GetHashCode (sau interfata IHashCodeProvider) siObject.Equals (sau interfata IComparer).

• Obiectele folosite in cheie trebuie sa fie “immutable”.

• Un obiect este “immutable” daca starea acestuia nu poate fi modificatadupa ce a fost creat.

• Clasa System.String este “immutable”.

var imutabil = new { A = 2, B = 3 }; // creaza un obiect immutable

imutabil.A = 11; // eroare la compilare

Error 1 Property or indexer 'AnonymousType#1.A' cannot be assigned to -- it is read only …

Colectii non-generice: HashTable

• Exemplu

Hashtable ht = new Hashtable();

ht.Add(“IS", “Iasi");

ht.Add(“BT", “Botosani");

ht.Add(“SV", “Suceava");

ht.Add(“RegiuneaNE", “Iasi");

ht[“BC”] = “Bacau”; // proprietatea Item

• Parcurgerea colectiei se face astfel:

foreach( DictionaryEntry de in ht ) {

Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value); }

Observatie: cheile sunt unice, valorile pot fi duplicate.

Colectii non-generice: HashTable

• Obtinerea valorilor

ICollection values = ht.Values;

• Obtinerea cheilor

ICollection keys = ht.Keys;

• Observatie: Tipul pentru values si keys este celfolosit la crearea ht.

• Parcurgere colectie keys:

• foreach (string s in keys){ …}

Colectii non-generice: HashTable

• Metode uzuale – consultati MSDN

pentru sintaxa completa:

• Add, Clear, ContainsKey,

ContainsValue, CopyTo, Remove.

Colectii non-generice: SortedList

• Reprezinta o colectie de perechi (key, value) ce sunt sortate dupa cheie si suntaccesibile prin cheie sau index. Intern exista doua tablouri: unul pentru chei sialtul pentru valori.

• ExempluSortedList sl = new SortedList();

sl.Add(“Z", “Trei");

sl.Add(“Y", “Doi");

sl.Add(“X", “Unu");

Colectii non-generice: SortedList

• Parcurgere lista:

for ( int i = 0; i < sl.Count; i++ )

{

Console.WriteLine( "\t{0}:\t{1}", sl.GetKey(i),

sl.GetByIndex(i) );

}

Colectii non-generice: SortedList

• Metode uzuale – consultati MSDN

pentru sintaxa completa:

• Add, Clear, Contains, GetKeyList,

GetValueList, Count, Item, Keys, etc.

Colectii generice

• Spatiul de nume System.Collections.Generic

• Colectie tip lista de elemente:– HashSet<T>: o multime de obiecte fara elemente duplicate

– SortedSet<T> : obiecte ordonate

– LinkedList<T> : lista dublu inlantuita

– LinkedListNode<T> : un nod in LinkedList<T>

– List<T>

– Queue<T>

– Stack<T>

– SynchronizedCollection<T>: colectie “thread safe”.

– SynchronizedReadOnlyCollection<T>: RO, “thread safe”

• T reprezinta tipul din colectie

Colectii generice - Exemple

• List<int> li = new List<int>();

• li.Add(2);

• li.Add(10);

• List<Persoana> lp = new

List<Persoana>();

• Persoana p1 = new Persoana();

• lp.Add(p1); …

• Analog pentru Queue<T> si Stack<T>.

Colectii generice: LinkedList<T>

• Lista dublu inlantuita. Fiecare nod in obiectul LinkedList <T > estede tipul LinkedListNode <T >. Implementeaza interfata genericaICollection<T>

• Operatii

• Adaugare: ((ICollection<T>)lista).Add(T)– AddAfter(LinkedListNode<T>, T)

– AddAfter(LinkedListNode<T>, LinkedListNode<T>)

– AddBefore(LinkedListNode<T>, T)

– AddBefore(LinkedListNode<T>, LinkedListNode<T>)

– AddFirst(T), AddFirst(LinkedListNode<T>)

– AddLast(T), AddLast(LinkedListNode<T>)

• Eliminare element: Clear, Remove, RemoveFirst, RemoveLast

• Cautare: Find(T), FindLast(T)

• Proprietati: Count, First, Last

• Cererei booleene: Contains(T)

Colectii generice: LinkedList<T>

• Metode extinse (consultati MSDN):– All<T>,

– Any<T>(),

– AsParallel(),

– AsParallel<T>(),

– AsQueryable(), AsQueryAble<T>(),

– Concat<T>,

– Contains<T>(T),

– Distinct<T>(),

– First<T>(),

– GroupBy…

Colectii generice: LinkedList<T> -

Exemple

• LinkedList<int> lst = new LinkedList<int>(new int[5] { 4, 2, 5, 9, 7 });

• ((ICollection<int>)lst).Add(8); // trebuie cast

• lst.AddFirst(1);

• lst.AddLast(99);

• lst.AddLast(100);

• var query = lst.AsQueryable<int>();

• var max = lst.Max<int>();

• var items = from x in query //lst este de asemenea corect

• where (x%2 == 1 /*&& x > 10*/)

• orderby x

• select x;

• Console.WriteLine("\nNumere impare: Valoarea maxima in sir = {0}", max);

• foreach (int k in items)

• Console.WriteLine("{0} ", k);

• var itemc = lst.Contains<int>(99); // returneaza True sau False

• Console.WriteLine("Exista valoarea 99 in sir? {0}", itemc);

Colectii generice

• KeyedByTypeCollection<TItem>

– Colectie in care articolele sunt tipuri ce

servesc drept chei.

• Colectii tip perechi (key, value)

– Dictionary<T,U>

– SortedList<T,U>

– SortedDictionary<T,U>

Colectii generice : Dictionary<T,U>

Dictionary<string, string> di = new

Dictionary<string, string>();

di.Add(“Z", “Trei");

di.Add(“Y", “Doi");

di.Add(“X", “Unu");

– Iterarea elementelor:

• foreach( KeyValuePair<string, string> kvp in

di ) { Console.WriteLine("Key = {0}, Value =

{1}", kvp.Key, kvp.Value); }

Colectii generice : Dictionary<T,U>

: Operatii

• Adaugare: Add

• Stergere: Clear, Remove

• Cautare: ContainsKey,

ContainsValue

Colectii generice : SortedList<T,U>,

SortedDictionary<T,U>

• Colectie perechi (key, value) bazate

pe implementarea interfetei

IComparer<T>.

• Diferenta consta in timpul de

regasire al articolelor si al memoriei

ocupate. SortedList permite

regasirea informatiei si pe baza de

index.

Colectii generice: SortedList<T,U>

SortedList<string, string> sl = new SortedList<string, string>();

sl.Add(“Z", “Trei");

sl.Add(“Y", “Doi");

sl.Add(“X", “Unu");

Iterarea elementelor:

foreach( KeyValuePair<string, string> kvp in sl) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); }

Iterarea valorilor:

IList<string> slValues = sl.Values;

foreach( string s in slValues ) { Console.WriteLine("Value = {0}", s); }

Regasire valoare prin index:

String s = sl.values[2];

Colectii generice:

SortedDictionary<T,U>

SortedDictionary<string, string> sd = new SortedList<string, string>();

sd.Add(“Z", “Trei");

sd.Add(“Y", “Doi");

sd.Add(“X", “Unu");

Iterarea elementelor:

foreach( KeyValuePair<string, string> kvp in sd) { Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value); }

Iterarea valorilor:

SortedDictionary<string, string>.ValueCollection sdValues = sd.Values;

foreach( string s in sdValues ) { Console.WriteLine("Value = {0}", s); }

SortedDictionary<string, string>.KeyCollection sdKeys = sd.Keys;

Etc.

Exercitii

• Se doreste sa se sorteze cheile

si/sau valorile continute intr-o

colectie generica Dictionary si sa se

afiseze in ordine crescatoare sau

descrescatoare.

Exercitii

• In cadrul aplicatiei Dv. memorati date in colectii de tip ArrayList, List<T>, Hashtable sau Dictionary<T,U>. Folositiaceste date pentru a personaliza aplicatia(de ex. aplicatia va sti la relansare punctulunde a fost oprita ultima data).

• Scrieti codul necesar pentru a realizaacest lucru, precum si o aplicatie de test.

• Indicatie: Vedeti documentatia din MSDN pentru serializarea obiectelor -SerializableAttribute.

Exercitii

• Se considera urmatorul tip:

public class Info

{ public Info(int n)

{ this.n = n; }

public int n = 0;

}

In cadrul unei aplicatii construiti o lista de obiecte de tip Data:

List<Info> numere = List<Info>();

Populati aceasta lista – minim 5 elemente. Fara a crea o alta lista scrieti codulce va aduna la fiecare element din lista valoarea 10. Testati. Veti afisaelementele adaugate in lista si apoi elementele modificate. Afisatielemetele ce contin numere impare in aceasta lista.

Indicatie: Vedeti Foreach.

Exercitii

• Implementati un tip ce va fi memorat ca elemente intr-un array sauArrayList si pentru care sa puteti folosi metodele: Array.Sort siArrayList.Sort pentru a realiza sortarea elementelor din array. Acest tip trebuie implementat astfel incat sa-l puteti folosi in SortedList.

• Exemplu:

class Segment {

int x1;

int y1;

int x2;

int y2;

//…

}

Acest tip poate fi sortat avand in vedere lungimea segmentului sau poate fiordonat dupa valorile unei perechi (x1, y1), etc.

Indicatie: Interfetele IComparable si IComparer.

Exercitii

• Implementati algoritmul HeapSort

pentru colectia List<int>.