1. Trang chủ
  2. » Công Nghệ Thông Tin

nền tảng lập trình c bài 8 collection và generics

75 355 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Nền tảng lập trình C bài 8 Collection và Generics
Trường học Trường Đại Học Khoa Học Tự Nhiên TP.HCM
Chuyên ngành Lập trình C
Thể loại Bài giảng
Thành phố TP.HCM
Định dạng
Số trang 75
Dung lượng 494 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

• Collections tập hợp là các lớp hỗ trợ thu thập và quản lý các đối tượng − Một cách có thứ tự − Hỗ trợ lưu, tìm kiếm và duyệt các đối tượng trong tập hợp • Namespace System.Collections

Trang 3

Collections (tập hợp) là các lớp hỗ trợ thu thập và

quản lý các đối tượng

− Một cách có thứ tự

− Hỗ trợ lưu, tìm kiếm và duyệt các đối tượng trong tập hợp

Namespace System.Collections của NET Framework

cung cấp nhiều kiểu tập hợp khác nhau

− Cần dùng collection nào trong từng trường hợp cụ thể ?

Trang 4

Các kiểu collection thông dụng

Trang 5

Thêm và xóa phần tử

− Lớp ArrayList là lớp cơ bản nhất nằm ẩn bên trong tấtLớp ArrayList là lớp cơ bản nhất, nằm ẩn bên trong tất

cả các lớp còn lại

− Thêm và xóa phần tử khỏi ArrayList rất đơn giản.p y g

Add

AddRange

Trang 6

Nhiều kiểu dữ liệu khác

coll Add (50);

coll Add (new object());

50 object

2 3

Nhiều kiểu dữ liệu khác nhau có thể được lưu trong ArrayList

Trang 7

coll AddRange (anArray);

object[] anotherArray=new object[]{new object(),new

ArrayList()}; y ()};

coll AddRange (anArray);

Trang 8

Thêm phần tử

− ArrayList cung cấp phương thức Insert và InsertRangeArrayList cung cấp phương thức Insert và InsertRange

hỗ trợ thêm phần tử vào 1 vị trí xác định

ArrayList coll = new ArrayList();

coll Insert ( 1 , "Hey all");

string[] moreString = new string[] {"good night","see you"};

coll InsertRange ( 3 , moreString);

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

Trang 9

Thêm phần tử

− ArrayList hỗ trợ gán giá trị cho đối tượng trongArrayList hỗ trợ gán giá trị cho đối tượng trong

collection thông qua index của đối tượng

coll[3]=“du lieu”;

Chỉ gán giá trị/ ghi đè giá trị cũ

Không thêm mới phần tử g p

Trang 11

Xóa phần tử

// ó hầ tử dù R // xóa phần tử dùng Remove coll.Add(“du lieu”);

coll Remove (“du lieu”);

Remove

coll Remove ( du lieu );

// xóa phần tử dùng RemoveAt coll RemoveAt (0);

// ó hầ tử dù R R

RemoveAt

// xóa phần tử dùng RemoveRange coll RemoveRange (0,4);

RemoveRange

Trang 14

Console WriteLine(item);

foreach

Console.WriteLine(item);

}

Trang 15

Sắp xếp phần tử

− ArrayList hỗ trợ phương thức Sort để sắp xếp cácArrayList hỗ trợ phương thức Sort để sắp xếp các

phần tử trong collection

coll Sort ();

Phương thức Sort dùng lớp Comparer thực hiện so sánh

Comparer thực thi interface IComparer

Phương thức Sort cho phép chỉ định đối tượng IComparer thay cho đối tượng mặc định

coll Sort ( ( new CaseInsentitiveComparer p ()); ());

Có thể tự tạo Comparer nếu có nhu cầu

Trang 16

Danh sách tuần tự

− Là một collection

− Chỉ cho phép truy xuất tuần tự từng phần tử

− Mỗi lần chỉ truy xuất 1 phần tử

− Mỗi lần chỉ truy xuất 1 phần tử

Trang 17

Queue

Trang 18

Queue Q

− Là danh sách tuần tự hỗ trợ truy xuất phần tử tuần tự

theo mô hình first-in, first-out (FIFO)

Thêm phần tử vào cuối danh sách

Lấy phần tử đầu ra khỏi danh sách

Trang 19

q q

Trang 21

− Là danh sách tuần tự hỗ trợ truy xuất phần tử theo mô hình last in first out (LIFO)

hình last-in, first-out (LIFO)

Thêm phẩn tử vào cuối danh sách

Lấy phần tử cuối ra khỏi danh sách y p

− Một số thuộc tính và phương thức quan trọng

Thuộc tính

–– Count Count

Phương thức

–– Pop Pop –– Push Push –– Peek Peek

Trang 22

s s

Trang 24

Tập hợp lưu các phần tử có thứ tự theo từng

cặp key/ value ặp y

Trang 26

HashTable

ánh xạ(map) một key vào 1 value

ánh xạ(map) một key vào 1 value

tạo lookup-table map một key duy nhất với 1 value duy nhất

− Lớp HashTable dùng cách trên để lưu trữ các cặp key/ value

HashTable emailLookup=new HashTable();

emailLookup.Add(“sbishop@contoso.com”,”Bishop, Scott”);

emailLookup[“sbishop@contoso.com”]=“Bishop, Scott”;

emailLookup[ sbishop@contoso.com ] Bishop, Scott ;

Trang 27

− Từ điển được dùng để tìm kiếm các cặp key/valueÆ

ầduyệt các phần tử sẽ không trực quan

HashTable emailLookup=new HashTable();

System Collections DictionaryEntry

emailLookup[“sbishop@contoso.com”]=“Bishop, Scott”;

emailLookup[“chess@contoso.com”]=“Hess, Christian”;

emailLookup[“djump@contoso com”]=“Jump Dan”;

System.Collections.DictionaryEntry System.Collections.DictionaryEntry System.Collections.DictionaryEntry

emailLookup[ djump@contoso.com ]= Jump, Dan ;

foreach (object name in emailLookup){

Console.WriteLine(name);

}

Trang 28

HashTable

Chỉ duyệt các đối tượng bên trong Dictionary

Không duyệt trực tiếp key/ value g yệ ự p y

foreach (DictionaryEntry entry in emailLookup){

Trang 29

− Lớp HashTable sử dụng 1 số nguyên (gọi là hash) hỗ

trợ việc lưu trữ các key

HashTable sử dụng số hash để tăng tốc quá trình tìm kiếm

1 key trong collection y g

HashTable cho phép có 1 giá trị hash duy nhất làm key, các value có thể trùng nhau

Trang 30

key1 và key 2 là 2

public class Fish{ Hastable h=new HashTable();

key1 và key 2 là 2 object khác nhauÆsố hash khác nhau

string name;

public Fish(string _name){

();

Fish key1=new Fish(“Herring”);

Fish key2=new Fish(“Herring”);

Trang 32

SortedList

− Là một lớp từ điển

SortedList s=new SortedList();

Trang 33

thay đổi khi thêm/ xóa phần tử.

− Có thể chỉ định IComparer khi tạo SortedList để điều

khiển cách thức sắp xếp của danh sáchkhiển cách thức sắp xếp của danh sách

SortedList s=new SortedList(new DescendingComparer());

Trang 34

Khi các từ điển chuẩn (standard dictionary) giới hạn

về chức năng/ thể hiện, NET hỗ trợ 3 loại từ điển

Trang 35

ListDictionary

Cần nhiều tài nguyên

Gặp trở ngại về thể hiện với những tập hợp nhỏ (<10 phần tử)

− ListDictionary:

Hoạt động như một mảng đơn giản

Hiệ ả h tậ h hỏ

Hiệu quả cho tập hợp nhỏ

Có cùng interface với HashTable

Trang 37

− Có cùng interface với HashTable

− Được dùng khi không biết rõ số phần tử của tập hợp

HybirdDictionary thực thi như một ListDictionary

Tự động chuyển thành HashTable khi số phần tử tăng lên Tự động chuyển thành HashTable khi số phần tử tăng lên quá nhiều (1 cách ngầm định)

HybirdDictionary emailLookup=new HybirdDictionary();

emailLookup[“sbishop@contoso com”]=“Bishop Scott”;

emailLookup[“chess@contoso.com”]=“Hess, Christian”;

emailLookup[“djump@contoso.com”]=“Jump, Dan”;

foreach (DictionaryEntry entry in emailLookup){

Trang 38

OrderedDictionary

− Nếu cần chức năng của HashTable và quản lý thứ tựNếu cần chức năng của HashTable và quản lý thứ tự

của các phần tử trong tập hợp ?

Không truy xuất phần tử qua index

Gặp giới hạn khi duyệt với enumerator

Xây dựng từ điển truy xuất nhanh

Quản lý các phần tử một cách có thứ tự

Trang 39

OrderedDictionary

− Bổ sung thêm 1 số phương thức và thuộc tính hỗ trợ

truy xuất phần tử qua chỉ mụcy p q

Thuộc tính

–– Item Item

Phương thức

–– Insert Insert –– RemoveAt RemoveAt

Trang 40

Các tập hợp đã trình bày ở trên đều cho phép lưu trữ

phần tử có kiểu dữ liệu bất kỳ

− Cần ép kiểu khi truy xuất các phần tử

.NET cung cấp namespace

System.Collections.Specialized chứa các tập hợp hỗ

trợ xử lý các kiểu dữ liệu xác định

Trang 42

BitArray

− Là tập hợp có thể thay đổi kích thước

Phải khai báo kích thước ban đầu

Không tự động thay đổi kích thước

− Hỗ trợ các thao tác cơ bản trên dữ liệu bit như

Trang 43

BitArray

− Khi khởi tạo: giá trị mặc định các phần tử là false

− Chức năng mạnh nhất của BitArray là thực hiện các

phép toán trên bit với 2 đối tượng BitArray có cùng

kích thước

Trang 44

BitVector32

− Thích hợp cho việc xử lý các bit của một số lớn

Dữ liệu dược lưu dưới dạng số nguyên 32 bit

Mọi xử lý trên BitVector32 sẽ thay đổi giá trị của số ọ ý y g ị nguyên chứa trong nó

Lấy giá trị số nguyên thông qua thuộc tính Data

− Không thể thay đổi kích thước

Kích thước cố định : 32 bit

Trang 45

BitVector32 - Bit Mask

− Cho phép tạo bit mask theo thứ tự tuần tự thông quaCho phép tạo bit mask theo thứ tự tuần tự thông qua

phương thức tĩnh CreateMask.

− Ví dụ: gán giá trị cho 4 bit đầu tiên của 1 số nguyên g g g y

32 bit

Trang 46

BitVector32 - Bit Mask

− Tạo thể hiện BitVector32 Tạo thể hiện BitVector32 BitVector32 v=new BitVector32(0);

− Tạo mask cho bit đầu

tiên

BitVector32 v new BitVector32(0);

int fBit=BitVector32.CreateMask();

− Tạo bit mask thứ 2 với

tham số là bit mask trước

int cBit=BitVector32.CreateMask(fBit);

trước

− Lặp lại bước trên cho tới

khi tạo xong 4 bit mask

int tBit=BitVector32.CreateMask(cBit);

i f Bi Bi V 32 C M k( Bi ) int foBit=BitVector32.CreateMask(tBit);

Trang 47

BitVector32 - Bit Packing

Trang 49

CollectionString

− Chỉ lưu chuỗi ký tự

StringCollection coll=new StringCollection();

Trang 50

StringDictionary

Key/value đều có kiểu String

StringDictionary dict=new StringDictionary();

dict[“First”]=“1 st”;

dict[“ Second ”]=“2 nd ”;

dict[“ second ”]=“second”;

string second= g dict[“Second”] [ ] ; // 2 nd

Trang 51

NameValueCollection

− Tương tự StringDictionary

Key/ value đều có kiểu String

Cho phép có nhiều value cho 1 key

Truy xuất value thông qua chỉ mục và key

− Truy xuất phần tử: phương thức GetValuesy p p g

Trang 52

NameValueCollection

NameValueCollection nv=new NameValueCollection();

nv Add (“Key”,”Some Text”);

nv Add (“Key”,”More Text”);

foreach (string s in nv ( g GetValues (“Key”)){ ( y )){

Console.WriteLine(s);

}

Trang 53

nv Add ("Second", "Second");

Console WriteLine("First length:"+nv GetValues("First") Length);

Console.WriteLine("Second length:"+nv.GetValues("Second").Length);

Trang 54

NameValueCollection

nv Add (“First", “1st");

nv Add ("Second", "2nd");

nv Add ("Second", "Second");

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

Console WriteLine(nv[i]);

}

Trang 55

Khái niệm

Trang 56

Khái niệm

− Generic là 1 phần trong hệ thống kiểu của NETGeneric là 1 phần trong hệ thống kiểu của NET

Framework cho phép định kiểu mà không quan tâm nhiều đến các chi tiết bên trong

Trang 57

Các khai báo Generic

được xác định khi sử dụngTạo kiểu Generic

thường

Trang 58

Các khai báo Generic

Chỉ định kiểu của kiểu generic sử dụng

Obj oa=new Obj(“Hello”,”World!”); j j( , ); Obj oa=new Obj(10.125,1000);

Trang 59

Các khai báo Generic

Obj oa=new Obj(10.125,1000);

Console.WriteLine((int)oa.t+ Runtime

ERROR

Trang 60

Các khai báo Generic

− Generic cũng có giới hạn khi ta xây dựng lớp hỗ trợ tấtGeneric cũng có giới hạn khi ta xây dựng lớp hỗ trợ tất

Trang 61

class CompGen<T> where T : IComparable{

return t2;

}

Compile error : kiểu generic T không định nghĩa phương thức CompareTo

}

}

CompareTo

Trang 62

Khái niệm

Trang 63

Khái niệm

Trang 64

Giới thiệu các lớp Generic

Trang 65

− Tạo danh sách có thứ tự với kiểu dữ liệu xác địnhạ ự ệ ị

− Khi tạo List, ta có thể:

Thêm phần tử vào danh sách p

Truy xuất phần tử qua chỉ mục

Dùng cấu trúc foreach duyệt danh sách

Trang 66

foreach (int i in intList){

foreach (int i in intList){

Console.WriteLine(intList[i]);

}

Trang 67

− Là phiên bản type-safety của Queuep yp y Q

Chỉ định kiểu dữ liệu khi khởi tạo

EnQueue: thêm phần tử với kiểu dữ liệu của Queue

DeQueue: lấy phần tử có kiểu của Queue

Queue<String> q=new Queue<String>();

E Q (“H ll ”)

q.EnQueue(“Hello”);

String qString=q.DeQueue();

Trang 68

Stack<>

− Là phiên bản type-safety của Stackp yp y

Chỉ định kiểu dữ liệu khi khởi tạo

Push: thêm phần tử với kiểu dữ liệu của Stack

Pop: lấy phần tử có kiểu của Stack

Stack<String> s=new Stack<String>();

P h(“H ll ”)

s.Push(“Hello”);

String sString=s.Pop();

Trang 69

− Có nhiều điểm tương đồng với HashTable,ListDictionary và HybirdDictionary

− Không giống với List<>, Queue<> và Stack<>,Dictionary<> lưu 1 cặp key/ value trong tập hợp.y ặp y g ập ợp

Khai báo 2 tham số generic khi khởi tạo

Dictionary<int,string> dict=new Dictionary<int,string>();

Trang 70

Di ti

Dictionary<>

− Duyệt các phần tử: dùng foreach với kiểu

KeyValuePair<>

KeyValuePair<> nhận 2 tham số như của Dictionary<>

foreach (KeyValuePair<int,string> i int dict){

Console.Write(“{0}= {1}”,i.Key,i.Value);

}}

Trang 71

− Tương tự như Dictionary<>

SortedList<string,int> sortList=new SortedList<string,int>();

Trang 72

S t dDi ti

SortedDictionary<>

− Tương tự như Dictionary<>

SortedDictionary<string,int> sortDict=new SortedDictionary<string,int>();

Trang 73

− Là kiểu tập hợp mới của NET

− Là tập các phần tử, các phần tử có liên kết với nhau

− Với mỗi phần tử, có thể truy xuất phần tử trước và sau

nó mà không cần truy xuất đến tập hợp

Mỗi LinkedListNode là 1 phần tử của LinkedList

Mỗi LinkedListNode là 1 phần tử của LinkedList

Trang 75

Thanks

Ngày đăng: 23/05/2014, 15:58

TỪ KHÓA LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm