Trong khi một lớp có bộ chỉ mục thì nó chứa một mảng các giá trị nào đó, và cho phép bên ngoài truy cập mảng này thông qua bộ chỉ mục.. Trả lời 3: Giao diện tập hợp cũng là một giao diện
Trang 13 bộ giá trị vào theo thứ tự khóa/giá trị Sau khi các item đã được thêm vào chúng ta có thể 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 và tập giá trị
Các kiểu từ cung cấp thêm hai thuộc tính là thuộc tính Keys, và thuộc tính Values Trong đó Keys truy cập đối tượng ICollection với tất cả những khóa trong Hashtable,
và Values truy cập đối tượng ICollection với tất cả giá trị Ví dụ 9.18 minh họa như sau
Ví dụ 9.18 Tập khóa và tập giá trị
-
namespace Progrmming_CSharp
{
using System;
using System.Collections;
public class Tester
{
static void Main()
{
// tạo và khởi tạo hashtable Hashtable hashTable = new Hashtable();
hashTable.Add(“00440123”,”Ngoc Thao”);
hashTable.Add(“00123001”,”My Tien”);
hashTable.Add(“00330124”,”Thanh Tung”);
// 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)
{
Trang 2Console.WriteLine(“{0}”, s);
}
// xuất tập giá trị foreach( string s in values)
{
Console.WriteLine(“{0}”, s);
} }
}
}
-
Kết quả:
00123001
00440123
00330124
My Tien
Ngoc Thao
Thanh
Tung
-Mặc dù thứ tự của keys không được đảm bảo theo thứ tự nhưng chúng đảm bảo rằng cùng với thứ tự đưa ra của giá trị Như chúng ta thấy trên khóa 00123001 tương ứng với My Tien,
Giao diện IDictionaryEnumerator
Những đối tượng IDictionary cũng hỗ trợ vòng lặp foreach bằng việc thực thi
phương thức GetEnumerator(), phương thức này trả về một IDictionaryEnumerator IDictionaryEnumerator được sử dụng để liệt kê bất cứ đối tượng IDictionary nào Nó cung cấp thuộc tính để truy cập cả khóa và giá trị cho mỗi thành phần trong từ điển Ta
có ví dụ 9.19 minh họa như sau:
Ví dụ 9.16: sử dụng giao diện IDictionaryEnumerator
-
namespace Progrmming_CSharp
{
using System;
using System.Collections;
Trang 3static void Main()
{
Trang 4// tạo và khởi tạo hashtable Hashtable hashTable = new Hashtable();
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.Key, enumerator.Value);
}
Console.WriteLine();
}
}
}
-
Kết quả:
hashTableg
Count: 3
Keys and Values:
-
Câu hỏi và trả lời
Câuhỏi 1: Điều phân biệt giữa mảng và các thành phần bên trong một mảng?
Trả lời 1: Mảng là kiểu dữ liệu tham chiếu, còn các thành phần bên trong mảng được cấp phát dựa theo kiểu dữ liệu của chúng Do vậy một mảng của kiểu dữ
Trang 5Câuhỏi 2: Một lớp có bộ chỉ mục khác một mảng như thế nào?
Trang 6Trả lời 2: Hoàn toàn khác nhau, một mảng chỉ đơn thuần là một đối tượng tham chiếu đến những đối tượng khác cùng kiểu dữ liệu Trong khi một lớp có bộ chỉ mục thì nó chứa một mảng các giá trị nào đó, và cho phép bên ngoài truy cập mảng này thông qua bộ chỉ mục Một lớp như vậy không chỉ có một mảng đơn thuần mà còn
có những thuộc tính khác, các phương thức Nói chung là nếu ta chỉ cần thao tác đơn thuần trên từng phần riên lẻ của một mảng thì nên dùng mảng Còn nếu chúng ta cần thực hiện một số chức năng nào đó có liên quan tới một mảng thì ta có thể xây dựng một lớp có chứa một mảng và hỗ trợ bộ chỉ mục
Câu hỏi 3: Giao diện tập hợp là gì? Có phải NET cung cấp một số giao diện chuẩn
hay không?
Trả lời 3: Giao diện tập hợp cũng là một giao diện nhưng nó chỉ đưa ra các quy định thao
tác trên tập hợp như: so sánh, liệt kê trên tập hợp, tạo các tập hợp NET cung cấp một số giao diện cho tập hợp như: IEnumerable, ICollection, IComparer, IList
Câu hỏi thêm
Câuhỏi 1: Từ khoá params được sử dụng làm gì?
Câuhỏi 2: Ý nghĩa của lệnh lặp foreach? Lệnh này được sử dụng với kiểu dữ liệu nào? Câuhỏi 3: Có mấy kiểu mảng đa chiều trong ngôn ngữ C# Hãy cho biết từng loại và khi nào
thì sử dụng từng loại cho thích hợp
Câuhỏi 4: Cách tạo ra mảng đa chiều không cùng kích thước?
Câuhỏi 5: Hãy cho biết sự khác nhau giữa hai cách gọi Arr[i][j] và Arr[i, j]?
Câu hỏi 6: Có thể dùng lệnh foreach để xuất ra tất cả các thành phần của mảng đa chiều không cùng kích thước hay không? Nếu được thì phải làm như thế nào?
Câuhỏi 7: Kiểu dữ liệu nào có thể làm chỉ mục trong bộ chỉ mục của một
lớp?
Câuhỏi 8: Làm thế nào để biết kích thước của một mảng?
Câu hỏi 9: Liệt kê những giao diện tập hợp mà NET cung cấp? Cho biết ý nghĩa của từng giao diện?
Câu hỏi 10: Có cách nào tạo một mảng mà không cần khai báo trước kích thước của mảng?
Và trong quá trình thực hiện trên mảng chúng ta có thể tăng động kích thước của mảng hay không?
Trang 7nhiêu? Trường hợp có 33 phần tử?
Câu hỏi 12: Hàng đợi là gì? Chúng được sắp xếp theo kiểu thứ tự nào? Ứng dụng của hàng đợi ?
Câu hỏi 13: Ngăn xếp là gì? Chúng được sắp xếp theo kiểu thứ tự nào? Ứng dụng của ngăn xếp?
Câuhỏi 14: Phương thức Peek() trong hàng đợi và ngăn xếp có ý nghĩa gì?
Câu hỏi 15: Kiểu dữ liệu nào cho phép truy cập một giá trị thông qua khóa của nó? Lớp nào trong NET hỗ trợ kiểu dữ liệu này?
Câuhỏi 16: Cách lấy tập giá trị trong một đối tượng
Hashtable?
Câuhỏi 17: Cách lấy tập khóa trong một đối tượng Hastable?
Câuhỏi 18: Khóa có phải là duy nhất trong một Hastable hay không?
Câu hỏi 19: Nếu hai vùng có chung một khóa thì chúng được tìm kiếm theo kiểu nào? Và tốc
độ tìm kiếm?
Câuhỏi 20: Hashtable thực thi các giao diện tập hợp nào?
Câuhỏi 21: Phương thức nào thực hiện việc tạo các khoá trong một Hashtable?
Bài tập
Bài tập 1: 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 theo thứ tự giảm dần
Bài tập 2: 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 chúng theo thứ tự số âm thì tăng còn số dương thì giảm dần Hiển thị kết quả ra màn hình
Bài tập 3: Viết một chương trình tìm số lớn nhất và nhỏ nhất trong mảng hai chiều có kích thước cố định Các thành phần của mảng được phát sinh ngẫu nhiên
Bài tập 4: Viết chương trình cộng hai ma trận nxm, tức là mảng hai chiều có kích thước n dòng, m cột Các giá trị của hai mảng phát sinh ngẫu nhiên, cho biết kết quả cộng hai ma trận?
Bài tập 4: Viết chương trình cho phép người dùng nhập vào một ma trận nxm, sao đó tìm kiếm một giá trị nào đó theo yêu cầu người dùng, kết quả của việc tìm kiếm là giá trị
và thứ tự của giá trị tìm được trong ma trận
Trang 8Bài tập5: Viết 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] = <giá trị aij>
Việc xuất kết quả của ma trận trên có thể thực hiện bằng vòng lặp foreach được không? Nếu được thì hãy viết đoạn chương trình xuất ra kết quả?
Bài tập 6: Viết chương trình tạo ra một mảng lưu trữ 30 đ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
Bài tập 7: 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
Bài tập 8: Viết chương trình sử dụng ArrayList để tạo một mảng Chương trình tạo ra một vòng 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?
Bài tập9: 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á trị ra
2 Lấy tiếp một giá trị nữa
3 Xem một giá trị ở đầu queue
4 Đưa vào queue một giá trị
Bài tập 10: Viết chương trình tạo đối tượng Stack tên là myStack Khởi tạo myStack 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 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
Trang 9lớ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 tìm kiếm tên của học viên thông qua mã số học viên