Tải bản đầy đủ (.pptx) (35 trang)

Tìm hiểu Collections Algorithms, Custom Implementations and Interoperability

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (439.19 KB, 35 trang )

Tìm hiểu Collections:
Algorithms, Custom Implementations
and Interoperability
Giảng viên hướng dẫn: TS. Nguyễn Hồng Quang
Nội dung trình bày

Khái quát về Collection

Các thuật toán với Collection

Thiết kế Collection theo định nghĩa của người dùng

Khả năng tương tác giữa các Collection
2
Khái quát về Collection trong Java (1)

Một Collection đơn giản là một đối tượng nhóm nhiều phần tử bắt nguồn từ các phần tử
đơn.

Ý nghĩa: Được sử dụng để lưu trữ, trả lại, thao tác và giao tiếp với tập hợp dữ liệu.

Java Có các dạng Collection cơ bản sau:

List

Map

Set
3
Khái quát về Collection trong Java (2)


Framwork Collection: kiến trúc thống nhất để miêu tả và thao tác với Collection, gồm:

Interfaces: cho phép Collection thao tác độc lập với các implementation được miêu tả.

Implementation: thể hiện cụ thể của các giao diện Collections.

Algorithms: các phương pháp thực hiện tính toán hữu ích như: tìm kiếm, sắp xếp các phần tử
trong Collection.

Lợi ích của Framework:

Giảm thiểu khó khan khi lập trình

Tăng tốc độ và chất lượng chương trình

Cho phép tương tác giữa các API không liên quan

Tiết kiệm công sức học và sử dụng các API mới.

Tiết kiệm công sức thiết kế các API mới

Thúc đấy việc tái sử dụng phần mềm
4
Các thuật toán với Collection

Framework Collection của Java hỗ trợ một số thuật toán với Collection, bao gồm:

Sắp xếp

Xáo trộn (Shuffling)


Thủ tục thao tác dữ liệu (Routine Data Manipulation)

Tìm kiếm

Tổ hợp (Composition)

Tìm cực trị
5
Các thuật toán với Collection – Sắp xếp (1)

Thuật toán thao tác với Collection dạng List.

Mục đích: Sắp xếp các phần tử trong List tăng dần theo một quan hệ thứ tự nào đó.

Được thực hiện bằng cách gọi phương thức: Collections.sort()

Có 2 dạng:

Dạng cơ bản:

Dạng tùy biến
6
Các thuật toán với Collection – Sắp xếp (2)

Dạng cơ bản:

List được sắp xếp theo thứ tự tự nhiên của các phần tử trong List.

Phần tử là các đối tượng String: sắp xếp theo bảng chữ cái alphabe


Phần tử là các đối tượng Date: sắp xếp theo thứ tự thời gian,….

Cách thức thực hiện:

Truyền tham số là 1 đối tượng List vào lời gọi phương thức sort

Kỹ thuật: sử dụng sắp xếp trộn vì lý do nhanh và ổn định

Nhanh: được đảm bảo chạy trong thời gian nlogn (tương đương với quicksort)

Ổn định: vì không thực hiện sắp xếp với các phần tử ngang nhau (equal elements)

đặc biệt hữu ích khi thực hiện sắp xếp các đối tượng nhiều lần theo các tiêu chí khác nhau.
7
Các thuật toán với Collection – Sắp xếp (3)

Dạng tùy biến:

List được sắp xếp theo thứ tự do người dùng tự định nghĩa.

Để định nghĩa tiêu chí sắp xếp: khai báo đối tượng Comparator

Cách thức thực hiện thuật toán: Truyền vào lời gọi phương thức sort 2 tham số

Tham số thứ nhất: Đối tượng List

Tham số thứ hai: Đối tượng Comparator
8
Các thuật toán với Collection – Xáo trộn (1)


Thao tác với Collection dạng List

Mục đích: Phá hủy mọi dấu vết về thứ tự trong một đối tượng List.
 Trái ngược với Sắp xếp.

Cách thức thực hiện: gọi phương thức Collection.shuffle()

Kĩ thuật: Sắp xếp lại List dựa trên một nguồn ngẫu nhiên sao cho tất cả các hoán vị của
List có xác suất xảy ra như nhau.

Ứng dụng:

Phù hợp tính chất may mắn của nhiều vấn đề.
Ví dụ: tráo bộ bài, xổ số,…

Tạo các test case.
9
Các thuật toán với Collection – Xáo trộn (2)

Có 2 dạng:

Dạng 1: Sử dụng nguồn ngẫu nhiên mặc định

Tham số đầu vào: Đối tượng List

Dạng 2: Sử dụng nguồn ngẫu nhiên theo định nghĩa của người dùng

Nguồn ngẫu nhiên: đối tượng Random cho người dùng khai báo


Tham số đầu vào cho phương thức shuffle: một đối tượng List, một đối tượng Random
10
Các thuật toán với Collection – Thủ tục thao
tác dữ liệu (1)

Framework Collection Java cung cấp 5 thủ tục thao tác dữ liệu cơ bản thông qua các
phương thức:

reverse

fill

copy

swap

addAll

Các phương thức này đều thực hiện trên Collection dạng List.

Riêng addAll thực hiện với mọi Collection
11
Các thuật toán với Collection – Thủ tục thao
tác dữ liệu (2)
Cú pháp Ý nghĩa
Collections.reverse(List L) Đảo ngược thứ tự của các phần tử trong L
Collections.fill(List L, Obj T) Ghi đè lên tất cả các phần tử của L giá trị T
Collections.copy(List dest, List src) Sao chép các phần tử của src sang dest.
Kích thước của dest phải lớn hơn hoặc bằng
của src. Nếu dài hơn, các phần tử còn lại của

dest sẽ không bị ảnh hưởng
Collections.swap(List L, int i, int j) Hoán đổi phần tử thứ i và j trong L cho nhau
Collections.addAll(Collection c, T elements) Thêm tất cả các elements vào collection c
12
Các thuật toán với Collection – Tìm kiếm (1)

Framework Collection Java cung cấp phương thức tìm kiếm theo thuật toán tìm kiếm nhị
phân.

Phương thức này thực hiện với Collection dạng List

Mục đích: tìm kiếm một phần tử xác định trong một đối tượng đã sắp xếp.
 Đối tương List phải được sắp xếp trước khi thực hiện tìm kiếm

Có 2 dạng:

Dạng 1: tham số gốm một đối tượng List và một phần tử để tìm kiếm, gọi là “search key”
Dạng này giả định List được sắp xếp theo thứ tự tự nhiên của phần tử

Dạng 2: ngoài tham số như Dạng 1, có them tham số là tiêu chí sắp xếp Comparator.
Dạng này giả định List được sắp xếp tăng dần theo Comparator
13
Các thuật toán với Collection – Tìm kiếm (2)

Cả 2 dạng đều định nghĩa kết quả trả về như sau:

Nếu List chứa “search key”: trả về chỉ số của nó trong List.
Nếu có nhiều phần tử bằng “search key”: trả về một trong các chỉ số của nó trong List.

Nếu List không chứa “search key”, giá trị trả về là:

-
(insertion point - 1)
Trong đó, insertion point là vị trí tại đó giá trị sẽ được chèn vào List và bằng:

Chỉ số của phần tử đầu tiên lớn hơn “search key”

Hoặc là List.size() nếu tất cả các phần tử của List đều nhó hơn “search key”
 Giá trị trả về lơn hơn hoặc bằng 0 khi và chỉ khi “search key” được tìm thấy.
14
Các thuật toán với Collection – Tổ hợp

Framework Collection Java cung cấp 2 phương thức cho phép thực hiện các thao tác tổ hợp

frequency

disjoint

Cả 2 phương thức này đều có thể thực hiện với mọi Collection.
Cú pháp Ý nghĩa
Collections.frequency(Collec
tion c, Object o)
Đếm số lần đối tượng o xuất hiện trong c
Collections.disjoint(Collect
ion c1, Collection c2)
Kiểm tra xem c1 và c2 có phần tử chung
hay không?
Nếu có trả về true.
15
Các thuật toán với Collection – Tìm cực trị


Collections cung cấp 2 phương thức min và max cho phép tim phần tử nhỏ nhất và lớn
nhất trong một Collection.

Có thể thực hiện với mọi Collection

Mỗi phương thức này lạicó 2 dạng:

Dạng 1: Một đối tượng Collection là tham số duy nhất.

trả về phần tử nhỏ nhất (hoặc lớn nhất) theo thứ tự tự nhiên của phần tử.

Dạng 2: Có thêm tham số Comparator
 trả về phần tử nhỏ nhất (hoặc lớn nhất) theo thứ tự mà Comparator xác định
16
Thiết kế Collection theo định nghĩa người dùng (1)

Ngoài các implementation của giao diện Collection mà Java đã cung cấp, người dùng có
thể tự thiết kế các implementation của riêng mình.

Lý do để người dùng tự implement giao diện Collection:

Tính liên tục:

Ứng dụng cụ thể

Hiệu năng cao, mục đích đặc biệt

Hiệu năng cao, mục đích khái quát

Chức năng nâng cao


Sự thuận lợi

Adapter: Giả sữ bạn có một API cũ sử dụng Collection đặc biệt do bạn tự định nghĩa, khi đó bạn
cần phải viết một Adapter cho phép những Collection này thực hiện được trong Framework
Collection
17
Thiết kế Collection theo định nghĩa người dùng (3)

Cách viết một Implementation:

Bước 1: chọn một lớp trừu tượng mà bạn muốn implementation.

Bước 2: Viết code thực thi cho tất cả các phương thức trừu tượng của lớp đó.
Nếu bạn thay đổi đối tượng Collection, bạn phải ghi đè một hoặc một số phương thức cụ
thể (được liệt kê trong tài liệu API của lớp trừu tượng này)

Bước 3: Kiểm tra và debug code thực thi nếu cần thiết.

Bước 4: Đọc tài liệu API của lớp trừu tượng này, nếu thấy phương thức nào chậm bạn có thể ghi
đè để nâng cao hiệu năng.

Thông thường bước này hay được bỏ qua nhất.
18
Thiết kế Collection theo định nghĩa người dùng (4)

Danh sách tổng hợp các lớp trừu tượng có thể được implementation:

AbstractCollection: Collection có thể hoặc là một Set hoặc là một List. Ít nhất, phải cung cấp một
phương thức iterator và phương thức size


AbstractSet : một set, sử dụng tương tự AbstractCollection

AbstractList: một List, ít nhất phải cung cấp phương thức get và size. Có thể có; set, remove, add

AbstractSequentialList: một List, ít nhất phải có phương thức listIterator và size.

AbstractQueu: ít nhất phải có phương thức offer, peek, poll, size, một iterator hỗ trợ remove

AbstractMap: một Map, ít nhất phải có entrySet.
Thường được implementation cùng với lớp Abstract. Nếu thay đổi Map, phải cung cấp phương
thức put.
19
Thiết kế Collection theo định nghĩa người dùng (5)

Ví dụ: Implementation của Array.asList
20
public static <T> List<T> asList(T[] a) {
return new MyArrayList<T>(a);
}
private static class MyArrayList<T> extends
AbstractList<T> {
private final T[] a;
MyArrayList(T[] array) {
a = array;
}
public T get(int index) {
return a[index];
}
}

public T set(int index, T element) {
T oldValue = a[index];
a[index] = element;
return oldValue;
}
public int size() {
return a.length;
}
}
Thiết kế Collection theo định nghĩa người dùng (6)

Ví dụ: Implementation của Array.asList:
Trong ví dụ này, bạn chỉ cần cung cấp

một constructor

Các phương thúc: get, set, size

Các công việc còn lại sẽ do AbstractList thực hiện.

Bạn có thể gọi:

ListIterator,

lấy kích thước,

phương thức tìm kiếm,

tính toán mã băm,


so sánh biến chuỗi
21
Khả năng tương tác giữa các Collections (1)

Framework Collection Java ra đời sau khi nền tảng, công nghệ Java đã phát triển đến một
mức nhất định.

Sự xuất hiện mới của Framework này nói chung và của Collections nói riêng cần phải
tương tác được với các thành phần đã có trong nền tảng Java và ngược lại.

Để làm được điều này cần phải hoàn thiện được đồng thời 2 đặc điểm sau:

Tính tương thích: làm thế nào để các Collection có thể làm việc được với các API cũ đã xuất hiện
trước đó.

Thiết kế API: thiết kế ra sao để các API mới có thể tương tác mượt mà với các API cũ đã xuất
hiện trước đó.
22
Khả năng tương tác giữa các Collections (2)

Tính tương thích:

Đảm bảo khả năng tương tác hoàn toàn giữa các giao diện Collection cơ bản.

Đảm bảo khả năng tương thích hoàn toàn giữa các kiểu dữ liệu được sử dụng để biểu diễn các
Collection trong các phiên bản trước của Java như: Vector, Hashtable, array và Enumeration.

Nhờ có tính tương thích mà ta có thể thực hiện được việc chuyển đổi từ các Collection cũ
sang các Collection trong Framework Collection và ngược lại.


Việc chuyển từ Collection cũ  Collection mới: gọi là tương thích upward
Việc chuyển từ Collection mới  Collection cũ: gọi là tương thích backward
23
Khả năng tương tác giữa các Collections (3)

Tương thích upward:

Để hai API này phối hợp trơn chu: phải chuyển các Collection cũ sang Collection mới

Việc này được thực hiện dễ dàng nhờ sự hỗ trợ của Framework Collection.

24
API
API
(Yêu cầu
Collection mới)
Collection cũ
?
Khả năng tương tác giữa các Collections (4)

Tương thích upward:

Nếu API cũ trả về một mảng các đối tượng, Framework Collection sẽ xem mảng này như một
List.
Sử dụng: Arrays.asList để truyền một mảng vào một phương thức bất kỳ yêu cầu một Collection
hay một List.
Foo[] result = oldMethod(arg);
newMethod(Arrays.asList(result));

Nếu API cũ trả về một Vector hay một Hashtable, thì Vector sẽ tự động thực thi giao diện List,

Hashtable thực thi giao Map

Truyền trực tiếp vào bất kì phương thức nào yêu cầu Collection hay List (hoặc Map)
Vector r1 = oldMethod(arg); Hashtable r2 = oldMethod(arg);
newMethod(result1); newMethod(result2);
25

×