Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 19 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
19
Dung lượng
188,24 KB
Nội dung
Khi tạo đối tượng ArrayList, không cần thiết phải định nghĩa số đối tượng mà nó sẽ chứa. Chúng ta thêm vào ArrayList bằng cách dùng phương thức Add(), và danh sách sẽ quan lý những đối tượng bên trong mà nó lưu giữ. Ví dụ 9.12 sau minh họa sử dụng ArrayList. Ví dụ 9.12: Sử dụng ArrayList. ----------------------------------------------------------------------------- namespace Programming_CSharp { using System; using System.Collections; // một lớp đơn giản để lưu trữ trong mảng public class Employee { public Employee(int empID) { this.empID = empID; } public override string ToString() { return empID.ToString(); } public int EmpID { get { } set { } } return empID; empID = value; private int empID; } public class Tester { static void Main() { ArrayList empArray = new ArrayList(); ArrayList intArray = new ArrayList(); // đưa vào mảng for( int i = 0; i < 5; i++) { empArray.Add( new Employee(i+100)); intArray.Add( i*5 ); } // in tất cả nội dung for(int i = 0; i < intArray.Count; i++) { Console.Write(“{0} ”,intArray[i].ToString()); } Console.WriteLine(“\n”); // in tất cả nội dung của mảng for(int i = 0; i < empArray.Count; i++) { Console.Write(“{0} ”,empArray[i].ToString()); } Console.WriteLine(“\n”); Console.WriteLine(“empArray.Count: {0}”, empArray.Count); Console.WriteLine(“empArray.Capacity: {0}”, empArray.Capacity); } } } ----------------------------------------------------------------------------- Kết quả: 0 5 10 15 20 100 101 102 103 104 empArray.Count: 5 empArray.Capacity: 16 ----------------------------------------------------------------------------- Với lớp Array phải định nghĩa số đối tượng mà mảng sẽ lưu giữ. Nếu cố thêm các thành phần vào trong mảng vượt quá kích thước mảng thì lớp mảng sẽ phát sinh ra ngoại lệ. Với ArrayList thì không cần phải khai báo số đối tượng mà nó lưu giữ. ArrayList có một thuộc tính là Capacity, đưa ra số thành phần mà ArrayList có thể lưu trữ: public int Capacity {virtual get; virtual set;} Mặc định giá trị của Capacity là 16, nếu khi thêm thành phần thứ 17 vào thì Capacity tự động nhân đôi lên là 32. Nếu chúng ta thay đổi vòng lặp như sau: for( int i = 0; i < 17; i++) thì kết quả giống như sau: 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 empArray.Capacity: 32 Chúng ta có thể làm bằng tay để thay đổi giá trị của Capacity bằng hay lớn hơn giá trị Count. Nếu thiết lập giá trị của Capacity nhỏ hơn giá trị của Count, thì chương trình sẽ phát sinh ra ngoại lệ có kiểu như sau ArgumentOutOfRangeException. Thực thi IComparable Giống như tất c ả những tập hợp, ArrayList cũng thực thi phương thức Sort() để cho phép chúng ta thực hiện việc sắp xếp bất cứ đối tượng nào thực thi IComparable. Trong ví dụ kế tiếp sao, chúng ta sẽ bổ sung đối tượng Employee để thực thi IComparable: public class Employee: IComparable Để thực thi giao diện IComparable, đối tượng Employee phải cung cấp một phương thức CompareTo(): public int CompareTo(Object o) { Employee r = (Employee) o; return this.empID.CompareTo(r.empID); } Phương thức CompareTo() lấy một đối tượng làm tham số, đối tượng Employee phải so sánh chính nó với đối tượng này và trả về -1 nếu nó nhỏ hơn đối tượng này, 1 nếu nó lớn hơn, và cuối cùng là giá trị 0 nếu cả hai đối tượng bằng nhau. Việc xác định thứ tự của Employee thông qua thứ tự của empID là một số nguyên. Do vậy việc so sánh sẽ được ủy quyền cho thành viên empID, đây là số nguyên và nó s ẽ sử dụng phương thức so sánh mặc định của kiểu dữ liệu nguyên. Điều này tương đương với việc so sánh hai số nguyên. Lúc này chúng ta co thể thực hiện việc so sánh hai đối tượng Employee. Để thấy được cách sắp xếp, chúng ta cần thiết phải thêm vào các số nguyên vào trong mảng Employee, các số nguyên này được lấy một cách ngẫu nhiên. Để tạo một giá trị ngẫu nhiên, chúng ta cần thiết lập mộ t đối tượng của lớp Random, lớp này sẽ trả về một số giả số ngẫu nhiên. Phương thức Next() được nạp chồng, trong đó một phiên bản cho phép chúng ta truyền vào một số nguyên thể hiện một số ngẫu nhiên lớn nhất mong muốn. Trong trường hợp này chúng ta đưa vào số 10 để tạo ra những số ngẫu nhiên từ 0 đến 10: Random r = new Random(); r.Next(10); Ví dụ minh họa 9.13 tạo ra m ột mảng các số nguyên và một mảng Employee, sau đó đưa vào những số ngẫu nhiên, rồi in kết quả. Sau đó sắp xếp cả hai mảng và in kết quả cuối cùng. Ví dụ 9.13: Sắp xếp mảng số nguyên và mảng Employee. ----------------------------------------------------------------------------- namespace Programming_CSharp { using System; using System.Collections; // một lớp đơn giản để lưu trữ trong mảng public class Employee : IComparable { public Employee(int empID) { this.empID = empID; } public override string ToString() { return empID.ToString(); } public int EmpID { get { } set return empID; { empID = value; } } // So sánh được delegate cho Employee // Employee sử dụng phương thức so sánh // mặc định của số nguyên public int CompareTo(Object o) { Employee r = (Employee) o; return this.empID.CompareTo(r.empID); } private int empID; } public class Tester { static void Main() { ArrayList empArray = new ArrayList(); ArrayList intArray = new ArrayList(); Random r = new Random(); // đưa vào mảng for( int i = 0; i < 5; i++) { empArray.Add( new Employee(r.Next(10)+100)); intArray.Add( r.Next(10) ); } // in tất cả nội dung for(int i = 0; i < intArray.Count; i++) { Console.Write(“{0} ”,intArray[i].ToString()); } Console.WriteLine(“\n”); // in tất cả nội dung của mảng for(int i = 0; i < empArray.Count; i++) { Console.Write(“{0} ”,empArray[i].ToString()); } Console.WriteLine(“\n”); // sắp xếp và hiển thị mảng nguyên intArray.Sort(); for(int i = 0; i < intArray.Count; i++) { Console.Write(“{0} ”, intArray[i].ToString()); } Console.WriteLine(“\n”); // sắp xếp lại mảng Employee empArray.Sort(); // hiển thị tất cả nội dung của mảng Employee for(int i = 0; i < empArray.Count; i++) { Console.Write(“{0} ”, empArray[i].ToString()); } Console.WriteLine(“\n”); } } } ----------------------------------------------------------------------------- Kết quả: 8 5 7 3 3 105 103 107 104 102 3 3 5 7 8 102 103 104 105 107 ----------------------------------------------------------------------------- Kết quả chỉ ra rằng mảng số nguyên và mảng Employee được tạo ra với những số ngẫu nhiên, và sau đó chúng được sắp xếp và được hiển thị lại giá trị mới theo thứ tự sau khi sắp xếp. Thực thi IComparer Khi chúng ta gọi phương thức Sort() trong ArrayList thì phương thức mặc định của IComparer đượ c gọi, nó sử dụng phương pháp QuickSort để gọi thực thi IComparable phương thức CompareTo() trong mỗi thành phần của ArrayList. Chúng ta có thể tự do tạo một thực thi của IComparer riêng, điều này cho phép ta có thể tùy chọn cách thực hiện việc sắp xếp các thành phần trong mảng. Trong ví dụ minh họa tiếp sau đây, chúng ta sẽ thêm trường thứ hai vào trong Employee là yearsOfSvc. Và Employee có thể được sắp xếp theo hai loại là empID hoặc là yearsOfSvc. [...]... Kết quả: ID: 100 Years of Svc: 16 ID: 102 Years of Svc: 8 ID: 107 Years of Svc: 17 ID: 105 Years of Svc: 0 ID: 101 Years of Svc: 3 ID: 100 Years of Svc: 16 ID: 101 Years of Svc: 3 ID: 102 Years of Svc: 8 ID: 105 Years of Svc: 0 ID: 107 Years of Svc: 17 ID: 105 Years of Svc: 0 ID: 101 Years of Svc: 3 ID: 102 Years of Svc: 8 ID: 100 Years of Svc: 16 ID: 107 Years of Svc: 17 . quả giống như sau: 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 empArray.Capacity: 32 Chúng ta có thể. Years of Svc: 16 ID: 102. Years of Svc: 8 ID: 107. Years of Svc: 17 ID: 105. Years of Svc: 0 ID: 101. Years of Svc: 3 ID: 100. Years of Svc: 16 ID: 101. Years