Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
117,59 KB
Nội dung
Kiểu từ điển Kiểu từ điển Bởi: Khuyet Danh Để tìm thấy giá trị từ điển tưởng tượng muốn giữ danh sách thủ phủ bang Một hướng tiếp cận đặt chúng vào mảng theo thứ tự anphabe sau: string[] stateCapitals = new string[50]; Mảng stateCapital nắm giữ 50 thủ phủ bang Mỗi thủ phủ truy cập khoảng dời (offset) mảng Để truy cập thủ phủ bang Arkansas, cần phải biết bang Arkansas nằm vị trí thứ tư thứ tự alphabe danh sách bang, nên ta truy cập sau: string capitalOfArkansas = stateCapitals[3]; Tuy nhiên, thật không thuận tiện khi truy cập thủ phủ bang thông qua cấu trúc mảng Giả sử muốn truy cập thủ phủ bang Massachusett, dễ dàng xác định thứ tự bang thứ 21 theo alphabe Một cách thuận tiện lưu trữ thủ phủ theo tên bang Một từ điển cho phép lưu trữ giá trị (trong trường hợp thủ phủ) với khóa truy cập (là tên bang) Kiểu liệu từ điển NET Framework kết hợp kiểu khóa kiểu chuỗi, số nguyên, đối tượng với kiểu giá trị (chuỗi, số nguyên, kiểu đối tượng) Thuộc tính quan trọng từ điển tốt dễ thêm giá trị vào, nhanh chóng truy cập đến giá trị Một vài từ điển nhanh thời gian thêm giá trị vào, số khác tối ưu cho việc truy cập Một minh họa cho kiểu từ điển kiểu liệu hashtable hay gọi bảng băm Hashtables Hashtable kiểu từ điển tối ưu cho việc truy cập nhanh Một số phương thức thuộc tính kiểu liệu Hashtable trình bày bảng 1/12 Kiểu từ điển Phương thức thuộc tính lớp Hashtable Phương thức- thuộc Mục đích tính Synchronized() Phương thức static trả Hashtable wrapperđược threadsafe Count Thuộc tính trả số thành phần hashtable IsReadOnly Thuộc tính xác định hashtable đọc IsSynchronized Thuộc tính xác định hashtable đồng SyncRoot Thuộc tính trả đối tượng sử dụng đểđồng truy cập Hastable Keys Thuộc tính trả ICollection chứa khóa hashtable Values Thuộc tính trả ICollection chứa giátrị hashtable Add() Thêm thành phần với khóa giá trị xácđịnh Clear() Xóa tất đối tượng hashtable Item() Chỉ mục cho hastable Clone() Tạo Contains() Xác định xem thành phần có hashtable ContainsKey() Xác định xem hashtable có chứa khóa xácđịnh CopyTo() Sao chép thành phần hashtable đếnmảng chiều tồn GetEnumerator() Trả enumerator cho hashtable GetObjectData() Thực thi ISerializable trả liệu cần thiết đểlưu trữ OnDeserialization Thực thi ISerializable phát sinh kiệndeserialization hoàn thành Remove() Xóa thành phần với khóa xác định Trong Hashtable, giá trị lưu trữ vùng Mỗi vùng đánh số tương tự offset mảng Do khóa số nguyên, nên phải chuyển khóa thành khóa số để ánh xạ đến vùng giá trị đánh số Mỗi khóa phải cung cấp phương thức GetHashCode() để nhận giá trị mã hóa thành số Chúng ta nhớ thứ C# dẫn xuất từ lớp object Lớp object cung 2/12 Kiểu từ điển cấp phương thức ảo GetHashCode(), cho phép lớp dẫn xuất tự kế thừa hay viết lại Việc thực thi thông thường phương thức GetHashCode() chuỗi đơn giản cách cộng giá trị Unicode ký tự lại sau sử dụng toán tử chia lấy dư để nhận lại giá trị từ đến số vùng phân hashtable Ta không cần phải viết lại phương thức với kiểu chuỗi Khi thêm giá trị vào Hashtable Hashtable gọi phương thức GetHashCode() cho giá trị mà cung cấp Phương thức trả số nguyên, xác định vùng mà giá trị lưu trữ hashtable.Dĩ nhiên nhiều giá trị nhận chung khóa tức vùng hashtable, điều gọi xung đột Có vài cách để giải xung đột Trong cách chung hỗ trợ CLR cho vùng trì danh sách có thứ tự giá trị Khi truy cập giá trị hashtable, cung cấp khóa Một lần Hashtable gọi phương thức GetHashCode() khóa sử dụng giá trị trả để tìm vùng tương ứng Nếu có giá trị trả về, có nhiều hai giá trị việc tìm kiếm nhị phân thực nội dung vùng Bởi có vài giá trị nên việc tìm kiếm thực thông thường nhanh Khóa Hashtable kiểu liệu nguyên thủy thể kiểu liệu người dùng định nghĩa (các lớp cho người lập trình tạo ra) Những đối tượng sử dụng làm khóa hashtable phải thực thi GetHashCode() Equals() Trong hầu hết trường hợp, sử dụng kế thừa từ Object Giao diện IDictionary Hashtable từ điển ví thực thi giao diện IDictionary IDictionary cung cấp thuộc tính public Item Thuộc tính Item truy cập giá trị thông qua khóa xác định Trong ngôn ngữ C# thuộc tính Item khai báo sau: object this[object key] { get; set;} Thuộc tính Item thực thi ngôn ngữ C# với toán tử mục ([]) Do truy cập item đối tượng từ điển cú pháp giống truy cập mảng Ví dụ sau minh họa việc thêm item vào bảng Hashtable sau truy cập lại chúng thông qua thuộc tính Item thuộc tính Item tương như toán tử offset - 3/12 Kiểu từ điển namespace Programming_CSharp { using System; using System.Collections; public class Tester { static void Main() { // tạo khởi tạo hashtable Hashtable hashTable = new Hashtable(); hashTable.Add("00440123","Ngoc Thao"); hashTable.Add("00123001","My Tien"); hashTable.Add("00330124","Thanh Tung"); // truy cập qua thuộc tính Item Console.WriteLine("myHashtable[\"00440123\"]: hashTable["00440123"]); {0}", } } } Kết quả: hashTable[“00440123”]: Ngoc Thao 4/12 Kiểu từ điển Ví dụ bắt đầu việc tạo bảng Hashtable mới, sử dụng giá trị mặc định dung lượng, phương thức tạo mã băm phương tức so sánh Tiếp sau việc thêm giá trị vào theo thứ tự khóa/giá trị Sau item thêm vào lấy giá trị thông qua khóa với cách thức dùng toán tử offset Tập khóa tập giá trị Các kiểu từ cung cấp thêm hai thuộc tính thuộc tính Keys, thuộc tính Values Trong Keys truy cập đối tượng ICollection với tất khóa Hashtable, Values truy cập đối tượng ICollection với tất giá trị Ví dụ minh họa sau Tập khóa tập giá trị namespace Progrmming_CSharp { using System; using System.Collections; public class Tester { static void Main() { // tạo khởi tạo hashtable Hashtable hashTable = new Hashtable(); hashTable.Add("00440123","Ngoc Thao"); hashTable.Add("00123001","My Tien"); hashTable.Add("00330124","Thanh Tung"); 5/12 Kiểu từ điển // nhận tập khóa ICollection keys = hashTable.Keys; // nhập tập giá trị ICollection values = hashTable.Values; // xuất tập khóa foreach( string s in keys) { Console.WriteLine("{0}", s); } // xuất tập giá trị foreach( string s in values) { Console.WriteLine("{0}", s); } } } } Kết quả: 00123001 00440123 00330124 6/12 Kiểu từ điển My Tien Ngoc Thao Thanh Tung Mặc dù thứ tự keys không đảm bảo theo thứ tự chúng đảm bảo với thứ tự đưa giá trị Như thấy khóa 00123001 tương ứng với My Tien, Giao diện IDictionaryEnumerator Những đối tượng IDictionary hỗ trợ vòng lặp foreach việc thực thi phương thức GetEnumerator(), phương thức trả IDictionaryEnumerator IDictionaryEnumerator sử dụng để liệt kê đối tượng IDictionary Nó cung cấp thuộc tính để truy cập khóa giá trị cho thành phần từ điển Ta có ví dụ minh họa sau: Sử dụng giao diện IDictionaryEnumerator namespace Progrmming_CSharp { using System; using System.Collections; public class Tester { static void Main() { // tạo khởi tạo hashtable Hashtable hashTable = new Hashtable(); 7/12 Kiểu từ điển hashTable.Add("00440123","Ngoc Thao"); hashTable.Add("00123001","My Tien"); hashTable.Add("00330124","Thanh Tung"); Console.WriteLine("hashTable"); Console.WriteLine("Count: {0}",hashTable.Count); Console.WriteLine("Keys and Values:"); Print( hashTable ); } public static void Print(Hashtable table) { IDictionaryEnumerator enumerator = table.GetEnumerator(); while ( enumerator.MoveNext() ) { Console.WriteLine("\t{0}:\t{1}", enumerator.Value); enumerator.Key, } Console.WriteLine(); } } } Kết quả: hashTableg Count: 8/12 Kiểu từ điển Keys and Values: 00123001: My Tien 00440123: Ngoc Thao 00330124: Thanh Tung Câu hỏi trả lời Điều phân biệt mảng thành phần bên mảng? Mảng kiểu liệu tham chiếu, thành phần bên mảng cấp phát dựa theo kiểu liệu chúng Do mảng kiểu liệu tham chiếu không chứa giá trị mà tham chiếu đến thành phần tạo heap Một lớp có mục khác mảng nào? Hoàn toàn khác nhau, mảng đơn đối tượng tham chiếu đến đối tượng khác kiểu liệu Trong lớp có mục chứa mảng giá trị đó, cho phép bên truy cập mảng thông qua mục Một lớp mảng đơn mà có thuộc tính khác, phương thức Nói chung ta cần thao tác đơn phần riên lẻ mảng nên dùng mảng Còn cần thực số chức có liên quan tới mảng ta xây dựng lớp có chứa mảng hỗ trợ mục Giao diện tập hợp gì? Có phải NET cung cấp số giao diện chuẩn hay không? Giao diện tập hợp giao diện đưa quy định thao tác tập hợp như: so sánh, liệt kê tập hợp, tạo tập hợp NET cung cấp số giao diện cho tập hợp như: IEnumerable, ICollection, IComparer, IList Câu hỏi thêm Từ khoá params sử dụng làm gì? Ý nghĩa lệnh lặp foreach? Lệnh sử dụng với kiểu liệu nào? Có kiểu mảng đa chiều ngôn ngữ C# Hãy cho biết loại sử dụng loại cho thích hợp 9/12 Kiểu từ điển Cách tạo mảng đa chiều không kích thước? Hãy cho biết khác hai cách gọi Arr[i][j] Arr[i, j]? Có thể dùng lệnh foreach để xuất tất thành phần mảng đa chiều không kích thước hay không? Nếu phải làm nào? Kiểu liệu làm mục mục lớp? Câuhỏi 8: Làm để biết kích thước mảng? Liệt kê giao diện tập hợp mà NET cung cấp? Cho biết ý nghĩa giao diện? Có cách tạo mảng mà không cần khai báo trước kích thước mảng?Và trình thực mảng tăng động kích thước mảng hay không? Nếu mảng có 31 phần tử dung lượng đối tượng ArrayList bao nhiêu? Trường hợp có 33 phần tử? Hàng đợi gì? Chúng xếp theo kiểu thứ tự nào? Ứng dụng hàng đợi ? Ngăn xếp gì? Chúng xếp theo kiểu thứ tự nào? Ứng dụng ngăn xếp? Phương thức Peek() hàng đợi ngăn xếp có ý nghĩa gì? Kiểu liệu cho phép truy cập giá trị thông qua khóa nó? Lớp NET hỗ trợ kiểu liệu này? Cách lấy tập giá trị đối tượng Hashtable? Câuhỏi 17: Cách lấy tập khóa đối tượng Hastable? Khóa có phải Hastable hay không? Nếu hai vùng có chung khóa chúng tìm kiếm theo kiểu nào? Và tốc độ tìm kiếm? Hashtable thực thi giao diện tập hợp nào? Phương thức thực việc tạo khoá Hashtable? Bài tập 10/12 Kiểu từ điển Viết chương trình tạo mảng chiều nguyên chứa giá trị ngẫu nhiên Sắp xếp thành phần mảng theo thứ tự tăng dần hiển thị kết Làm tương tự với trường hợp xếp mảng theo thứ tự giảm dần Viết chương trình tạo mảng chiều nguyên chứa giá trị ngẫu nhiên Sắp xếp chúng theo thứ tự số âm tăng số dương giảm dần Hiển thị kết hình Viết chương trình tìm số lớn nhỏ mảng hai chiều có kích thước cố định Các thành phần mảng phát sinh ngẫu nhiên Viết chương trình cộng hai ma trận nxm, tức mảng hai chiều có kích thước n dòng, m cột Các giá trị hai mảng phát sinh ngẫu nhiên, cho biết kết cộng hai ma trận? Viết chương trình cho phép người dùng nhập vào ma trận nxm, tìm kiếm giá trị theo yêu cầu người dùng, kết việc tìm kiếm giá trị thứ tự giá trị tìm ma trận Viết chương trình tạo mảng hai chiều không kích thước Cố định số dòng mảng 5, dòng có kích thước giá trị dòng, tứ dòng thứ có kích thước (tức có cột), dòng thứ hai có kích thước (tức cột) Các giá trị phát sinh ngẫu nhiên Hãy xuất kết ma trận theo kiểu sau: a[i][j] = Việc xuất kết ma trận thực vòng lặp foreach không? Nếu viết đoạn chương trình xuất kết quả? Viết chương trình tạo mảng lưu trữ 30 điểm số học sinh Tính trung bình điểm tất học sinh Xuất kết điểm điểm trung bình Viết chương trình tạo lớp tên LopHoc, có khai báo mục đến tên học viên lớp Cho phép lớp có tối đa 30 học viên Tạo chương trình minh họa cho phép người dùng nhập vào tên học viên Xuất kết danh sánh học viên lớp thông qua mục Viết chương trình sử dụng ArrayList để tạo mảng Chương trình tạo vòng lặp cho phép người dùng nhập vào giá trị cho mảng Hãy xuất kết mảng với giá trị Count, Capacity mảng Ta thiết lập giá trị Capacity nhỏ giá trị Count không? 11/12 Kiểu từ điển Viết chương trình tạo đối tượng Queue tên myQueue Khởi tạo myQueue có giá trị ngẫu nhiên Hãy thực bước sau, bước thực phải xuất tình trạng myQueue: Lấy giá trị Lấy tiếp giá trị Xem giá trị đầu queue Đưa vào queue giá trị Viết chương trình tạo đối tượng Stack tên myStack Khởi tạo myStack có giá trị ngẫu nhiên Hãy thực bước sau, bước thực phải xuất tình trạng myStack: Lấy giá trị Lấy tiếp giá trị Xem giá trị đầu stack Đưa vào stack giá trị Viết chương trình sử dụng kiểu liệu từ điển để quản lý thông tin lớp học Trong khóa chuỗi mã số học viên giá trị tên học viên Viết chương trình minh họa cho phép nhập vào 10 học viên, cho phép người dùng tìm kiếm tên học viên thông qua mã số học viên 12/12 [...].. .Kiểu từ điển Viết một chương trình tạo một mảng một chiều nguyên chứa giá trị ngẫu nhiên Sắp xếp các thành phần trong mảng theo thứ tự tăng dần và hiển thị kết quả Làm tương tự với trường hợp sắp xếp mảng... điểm số của học sinh Tính trung bình điểm của tất cả học sinh Xuất kết quả từng điểm và điểm trung bình Viết một chương trình tạo ra một lớp tên là LopHoc, trong đó có khai báo bộ chỉ mục chỉ đến tên của từng học viên trong lớp Cho phép một lớp có tối đa 30 học viên Tạo chương trình minh họa cho phép người dùng nhập vào tên của từng học viên Xuất kết quả danh sánh học viên của lớp thông qua bộ chỉ mục... lặp cho phép người dùng nhập vào các giá trị cho mảng Hãy xuất kết quả mảng cùng với giá trị Count, và Capacity của mảng Ta có thể thiết lập giá trị Capacity nhỏ hơn giá trị Count được không? 11/12 Kiểu từ điển Viết chương trình tạo ra đối tượng Queue tên là myQueue Khởi tạo myQueue có 5 giá trị ngẫu nhiên Hãy thực hiện các bước sau, mỗi bước thực hiện phải xuất tình trạng của myQueue: 1 Lấy một giá... bước sau, mỗi bước thực hiện phải xuất tình trạng của myStack: 1 Lấy một giá trị ra 2 Lấy tiếp một giá trị nữa 3 Xem một giá trị ở đầu stack 4 Đưa vào stack một giá trị Viết chương trình sử dụng kiểu dữ liệu từ điển để quản lý thông tin của một lớp học Trong đó khóa là chuỗi mã số học viên còn giá trị là tên của học viên Viết chương trình minh họa cho phép nhập vào 10 học viên, và cho phép người dùng... chương trình tạo một mảng hai chiều không cùng kích thước Cố định số dòng của mảng là 5, còn từng dòng có kích thước bằng giá trị của dòng, tứ là dòng thứ nhất có kích thước 1 (tức là có 1 cột), dòng thứ hai có kích thước là 2 (tức là 2 cột) Các giá trị phát sinh ngẫu nhiên Hãy xuất kết quả của ma trận theo kiểu sau: a[i][j] = Việc xuất kết quả của ma trận trên có thể thực hiện bằng vòng ... thêm Từ khoá params sử dụng làm gì? Ý nghĩa lệnh lặp foreach? Lệnh sử dụng với kiểu liệu nào? Có kiểu mảng đa chiều ngôn ngữ C# Hãy cho biết loại sử dụng loại cho thích hợp 9/12 Kiểu từ điển. .. 8/12 Kiểu từ điển Keys and Values: 00123001: My Tien 00440123: Ngoc Thao 00330124: Thanh Tung Câu hỏi trả lời Điều phân biệt mảng thành phần bên mảng? Mảng kiểu. .. GetHashCode() để nhận giá trị mã hóa thành số Chúng ta nhớ thứ C# dẫn xuất từ lớp object Lớp object cung 2/12 Kiểu từ điển cấp phương thức ảo GetHashCode(), cho phép lớp dẫn xuất tự kế thừa hay