Bai 09 Lap trinh tong quat 1 Bài 9 Lập trình tổng quát 1 1 Mục tiêu v Giới thiệu về lập trình tổng quát và cách thực hiện trong các ngôn ngữ lập trình v Giới thiệu về collec Map > Collec=on > Set So sánh Collection Array LinkedList Collection chứa nhiều loại đối tượng/dữ liệu khác Mảng chứa loại đối tượng/dữ liệu định Dùng Java Collection, cần khai báo gọi phương thức định nghĩa sẵn Dùng tổ chức liệu theo mảng phải lập trình hồn tồn Duyệt phần tử tập hợp thông qua Iterator Duyệt phần tử mảng thông qua số mảng TreeSet 25 25 26 26 Java Collections Framework Ví dụ v Các giao diện lớp thực thi Collecqon framework Java xây dựng theo template public interface List { void add(E x); Iterator iterator(); § Cho phép xác định tập phần tử kiểu § Cho phép định kiểu liệu Collec|on è hạn chế việc thao tác sai kiểu liệu } List myList = new ArrayList(); myList.add("Fred"); // OK myList.add(new Dog()); //Compile error! String s = myList.get(0); 27 27 28 28 Giao diện Collection Giao diện Collection v Xác định giao diện cho thao tác với tập đối tượng § Thêm vào collection § Xóa khỏi collection § Kiểm tra có thành viên v Chứa phương thức thao tác phần tử riêng lẻ theo khối v Cung cấp phương thức cho phép thực duyệt qua phần tử collection (lặp) chuyển tập hợp sang mảng public interface Collection { // Basic Operations int size(); boolean isEmpty(); boolean contains(Object element); boolean add(Object element); boolean remove(Object element); Iterator iterator(); // Bulk Operations boolean addAll(Collection c); boolean removeAll(Collection c); boolean retainAll(Collection c); … // Array Operations Object[] toArray(); Object[] toArray(Object a[]); } 29 29 30 30 Giao diện Set v Các giao diện kế thừa giao diện Collecqon v Set kế thừa từ Collection nên hỗ trợ toàn thao tác xử lý Collection v Vớ d: Đ Set of cars: ã {BMW, Ford, Jeep, Chevrolet, Nissan, Toyota, VW} § Nationalities in the class • {Chinese, American, Canadian, Indian} v Set tập hợp phần tử không trùng lặp v Set khơng có thêm phương thức riêng ngồi phương thức kế thừa từ Collection 31 31 32 32 Giao diện SortedSet Giao diện List v SortedSet: kế thừa giao diện Set v List kế thừa từ Collection List cung cấp thêm phương thức để xử lý Collection kiểu danh sách § § § § Các phần tử xếp theo thứ tự Khơng có phần tử trùng Cho phép phần tử null Các đối tượng đưa vào SortedSet phải cài đặt giao diện Comparable lớp cài đặt SortedSet phải nhận Comparator kiểu đối tượng § Danh sách collection với phần tử xếp theo số v Một số phương thức List § § § § § § v Một số phương thức: § first( ): lấy phần tử (nhỏ nhất) § last( ): lấy phần tử cuối (lớn nhất) § SortedSet subSet(Object e1, Object e2): lấy tập phần tử nằm khoảng từ e1 tới e2 Object get(int index); Object set(int index, Object o); void add(int index, Object o); Object remove(int index); int indexOf(Object o); int lastIndexOf(Object o); 33 33 34 Giao diện Map Giao diện Map v Giao diện Map cung cấp thao tác xử lý bảng ánh xạ v Xác định giao diện để thao tác với tập hợp bao gồm cặp khóa-giá trị § § § § § Bảng ánh xạ lưu phần tử theo khố khơng có khố trùng Thêm cặp khóa-giá trị Xóa cặp khóa-giá trị Lấy giá trị với khóa có Kiểm tra có phải thành viên (khóa giá trị) v Một số phương thức Map § § § § § § v Cung cấp cách nhìn cho nội dung tập hợp: § Tập khóa § Tập giá trị § Tập ánh xạ khóa-giá trị Object put(Object key, Object value); Object get(Object key); Object remove(Object key); boolean containsKey(Object key); boolean containsValue(Object value); 35 35 36 Giao diện SortedMap Các lớp thực thi giao diện Collection v Java xây dựng sẵn số lớp thực thi giao diện Set, List Map cài đặt phương thức tương ứng v Giao diện SortedMap § thừa kế giao diện Map § phần tử xếp theo thứ tự § tương tự SortedSet, nhiên việc xếp thực với khóa v Phương thức: Tương tự Map, bổ sung thêm: § firstKey( ): returns the first (lowest) value currently in the map § lastKey( ): returns the last (highest) value currently in the map 37 37 38 Các lớp thực thi giao diện Collection Các lớp thực thi giao diện Collection v ArrayList: Mảng động, phần tử thêm vào vượt kích cỡ mảng, mảng tự động tăng kích cỡ v LinkedList: Danh sách liên kết v HashSet: Bảng băm § Lưu phần tử bảng băm § Khơng cho phép lưu trùng lặp § Cho phép phần tử null § Hỗ trợ thao tác đầu cuối danh sách § Được sử dụng để tạo ngăn xếp, hàng đợi, cây… 39 39 40 40 10 Các lớp thực thi giao diện Collection Các lớp thực thi giao diện Collection v LinkedHashSet: Bảng băm kết hợp với linked list nhằm đảm bảo thứ tự phần tử § Thừa kế HashSet thực thi giao diện Set § Khác HashSet chỗ lưu trữ danh sách móc nối đơi § Thứ tự phần tử xếp theo thứ tự insert vào tập hợp v HashMap: Bảng băm (cài đặt Map) v LinkedHashMap: Bảng băm kết hợp với linked list nhằm đảm bảo thứ tự phần tử (cài đặt Map) v TreeMap: Cây (cài đặt Map) v Legacy Implementations § Là lớp cũ cài đặt bổ sung thêm collection interface § Vector: Có thể thay ArrayList § Hastable: Có thể thay HashMap v TreeSet: Cho phép lấy phần tử tập hợp theo thứ tự xếp § Các phần tử thêm vào TreeSet tự động xếp § Thơng thường, ta thêm phần tử vào HashSet, sau convert TreeSet để duyệt theo thứ tự nhanh 41 41 42 42 Ví dụ Ví dụ String name = names.get(0); names.add(1, "Ann"); names.remove(1); ArrayList names = new ArrayList(); names.add("Emily"); names.add("Bob"); names.add("Cindy"); 43 43 44 44 11 Bài tập Giao diện Iterator Comparator v Sử dụng để duyệt so sánh Collection v Iterator v Sau thực đoạn chương trình sau, danh sách names có chứa phần tử nào? § Các phần tử collection duyệt thơng qua Iterator ArrayList names = new ArrayList; names.add("Bob"); names.add(0, "Ann"); names.remove(1); names.add("Cal"); Collection c; Iterator it = c.iterator(); 45 45 46 46 Giao diện Iterator Comparator Giao diện Iterator Comparator v Iterator v Iterator : Các phương thức § Cung cấp chế thuận tiện để duyệt (lặp) qua toàn nội dung tập hợp, lần đối tượng hp Đ Đ Đ Đ ã Ging nh SQL cursor iterator( ): yêu cầu container trả iterator next( ): trả phần tử hasNext( ): kiểm tra có tồn phần tử hay khơng remove( ): xóa phần tử gần iterator § Iterator tập hợp xếp duyệt theo thứ tự tập hợp § ListIterator thêm phương thức đưa chất danh sách sở 47 47 48 48 12 Giao diện Iterator Comparator Giao diện Iterator Comparator v Iterator: Ví dụ § Định nghĩa iterator § public interface Iterator { boolean hasNext(); Object next(); void remove(); Tương tự vòng lặp for } for (String name : names){ Sử dụng iterator System.out.println(name); Collection c; } v Giao diện Comparator sử dụng phép so sánh hai đối tượng tập hợp v Một Comparator phải định nghĩa phương thức compare( ) lấy tham số Object trả -1, v Không cần thiết tập hợp có khả so sánh tự nhiên (vd String, Integer…) Iterator i = c.iterator(); while (i.hasNext()) { Object o = i.next(); // Process this object } 49 49 50 50 Giao diện Iterator Comparator Giao diện Iterator Comparator v Ví dụ Cài đặt AgeComparator : v Ví dụ lớp Person: class Person { private int age; private String name; } class AgeComparator implements Comparator { public int compare(Object ob1, Object ob2) { int ob1Age = ((Person)ob1).getAge(); int ob2Age = ((Person)ob2).getAge(); public void setAge(int age){ this.age=age; } public int getAge(){ return this.age; } public void setName(String name){ this.name=name; } public String getName(){ return this.name; } if(ob1Age > ob2Age) return 1; else if(ob1Age < ob2Age) return -1; else return 0; } } 51 51 52 52 13 Giao diện Iterator Comparator Giao diện Iterator Comparator v Ví dụ Sử dụng AgeComparator : v Ví dụ Sử dụng AgeComparator : System.out.println("Order before sorting"); for (Person person : lst) { System.out.println(person.getName() + "\t" + person.getAge()); } public class ComparatorExample { public static void main(String args[]) { ArrayList lst = new ArrayList(); Person p = new Person(); p.setAge(35); p.setName("A"); lst.add(p); Collections.sort(lst, new AgeComparator()); System.out.println("\n\nOrder of person" + "after sorting by age"); for (Iterator i = lst.iterator(); i.hasNext();) { Person person = i.next(); System.out.println(person.getName() + "\t" + person.getAge()); } //End of for } //End of main } //End of class p = new Person(); p.setAge(30); p.setName("B"); lst.add(p); p = new Person(); p.setAge(32); p.setName("C"); lst.add(p); 53 53 54 54 Nội dung Ký tự đại diện (Wildcard) Giới thiệu lập trình tổng quát Định nghĩa sử dụng Template Lập trình tổng quát Java collections framework Ký tự đại diện (Wildcard) Ví dụ tập v Quan hệ thừa kế hai lớp khơng có ảnh hưởng đến quan hệ cấu trúc tổng quát dùng cho hai lớp v Ví dụ: § Dog Cat lớp Animal § Có thể đưa đối tượng Dog Cat vào ArrayList (sử dụng phương thức add) § Tuy nhiên, ArrayList, ArrayList lại khơng có quan hệ với ArrayList 55 55 56 56 14 Ký tự đại diện (Wildcard) Ví dụ v Khơng thể ép kiểu ArrayList kiểu ArrayList public class Test { public static void main(String args[]) { List lst0 = new LinkedList(); List lst1 = lst0; // Error printList(lst0); // Error } class Parent { } class Child extends Parent { } void static printList(List lst) { Iterator it = lst.iterator(); while (it.hasNext()) System.out.println(it.next()); } ArrayList myList = new ArrayList(); } 58 57 57 58 Ký tự đại diện (Wildcard) Ví dụ: Sử dụng Wildcards v Giải pháp: sử dụng kí tự đại diện (wildcard) v Ký tự đại diện: ? dùng để hiển thị cho kiểu liệu v Khi biên dịch, dấu ? thay kiểu liệu public class Test { void printList(List lst) { Iterator it = lst.iterator(); while (it.hasNext()) System.out.println(it.next()); } public static void main(String args[]) { List lst0 = new LinkedList(); List lst1 = new LinkedList(); printList(lst0); // String printList(lst1); // Employee } } 60 59 59 60 15 Ký tự đại diện (Wildcard) Ký tự đại diện (Wildcard) v Lưu ý: cách làm sau không hợp lệ v "? extends Type": Xác định tập kiểu Type Đây wildcard hữu ích ArrayList list = new ArrayList(); list.add("a1"); //compile error list.add(new Object()); //compile error v "? super Type": Xác định tập kiểu cha Type v Ngun nhân: Vì khơng biết list danh sách liên kết cho kiểu liệu nào, nên thêm phần tử vào list, kể đối tượng lớp Object v "?": Xác định tập tất kiểu kiểu 61 61 62 62 Ký tự đại diện (Wildcard) Khác biệt print1 print2? v Ví dụ: public void print1(List list) { for (Employee e : list) { System.out.println(e); } } § ? extends Animal có nghĩa kiểu thuộc loại Animal (là Animal Animal) v Lưu ý: Hai cú pháp sau tương đương: public void foo( ArrayList