CHƢƠNG VI: SỬ DỤNG CÁC TẬP HỢP TRONG C# 1 Khái niệm tập hợp

Một phần của tài liệu bài giảng lập trình hướng đối tượng c (Trang 68)

1. Khái niệm tập hợp

Trong chương II, chúng ta đã tìm hiểu về mảng (array). Mảng là một tập hợp các phần tử có cùng một kiểu dữ liệu. Kiểu dữ liệu ở đây có thể là các kiểu dữ liệu được định nghĩa sẵn hoặc là các lớp đối tượng do người dùng định nghĩa.

Tuy nhiên, khi sử dụng mảng, người lập trình phải khai báo trước số phần tử của mảng hay gọi là kích thước của mảng để cấp phát bộ nhớ với không gian đủ lớn để lưu trữ số lượng cho trước phần tử của mảng. Người lập trình không thể thay đổi được kích thước này. Điều đó có nghĩa là trong trường hợp người lập trình không dùng hết số phần tử đã khai báo hoặc muốn dùng thêm một số phần tử nữa thì cũng không thể tùy biến thay đổi được.

Một vấn đề nữa khi sử dụng mảng đó là các phần tử trong một mảng tiên quyết phải thỏa mãn điều kiện là chúng phải cùng một kiểu.

Vì những lý do nêu trên nên việc sử dụng mảng thế có thể dẫn tới việc lãng phí bộ nhớ hoặc hạn chế trong việc lưu trữ và xử lý dữ liệu.

.Net framework cung cấp cho chúng ta một số lớp đối tượng và giao diện cho phép lưu trữ và xử lý các cấu trúc dữ liệu phức hợp gồm nhiều phần tử gọi chung là các tập hợp một cách linh hoạt hơn. Sau đây, chúng ta sẽ tìm hiểu cách sử dụng các cấu trúc dữ liệu tập hợp thông qua ngôn ngữ lập trình C#. Không gian tên System.Collections trong C# cho phép thiết lập và thao tác với các đối tượng tập hợp. Các tập hợp này có thể chứa các phần tử thuộc các kiểu dữ liệu khác nhau.

Hình (VI.1) Các lớp đối tƣợng tập hợp trong System.Collections 1.2. Một số lớp tập hợp

Một số lớp hỗ trợ thao tác với tập hợp được trình bày trong Bảng (VI.1) Tên lớp tập hợp Mô tả

ArrayList Tập hợp giống như mảng chỉ khác là các phần tử có thể thuộc các kiểu dữ liệu khác nhau và được chủ động thêm vào hay bỏ đi một cách linh động

Stack Tập hợp hoạt động theo cơ chế truy cập Last-In-First-Out (LIFO), nghĩa là phần tử được thêm vào cuối cùng sẽ được lấy ra đầu tiên

Queue Tập hợp hoạt động theo cơ chế truy cập First-In-First-Out (FIFO), nghĩa là phần tử đầu tiên được thêm vào thì sẽ được lấy ra đầu tiên

Hashtable Tập hợp bao gồm các cặp (<khóa>, <giá trị>) phân bố theo cơ chế bảng băm

SortedList Tập hợp gồm các cặp (<khóa>, <giá trị>) trong đó các phần tử được sắp xếp theo <khóa>

Bảng (VI.1) Một số lớp tập hợp 1.3. Một số giao diện (interface) tập hợp

Một số giao diện (interface) hỗ trợ thao tác với các tập hợp được trình bày trong Bảng (VI.2) Tên giao diện tập hợp Mô tả

ICollection Tập trung vào kích thước và các phương thức để đồng bộ với các tập hợp

IEnumarator Hỗ trợ các thao tác lặp qua các phần tử của tập hợp

IList Biểu diễn các tập hợp phần tử mà có thể truy nhập thông qua chỉ số của chúng

Bảng (VI.2) Một số giao diện tập hợp 2. Danh sách (ArrayList)

Danh sách (ArrayList) là mảng với chiều dài biến thiên, nghĩa là kích thước có thể tăng hay giảm một cách linh động. Khác với mảng (Array) các phần tử của danh sách có thể thuộc các kiểu dữ liệu khác nhau, có thể nhận giá trị null và cũng có thể nhận các phần tử có giá trị trùng lặp

Ngầm định, không gian của danh sách là 16 phần tử. Nếu số phần tử lập đầy không gian hiện thời của danh sách thì không gian sẽ tự động được nới rộng ra gấp đôi.

2.1. Khởi tạo

Để sử dụng danh sách trước hết ta phải tạo đối tượng theo các phương thức khởi tạo sau

Hàm tạo Mô tả

ArrayList() Khởi tạo đối tượng ArrayList với không gian ngầm định

ArrayList(ICollection) Nhận tham số vào kiểu ICollection và khởi tạo đối tượng ArrayList chứa các phần tử thuộc kiểu ICollection. Số phần tử bằng số phần tử sao chép từ tập hợp đã có

ArrayList(int) Khởi tạo đối tượng ArrayList với không gian là số phần tử bằng với tham số truyền vào

Bảng (VI.3) Các phƣơng thức khởi tạo danh sách (ArrayList) 2.2. Thuộc tính và phƣơng thức

Các thuộc tính của danh sách Tên thuộc tính Mô tả

Capacity Số phần tử mà danh sách có thể lưu

Count Số phần tử hiện tại được lưu trong danh sách Item Đọc/ghi giá trị cho một phần tử tại một vị trí cụ thể

Bảng (VI.4) Các thuộc tính của danh sách (ArrayList)

Các phương thức của danh sách Tên phương thức Mô tả

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

Remove Xóa lần xuất hiện đầu tiên của một phần tử xác định trong danh sách

RemoveAt Xóa phần tử tại vị trí có chỉ số index xác định

Insert Chèn một phần tử vào danh sách tại vị trí có chỉ số xác định Contains Kiểm tra sự xuất hiện của một phần tử trong danh sách

CopyTo Sao chép các phần tử trong danh sách sang mảng được truyền vào trong tham số

IndexOf Trả về vị trí chỉ số của lần xuất hiện đầu tiên của một phần tử xác định trong danh sách

ToArray Sao chép các phần tử của danh sách sang mảng các đối tượng TrimToSize Chỉnh lại không gian của danh sách cho bằng số phần tử hiện tại

của danh sách

Bảng (VI.5) Các phƣơng thức của danh sách (ArrayList) Ví dụ (VI.1) Sử dụng danh sách (ArrayList)

Bước 1: Mở Visual Studio

Bước 2: Chọn menu File->New->Project để tạo một dự án console với tên „ArrayListDemo‟ và tên Solution là Session_VI

Bước 3: Sửa lớp Program.cs theo mã lệnh bên dưới. Lưu ý trước khi thêm mã lệnh bên dưới vào lớp Program phải khai báo sử dụng không gian tên System.Collection bằng từ khóa using using System.Collections; namespace ArrayListDemo { class Program {

static void Main(string[] args) {

ArrayList AList = new ArrayList(); AList.Add(1);

AList.Add(2);

AList.Add("John");

AList.Add(new DateTime(2012, 06, 12)); AList.Insert(2, "Carter");

Console.WriteLine("Count: {0}", AList.Count);

Console.WriteLine("Capacity: {0}", AList.Capacity); for (int i = 0; i < AList.Count; i++)

Console.WriteLine("Value: {0}", AList[i]); Console.ReadLine();

} } } }

Bước 4: Dịch và chạy chương trình

Hình (VI.2) Màn hình hiển thị Ví dụ (VI.1)

Trong Ví dụ (VI.1) thể hiện cách sử dụng danh sách ArrayList. Trước hết ta cũng khởi tạo một đối tượng ArrayList bằng từ khóa new và gọi hàm khởi tạo không tham số. Tiếp theo, ta gọi phương thức Add() để thêm vào danh sách các phần tử như số 1, 2, chuỗi “John” hoặc ngày tháng (12 06 2012). Ta cũng có thể gọi phương thức Insert() để chèn thêm phần tử có giá trị là chuỗi “Carter” và vị trí có chỉ số bằng 2. Cuối cùng ta hiển thị thuộc tính Count,

Capacity và dùng vòng lặp for để hiển thị giá trị của từng phần tử lên màn hình. Qua ví dụ ta có thể thấy danh sách ArrayList có thể lưu trữ các phần tử thuộc các kiểu dữ liệu khác nhau và việc sử dụng các thuộc tính và phương thức của đối tượng này để xử lý dữ liệu rất linh động

Bước 1: Thêm một dự án console với tên „StudentList‟ vào solution Session_VI

Bước 2: Thiết lập „StudentList‟ là dự án mặc định bằng cách click chuột phải vào tên dự án và chọn Set As Statup Project

Bước 3: Thêm một lớp có tên Student.cs vào dự án và chèn mã lệnh như sau

class Student {

int id; string name;

public Student(int i, string n) {

id = i; name = n; }

public void Display() {

Console.WriteLine("Id: {0}, name: {1}", id, name); }

}

Bước 4: Sửa lớp Program.cs theo mã lệnh bên dưới. Lưu ý trước khi thêm mã lệnh bên dưới vào lớp Program phải khai báo sử dụng không gian tên System.Collection bằng từ khóa using using System.Collections; namespace StudentList { class Program {

static void Main(string[] args) {

ArrayList AList = new ArrayList(); AList.Add(1);

AList.Add(2);

AList.Add("John");

AList.Add(new DateTime(2012, 06, 12)); AList.Add(new Student(1, "Cathry")) AList.Insert(2, "Carter");

Console.WriteLine("Count: {0}", AList.Count);

Console.WriteLine("Capacity: {0}", AList.Capacity); foreach (object o in AList)

Console.WriteLine("Value: {0}", o); Console.ReadLine();

} } } }

Hình (VI.3) Màn hình hiển thị Ví dụ (VI.2)

Trong Ví dụ (VI.2) cho thấy ta có thể sử dụng ArrayList để lưu trữ đối tượng thuộc lớp Student do ta tự định nghĩa. Và để truy cập từng phần tử của danh sách ta cũng có thể dùng vòng lặp for…each

Một phần của tài liệu bài giảng lập trình hướng đối tượng c (Trang 68)