You are on page 1of 114

LẬP TRÌNH

HƯỚNG ĐỐI TƯỢNG


VỚI JAVA
Chương 4:
CÁC KIỂU DỮ LIỆU TẬP HỢP

Giảng viên: Phạm Quang Hiển


Bộ môn: Tin học Kinh tế
Khoa Công nghệ thông tin
MỤC TIÊU
• Saukhi học xong chương này, sinh viên sẽ
nắm được:
 Khái niệm về Collections trong Java.
 Các giao diện List, Set, Map.
 Các lớp:
 ArrayList, LinkedList,
 HashSet, LinkedHashSet, TreeSet,
 HashMap, LinkedHashMap, TreeMap.

2
NỘI DUNG
1. Khái niệm Collections
2. List
3. Set
4. Map

3
Khái niệm Collections
• Hạn chế của mảng (Array)
 Khi khai báo mảng, cần phải khai báo kích thước cố định
cho mảng, xảy ra hai trường hợp:
 Khai báo mảng với kích thước lớn mà không sử dụng hết
sẽ gây ra lãng phí bộ nhớ.
 Ngược lại, nếu khai báo mảng với kích thước quá nhỏ thì
sẽ không mở rộng mảng được.
 Các phần tử trong mảng được sắp xếp liên tục nên việc
chèn hoặc xóa một phần tử trong mảng sẽ gặp nhiều khó
khăn.
=> Collections khắc phục những hạn chế, nhược điểm khi
sử dụng mảng để lập trình.
4
Khái niệm Collections
• Collections (tập hợp)
 Là một tập các lớp dùng để lưu trữ danh sách và có
khả năng tự co dãn khi danh sách đó thay đổi (thêm,
sửa, xóa, chèn phần tử)
 Được dùng để lưu trữ, truy xuất, tương tác với dữ
liệu và truyền dữ liệu giữa các phương thức với
nhau.
 Khi sử dụng Collections không cần phải khai báo
trước số lượng phần tử.

5
Khái niệm Collections
• Collections Framework
 Là một tập hợp các lớp (class) và các interface dùng để
hỗ trợ việc thao tác trên tập các đối tượng.
 Trong Java, các Collections Framework cung cấp những
thành phần sau:
Loại thành phần Mô tả
Interfaces Kiểu dữ liệu trừu tượng (abstract) biểu diễn Collections
Implementations Là sự triển khai các Interface, ví dụ như các Class.
Là các phương thức dùng để thực thi các phép toán
Algorithms (các
như tìm kiếm và sắp xếp trên các đối tượng mà triển
thuật toán)
khai các Interface.

 Collections Framework trong Java bao gồm 2 loại


chính đó là Interface Collections và Class
Collections 6
Khái niệm Collections
• Interface Collections
Tên Interface Đặc điểm khái quát
Các phần tử trong List Interface được sắp
List
xếp có thứ tự và có thể có giá trị giống nhau.
Các phần tử trong Set là duy nhất (nghĩa là
Set giá trị của các phần tử này không được giống
nhau).
Giá trị của mỗi phần tử trong Map bao gồm 2
phần đó là khóa (key) và giá trị tương ứng
Map
của key đó (value) và khóa của các phần tử
này là duy nhất.

7
Khái niệm Collections
• Class Collections
Tên Class Đặc điểm khái quát
Là 1 cấu trúc dữ liệu lưu trữ các phần tử dưới dạng danh sách. Các phần
LinkedList
tử trong LinkedList được sắp xếp có thứ tự và có thể có giá trị giống nhau.
Là kiểu danh sách sử dụng cấu trúc mảng để lưu trữ phần tử. Thứ tự các
ArrayList phần tử dựa theo thứ tự lúc thêm vào và giá trị của các phần tử này có thể
trùng nhau.
Thứ tự các phần tử trong HashSet không dựa theo thứ tự lúc thêm vào và
HashSet
giá trị của các phần tử này là duy nhất.
Các phần tử trong TreeSet mặc định được sắp xếp tăng dần và giá trị của
TreeSet
các phần tử này là duy nhất.
Giá trị của mỗi phần tử trong HashMap bao gồm 2 phần đó là khóa (key) và
giá trị tương ứng của key đó (value) và khóa của các phần tử này là duy
HashMap
nhất. HashMap cho phép truy xuất trực tiếp dữ liệu bằng khóa duy nhất của
nó.
Giá trị của mỗi phần tử trong TreeMap bao gồm 2 phần đó là khóa (key) và
TreeMap giá trị tương ứng của key đó (value) và khóa của các phần tử này là duy
nhất. Giá trị của các phần tử trong TreeMap được sắp xếp tăng dần.

8
List

List interface

ArrayList Class

LinkedList Class

9
List
• Là tập các đối tượng tuần tự, kế tiếp nhau, có thể
lặp lại.
• Kế thừa từ Collection
• Các lớp thực thi của List: ArrayList, Vector và
LinkedList.
• Một List có thể có các phần tử trùng nhau; có thể
chứa nhiều phần tử null.
• Chỉ số các phần tử của List được bắt đầu là 0.
• Kế thừa 15 phương thức từ Collection.
• Có 9 phương thức trong List.
10
List
STT Phương thức Mô tả
1 get(int index) Trả về phần tử tại chỉ số index
Thay thế một phần tử tại chỉ số index bằng phần tử
2 set(int index, E element) element
void add(int index, E
3 element) Chèn phần tử element tại vị trí có chỉ số index
4 remove(int index) Loại bỏ phần tử tại vị trí có chỉ số index
5 int indexOf(Object o) Trả về chỉ số xuất hiện đầu tiên của đối tượng o
6 int lastIndexOf(Object o) Trả về một chỉ số lần xuất hiện cuối cùng của đối tượng o
ListIterator<E> Trả về một danh sách các phần tử được lặp lại trong List
7 listIterator() này

ListIterator<E> Trả về một danh sách các phần tử được lặp lại trong List
8 listIterator(int index) này bắt đầu từ vị trí có chỉ số index
List<E> subList(int Trả về danh sách con của danh sách này bắt đầu từ 'from
9 fromIndex, int toIndex) Index' đến 'to Index'.

11
List
1. ArrayList Class
• Là một lớp triển khai của List Interface trong
Collections Framework.
• ArrayList
quản lý các phần tử giống mảng một chiều,
các phần tử nằm hàng ngang liền kề nhau.
• ArrayList
được sử dụng để biểu diễn danh sách các
phần tử có kiểu dữ liệu có cấu trúc.
• Ban đầu danh sách sẽ rỗng vì không có phần tử nào.
Kích thước danh sách sẽ được tăng lên khi thêm phần
tử.

12
List
1. 1 Tạo mới một ArrayList

13
List
1. 2 Một số phương thức của ArrayList
Phương thức Ý nghĩa
size() Trả về số lượng phần tử của danh sách
VD: int size = listInt.size();
add(KDL giaTri) Thực hiện thêm phần tử vào cuối danh sách
VD: listInt.add(2); => listInt gồm {2}
add(int index, KDL giaTri) Thực hiện thêm phần tử vào vị trí index trong danh
sách
VD: listInt.add(0, 3); => listInt gồm {3, 2}
set(int index, KDL giaTri) Thay đổi giá trị phần tử thứ index trong danh sách
VD: listInt.set(1,5); => listInt gồm {3,5}
remove(int index) Xóa phần tử tại vị trí index khỏi danh sách
VD: listInt.remove(0); =>listInt gồm {5}
remove(KDL giaTri) Xóa phần tử tìm thấy đầu tiên có giá trị tương ứng
với tham só truyền vào khỏi danh sách

14
List
1. 2 Một số phương thức của ArrayList (tiếp)
Phương thức Ý nghĩa
get(int index) Trả về phần tử tại vị trí index trong danh sách
isEmpty() Kiểm tra xem danh sách có rỗng không
clear() Xóa tất cả các phần tử khỏ danh sách
VD: listInt.clear();
indexOf(KDL giaTri) Tìm và trả về vị trí xuất hiện đầu tiên của phần tử
trong danh sách có giá trị tương ứng với giá trị
muốn tìm.
contains(KDL giaTri) Nếu phần tử muốn tìm có nằm trong danh sách
thì trả về false
sort(Comparator<KDL>tieu_ Sắp xếp vị trí của các phần tử trong danh sách
chi_sx) theo tiêu chí sắp xếp

15
List
1. 3 Duyệt ArrayList
• Sử dụng vòng for:

16
List
1. 3 Duyệt ArrayList (tiếp)
• Sử dụng vòng for cải tiến:

17
List
1. 3 Duyệt ArrayList (tiếp)
• Sử dụng Iterator: phải import java.util.Iterator của Java

18
List
1. 3 Duyệt ArrayList (tiếp)
• Sử dụng ListIterator: phải import java.util.ListIterator

19
DEM
O
Viết chương trình sử dụng một số
phương thức của ArrayList.

20
List

Blue
true
5
[Red, Blue, Orange, Pink, Yellow]

21
DEM
O
Viết chương trình nhập vào các
phần tử cho 1 ArrayList từ bàn
phím. Sau đó tìm và hiển thị phần
tử lớn nhất trong ArrayList đó.

22
List
Hướng dẫn:
 Để tìm phần tử lớn nhất trong 1 ArrayList, giả sử
phần tử đầu tiên là phần tử lớn nhất của ArrayList đó.
Sau đó sử dụng vòng lặp for duyệt qua các phần tử
trong ArrayList và sử dụng phương thức compareTo()
đặt trong 1 câu lệnh if để so sánh phần tử đó với các
phần tử còn lại trong ArrayList. Nếu có một phần tử
tại vị trí nào đó trong ArrayList là lớn nhất và lớn hơn
phần tử đầu tiên thì đó sẽ là phần tử cần tìm.
 Để tìm phần tử nhỏ nhất ta làm tương tự.

23
List

24
List
2. LinkedList Class
• Là một lớp triển khai của List Interface trong
Collections Framework nên nó sẽ có một vài đặc điểm
và phương thức tương đồng với List.
• LinkedList là một cấu trúc dữ liệu lưu trữ các phần tử
dưới dạng danh sách, các phần tử trong LinkedList
được sắp xếp có thứ tự và có thể có giá trị giống nhau.
• Trong Java lớp LinkList, thao tác nhanh vì không cần
phải dịch chuyển nếu bất kỳ phần tử nào bị xoá khỏi
danh sách.
• Lớp LinkedList có thể được sử dụng như list (danh
sách), stack (ngăn xếp) hoặc queue (hàng đợi).
25
List
2.1 Tạo mới một LinkedList

26
List
2.2 Một số phương thức của LinkedList
LinkedList - Chèn:

Chèn ở đầu Chèn vào giữa Chèn tại đuôi

addFirst (E e) add(int index, E e) add(E e)

addAll(int index,
offerFirst (E e) addAll(Collection c)
Collection c)

offer(E e)

offerLast (E e)

27
List
LinkedList - Xóa:

Loại bỏ ở đầu Loại bỏ từ giữa Loại bỏ ở đuôi

poll() remove(int index) pollLast()

pollFirst () removeLast ()

remove()

removeFirst()

28
List
LinkedList – Lấy ra:

Lấy từ đầu Lấy từ giữa Lấy từ đuôi

element() get(int index) getLast ()

getFirst () peekLast ()

peek()

peekFirst ()

29
List
Tổng hợp các phương thức LinkedList (1)

Phương thức Mô tả
boolean add(E e) Nối phần tử được chỉ định vào cuối danh sách
void add(int index, E Chèn phần tử được chỉ định vào vị trí index
element) trong danh sách
boolean Nối tất cả các phần tử trong Collection đã chỉ
addAll(Collection<? định vào cuối danh sách này, theo thứ tự chúng
extends E> c) được trả về bởi trình lặp của bộ sưu tập đã chỉ
định.
boolean addAll(int Nối thêm tất cả các phần tử trong Collection,
index, Collection<? bắt đầu từ vị trí index của danh sách
extends E> c)

30
List
Tổng hợp các phương thức LinkedList (2)
Phương thức Mô tả
void addFirst (E e) Chèn phần tử đã cho vào đầu danh sách
void addLast (E e) Nối phần tử đã cho vào cuối danh sách
void clear() Loại bỏ tất cả các phần tử khỏi danh sách
Object clone() Trả về một bản sao nông của ArrayList
boolean Nếu danh sách chứa phần tử được chỉ định, hàm
contains(Object o) trả về true
Iterator<E> Trả về một trình vòng lặp qua các phần tử trong
descendingIterator() một deque theo thứ tự tuần tự ngược
E element() Nó được sử dụng để lấy phần tử đầu tiên của
danh sách
E get(int index) Nó được sử dụng để trả về phần tử tại vị trí đã chỉ
định trong danh sách
31
List
Tổng hợp các phương thức LinkedList (3)
Phương thức Mô tả
E getFirst () Nó được sử dụng để trả về phần tử đầu tiên
trong danh sách
E getLast () Nó được sử dụng để trả về phần tử cuối cùng
trong danh sách
int indexOf (Object Trả về chỉ mục trong danh sách lần xuất hiện đầu
o) tiên của phần tử đã chỉ định hoặc -1 nếu danh
sách không chứa bất kỳ phần tử nào
int lastIndexOf Trả về chỉ mục trong danh sách lần xuất hiện
(Object o) cuối cùng của phần tử đã chỉ định hoặc -1 nếu
danh sách không chứa bất kỳ phần tử nào

32
List
Tổng hợp các phương thức LinkedList (4)
Phương thức Mô tả
ListIterator <E> Trả về một trình lặp danh sách các phần tử theo
listIterator (int trình tự thích hợp, bắt đầu từ vị trí đã chỉ định
index) trong danh sách
boolean offer(E e) Thêm phần tử được chỉ định làm phần tử cuối
cùng của danh sách
boolean offerFirst(E Chèn phần tử được chỉ định vào đầu danh sách
e)
boolean offerLast(E Chèn phần tử được chỉ định vào cuối danh sách
e)
E peek () Lấy phần tử đầu tiên của danh sách
E peekFirst () Lấy phần tử đầu tiên của danh sách hoặc trả về
null nếu danh sách trống
33
List
Tổng hợp các phương thức LinkedList (5)
Phương thức Mô tả
E peekLast () Lấy phần tử cuối cùng của danh sách hoặc trả về
null nếu danh sách trống
E poll() Lấy và loại bỏ phần tử đầu tiên của danh sách
E pollFirst() Lấy và loại bỏ phần tử đầu tiên của danh sách
hoặc trả về null nếu danh sách trống
E pollLast() Lấy và loại bỏ phần tử cuối cùng của danh sách
hoặc trả về null nếu danh sách trống
E pop () Lấy một phần tử từ ngăn xếp
void push(E e) Đẩy một phần tử lên ngăn xếp
E remove() Lấy và loại bỏ phần tử đầu tiên của danh sách

34
List
Tổng hợp các phương thức LinkedList (6)
Phương thức Mô tả
E remove() Lấy và loại bỏ phần tử đầu tiên của danh sách
E remove(int Loại bỏ phần tử tại vị trí đã chỉ định trong danh
index) sách
boolean Loại bỏ phần tử được chỉ định trong danh sách
remove(Object o) tại lần xuất hiện đầu tiên
E removeFirst() Loại bỏ và trả về phần tử đầu tiên từ danh sách
boolean Loại bỏ phần tử được chỉ định trong danh sách
removeFirstOccurr tại lần xuất hiện đầu tiên (khi duyệt qua danh
ence (Object o) sách từ đầu đến cuối)
E removeLast () Loại bỏ và trả về phần tử cuối cùng

35
List
Tổng hợp các phương thức LinkedList (7)
Phương thức Mô tả
boolean Loại bỏ phần tử được chỉ định trong danh sách tại
removeLastOccurre lần xuất hiện cuối cùng (khi duyệt qua danh sách
nce (Object o) từ đầu đến cuối)
E set(int index, E Thay thế phần tử ở vị trí đã chỉ định trong danh
element) sách bằng phần tử được chỉ định
Object[] toArray() Trả về một mảng chứa tất cả các phần tử trong
danh sách theo trình tự thích hợp (từ phần tử đầu
tiên đến phần tử cuối cùng).
<T> T [] toArray (T Trả về một mảng chứa tất cả các phần tử trong
[] a) chuỗi thích hợp (từ phần tử đầu tiên đến phần tử
cuối cùng)
int size() Trả về số lượng phần tử trong danh sách
36
DEM
O
Viết chương trình demo một số
phương thức của LinkedList.

37
List

38
List

39
DEM
O
Viết chương trình demo một số
phương thức của LinkedList.

40
List

41
List

42
List
So sánh sự khác nhau ArrayList và LinkedList
ArrayList LinkedList
1) ArrayList nội bộ sử dụng mảng LinkedList nội bộ sử dụng danh
động để lưu trữ các phần tử. sách liên kết doubly để lưu trữ các
phần tử.
2) Thao tác với ArrayList Thao tác với LinkedList là nhanh
là chậm bởi vì nó sử dụng nội bộ hơn so với ArrayList bởi vì nó sử
mảng. Nếu bất kỳ phần tử nào được dụng danh sách liên kết doubly do
xoá khỏi mảng, tất cả các bit được đó không cần chuyển đổi bit nào
chuyển trong bộ nhớ. trong bộ nhớ.
3) Lớp ArrayList trong java chỉ có Lớp LinkedList trong java có
thể hoạt động như một list vì nó thể hoạt động như một list và
chỉ implements giao tiếp List. queue(hàng đợi) vì nó implements
các giao tiếp List và Deque.
4) ArrayList là tốt hơn trong việc LinkedList là tốt hơn trong việc
lưu trữ và truy cập dữ liệu. thao tác dữ liệu.
43
Set

Set interface

HashSet Class

LinkedHashset
Class

TreeSet Class

44
Set
• Set Interface là một loại Interface Collection. Khác
với List, các phần tử trong List có thể giống nhau,
còn đối với Set, các phần tử trong Set là duy nhất
(nghĩa là giá trị của các phần tử này không được
giống nhau).
• Chúng ta sẽ sử dụng Set khi muốn lưu trữ một
danh sách các phần tử không có sự trùng lặp
hoặc khi chúng ta không quan tâm đến thứ tự của
các phần tử trong danh sách đó.
• Set chỉ có thể chứa một phần tử null và không có
phương thức riêng.
45
Set
• Không thể truy cập ngẫu nhiên các phần tử.
• Set Interface có các Class triển khai:
 HashSet Class: các phần tử không được sắp xếp
theo bất kỳ thứ tự nào,
 TreeSet Class: thứ tự các phần tử trong Set được
sắp xếp tăng dần
 LinkedHashSet Class: duy trì thứ tự chèn.
=> Thứ tự các phần tử trong Set phụ thuộc vào
Class thực thi.

46
Set
1. HashSet Class
• Là một lớp triển khai của Set Interface trong
Collections.
• Được sử dụng để tạo một Collection sử dụng bảng
băm để lưu trữ.
• Lưu trữ các phần tử bằng cách sử dụng một cơ chế
gọi là băm.
• Chỉ chứa các phần tử duy nhất; Cho phép giá trị null
• Không duy trì thứ tự chèn. Các phần tử được chèn
trên cơ sở mã băm của chúng.
• Là cách tiếp cận tốt nhất cho các hoạt động tìm kiếm

47
Set
• Trong HashSet, có 2 yếu tố ảnh hưởng trực tiếp tới
hiệu suất của nó là Initial capacity (kích thước khởi
tạo) và Load factor (tạm gọi là hệ số tải).
Kích thước khởi tạo của HashSet là kích thước ngay tại
thời điểm nó được khởi tạo và mặc định là 2 4 = 16 và nó
sẽ tăng lên gấp đôi khi kích thước của HashSet đạt đến
ngưỡng.
Hệ số tải là chỉ số để đo xem đến ngưỡng nào thì kích
thước (capacity) của HashSet sẽ tự động tăng lên. Giá trị
mặc định của hệ số tải là 0.75f.

48
Set
1.1 Hàm khởi tạo
Constructor Mô tả

Hashset () Xây dựng một Hashset mặc định


HashSet(int capacity) Khởi tạo dung lượng của hash
set. Dung lượng tự động tăng lên khi
các phần tử được thêm vào Hashset
HashSet(int capacity, float Khởi tạo dung lượng của hashset và
loadFactor) hệ số tải

HashSet(Collection<? Khởi tạo hashset bằng cách sử dụng


extends E> c) các phần tử của Collection c

49
Set
1.1 Hàm khởi tạo (tiếp)

50
Set
1.2 Các phương thức

Phương thức Mô tả
boolean add(E e) Thêm phần tử e vào tập hợp này nếu nó chưa có
void clear() Để loại bỏ tất cả các phần tử khỏi tập
object clone() Trả về một bản sao nông của thể hiện Hashset
này: các phần tử không được sao chép
boolean Trả về true nếu tập hợp này chứa phần tử o
contains(Object o)
boolean isEmpty() Trả về true nếu tập hợp này không chứa phần tử

51
Set
1.2 Các phương thức (tiếp)

Phương thức Mô tả
Iterator<E> Trả về một iterator trên các phần tử
iterator()
boolean Loại bỏ phần tử được chỉ định khỏi tập này nếu
remove(Object o) nó có mặt
int size() Trả về số lượng phần tử trong tập hợp

52
DEM
O
Viết chương trình sử dụng
phương thức thêm một phần tử
vào HashSet

53
Set

54
DEM
O
Viết chương trình sử dụng phương
thức xóa một phần tử bất kỳ khỏi
HashSet

55
Set

56
Set
2. LinkedHashSet Class
• Là phiên bản có thứ tự của HashSet mà bên trong là
một danh sách nối đôi liên kết chạy qua các phần tử.
• Danh sách liên kết đôi này có duy trì thứ tự chèn của
các phần tử.
• Chứa các phần tử duy nhất giống như Hashset và chỉ
cho phép một phần tử null.
• Không được đồng bộ hóa.

57
Set
2.1 Hàm khởi tạo
Constructor Mô tả
HashSet() Để xây dựng một Hashset mặc
định
HashSet(Collection c) Để khởi tạo Hashset bằng cách sử
dụng các phần tử của Collection c
LinkedHashSet(int Để khởi tạo LinkedHashSet với
capacity) dung lượng capacity
LinkedHashSet(int Để khởi tạo LinkedHashSet với
capacity, float fillRatio) dung lượng capacity và hệ số tải
fillRatio
58
DEM
O
Viết chương trình sử dụng phương
thức xóa một phần tử bất kỳ khỏi
LinkedHashSet

59
Set

60
Set
3. TreeSet Class
• Cácphần tử trong TreeSet được sắp xếp theo
Comparator đã chỉ định.
• Cần cung cấp Comparator này khi tạo một TreeSet.
• Nếu không có bất kỳ Comparator nào khi tạo, các phần
tử sẽ được đặt theo thứ tự tăng dần.
• TreeSet không cho phép có bất kỳ phần tử null nào.
• Các phần tử được chèn trong TreeSet phải cùng kiểu,
có thể so sánh được với nhau.

61
Set
3.1 Hàm khởi tạo

62
Set
3.2 Các phương thức (1)
Phương thức Mô tả
boolean add(E e) Thêm phần tử được chỉ định vào tập
hợp này nếu nó chưa có sẵn
boolean addAll(Collection<? Thêm tất cả các phần tử trong
extends E> c) Collection được chỉ định
E ceiling(E e) Trả về phần tử bé nhất bằng hoặc lớn
hơn phần tử đã chỉ định hoặc null nếu
không có
Comparator<? super E> Trả về comparator đã sắp xếp các
comparator() phần tử theo thứ tự
Iterator descendingIterator() Để lặp lại các phần tử theo thứ tự giảm
dần
NavigableSet descendingSet() Trả về các phần tử theo thứ tự ngược
lại
63
Set
3.2 Các phương thức (2)
Phương thức Mô tả
E floor(E e) Trả về phần tử lớn nhất bé hơn hoặc
bằng phần tử được chỉ định từ hoặc
null nếu không có phần tử đó
SortedSet headSet(E toElement) Trả về nhóm các phần tử nhỏ hơn
phần tử đã chỉ định
NavigableSet headSet(E Trả về nhóm các phần tử nhỏ hơn
toElement, boolean inclusive) hoặc bằng (nếu inclusive là true) phần
tử được chỉ định
E higher(E e) Trả về phần tử bé nhất lớn hơn phần
tử đã chỉ định hoặc null nếu không có
phần tử đó
Iterator iterator() Lặp lại các phần tử theo thứ tự tăng
dần
64
Set
3.2 Các phương thức (3)
Phương thức Mô tả
E floor(E e) Trả về phần tử lớn nhất bé hơn hoặc
bằng phần tử được chỉ định từ hoặc
null nếu không có phần tử đó
SortedSet headSet(E toElement) Trả về nhóm các phần tử nhỏ hơn
phần tử đã chỉ định
NavigableSet headSet(E Trả về nhóm các phần tử nhỏ hơn
toElement, boolean inclusive) hoặc bằng (nếu inclusive là true) phần
tử được chỉ định
E higher(E e) Trả về phần tử bé nhất lớn hơn phần
tử đã chỉ định hoặc null nếu không có
phần tử đó
Iterator iterator() Lặp lại các phần tử theo thứ tự tăng
dần
65
Set
3.2 Các phương thức (4)
Phương thức Mô tả
SortedSet tailSet(E Trả về một tập hợp các phần tử lớn
fromElement) hơn hoặc bằng phần tử đã chỉ định
NavigableSet tailSet(E Trả về một tập hợp các phần tử lớn
fromElement, boolean inclusive) hơn (hoặc bằng nếu inclusive là true)
phần tử được chỉ định
boolean contains(Object o) Trả về true nếu tập này chứa phần tử
được chỉ định
boolean isEmpty() Trả về true nếu tập này không chứa
phần tử
boolean remove(Object o) Loại bỏ phần tử được chỉ định khỏi
tập này nếu nó có mặt
void clear() Loại bỏ tất cả các phần tử khỏi tập
này
66
Set
3.2 Các phương thức (5)
Phương thức Mô tả
Object clone() Trả về một bản sao nông của thể
hiện TreeSet này
E first() Trả về phần tử đầu tiên (thấp
nhất) hiện tại trong bộ được sắp
xếp này
E last() Trả về phần tử cuối cùng (cao
nhất) hiện tại trong tập được sắp
xếp này
int size() Trả về số lượng phần tử trong tập
này

67
DEM
O
Viết chương trình sử dụng phương
thức thêm một phần tử vào TreeSet

68
Set

69
Map

Map interface

HashMap Class

LinkedHashMap
Class

TreeMap Class

70
Map
• Làtập các cặp khóa-giá trị (key-value) và không
cho phép khóa lặp lại
• Một Map không thể có các key trùng lặp nhưng có
thể có các value trùng lặp
• Mỗi key được liên kết tối đa với một value
• Mỗi cặp key - value của map được lưu trữ dưới
dạng các đối tượng Map.Entry
• Các thực thi của giao diện Map là HashMap,
LinkedHashMap, TreeMap và HashTable

71
Map
• Thứ tự các phần tử trong Map tùy thuộc vào
thực thi
 HashMap không duy trì thứ tự các phần tử
 LinkedHashMap duy trì trật tự chèn các phần
tử
 TreeMap đặt các phần tử theo Comparator
được chỉ định

72
Map
• Các phương thức Map Interface
STT Phương thức Mô tả
1 int size() Trả về số cặp key – value trong map
2 boolean isEmpty () Kiểm tra xem map này có trống hay không
boolean
3 containsKey(Object Trả về true nếu map chứa ánh xạ cho khóa được
key) chỉ định.
boolean
4 containsValue(Object Trả về true nếu map chứa một hoặc nhiều key
value) được liên kết với giá trị được chỉ định
5 V get(Object key) Trả về value được liên kết với key được chỉ định
Thêm cặp key - value được chỉ định vào
map. Nếu key được chỉ định đã tồn tại trong
6
map, giá trị cũ sẽ được thay thế bằng giá trị được
V put(K key, V value) chỉ định

73
Map
• Các phương thức Map Interface (tiếp)
STT Phương thức Mô tả
Xóa key được chỉ định cùng với value của
7
V remove(Object key) nó khỏi map
void putAll(Map<? extends K, ? Sao chép tất cả các cặp key - value trị từ
8
extends V> m) map đã chỉ định vào map này
9 void clear() Loại bỏ tất cả các ánh xạ từ map
10 Set<K> keySet() Trả về một bộ chứa tất cả các key
11 Collection<V> values() Trả về một tập hợp các value của map
Set<Map.Entry<K, V>> Trả về chế độ xem của ánh xạ có trong
12
entrySet() map
13 boolean equals(Object o) So sánh đối tượng được chỉ định với map
14 int hashCode () Trả về giá trị mã băm của map này

74
Map
2.2 Các phương thức (tiếp)
Phương thức Mô tả
V getOrDefault (Object key, V Trả về value mà key được chỉ định ánh xạ
defaultValue) đến hoặc defaultValue nếu Map này không
chứa ánh xạ cho key
Set <K> keySet () Trả về một tập các key có trong Map
protected boolean Trả về true khi loại bỏ entry lớn nhất
removeEldestEntry (Map.Entry
<K, V> eldest)
void replaceAll (BiFunction <? Thay thế giá trị của từng entry bằng kết quả
super K,? super V,? extends của việc gọi hàm đã cho trên entry đó cho
V>function) đến khi tất cả các entry đã được xử lý hoặc
hàm ném ra một ngoại lệ
Collection <V> values () Trả về Collection các value có trong Map
này
75
Map
1. HashMap Class
• HashMap quản lý dữ liệu dưới dạng các cặp key –
value. Mỗi key được liên kết với một value
• Không cho phép trùng lặp các key
• Có thể có nhiều value là null nhưng chỉ có một key là
null
• Không đồng bộ; Không duy trì thứ tự
• Dung lương mặc định ban đầu của HashMap là 16.

76
Map
1.1 Các hàm tạo
Constructor Mô tả

HashMap() Xây dựng một HashMap mặc định


HashMap(Map<? extends K,? Khởi tạo hash map bằng cách sử
extends V> m) dụng các phần tử của đối tượng
Map m.
HashMap(int capacity) Khởi tạo dung lượng của hash
map
HashMap(int capacity, float Khởi tạo cả dung lượng và hệ số
loadFactor) tải của hash map

77
Map
1.1 Các hàm tạo (tiếp)

78
Map
1.2 Các phương thức (1)
Phương thức Mô tả
void clear() Loại bỏ tất cả các ánh xạ khỏi map
boolean isEmpty() Trả về true nếu map này không chứa
ánh xạ key - value
Object clone() Trả về một bản sao nông của thể hiện
HashMap này: bản thân các khóa và giá
trị không được sao chép.
Set entrySet() Trả về collection view các ánh xạ có
trong map
Set keySet() Trả về set view của các key có trong
map
V put(Object key, Object value) Chèn một entry trong map
void putAll(Map map) Chèn map được chỉ định trong map

79
Map
1.2 Các phương thức (2)
Phương thức Mô tả
V putIfAbsent(K key, V value) Chỉ chèn value được chỉ định bằng key
được chỉ định trong map nếu nó chưa
được chỉ định
V remove(Object key) Xóa một entry cho key được chỉ định

boolean remove(Object key, Loại bỏ các value được chỉ định bằng
Object value) các key được chỉ định liên quan

V compute(K key, BiFunction<? Tính toán ánh xạ cho key được chỉ định
super K,? super V,? extends V> và value được ánh xạ (Là null nếu
remappingFunction) không có ánh xạ)

80
Map
1.2 Các phương thức (3)
Phương thức Mô tả
V computeIfAbsent(K key, Để tính value của nó bằng hàm ánh xạ
Function<? super K,? extends V> đã cho, nếu key được chỉ định chưa
mappingFunction) được liên kết với một giá trị (hoặc
được ánh xạ thành null) và nhập nó
vàomap này trừ khi null.
V computeIfPresent(K key, Tính toán một ánh xạ mới được cung
BiFunction<? super K,? super V,? cấp cho key và value được ánh xạ
extends V> remappingFunction) hiện tại của nó nếu value của key
được chỉ định là thực tại và không có
null
boolean containsValue(Object Trả về true nếu value bằng với value
value) tồn tại trong map, ngược lại trả về
false

81
Map
1.2 Các phương thức (4)
Phương thức Mô tả
boolean containsKey(Object key) Trả về true nếu key bằng với key tồn tại
trong map, ngược lại trả về false
boolean equals(Object o) So sánh đối tượng o được chỉ định với
map
void forEach(BiConsumer<? super Thực hiện action cho từng mục trong
K,? super V> action) map cho đến khi tất cả các mục đã được
xử lý hoặc action đưa ra một ngoại lệ
V get(Object key) Trả về đối tượng chứa value được liên
kết với key
V getOrDefault(Object key, V Value mà key được chỉ định được ánh xạ
defaultValue) hoặc defaultValue nếu bản đồ không
chứa ánh xạ cho key

82
Map
1.2 Các phương thức (5)
Phương thức Mô tả
boolean isEmpty() Trả về true nếu map trống; trả về false
nếu nó chứa ít nhất một key
V merge(K key, V value, Nếu key được chỉ định chưa được liên
BiFunction<? super V,? super V,? kết với một value hoặc được liên kết với
extends V> remappingFunction) null, liên kết nó với value không null đã
cho
V replace(K key, V value) Thay thế value được chỉ định cho một
key được chỉ định (Giá trị trả về là value
trước khi bị thay thế)
boolean replace(K key, V oldValue, Thay thế value cũ bằng value mới cho
V newValue) một key được chỉ định

83
Map
1.2 Các phương thức (6)

Phương thức Mô tả
void replaceAll(BiFunction<? Thay thế value của mỗi entry bằng
super K,? super V,? extends kết quả của việc gọi hàm đã cho
V> function) trên entry đó cho đến khi tất cả
các entry đã được xử lý hoặc hàm
ném ngoại lệ

Collection<V> values() Trả về collection view các value có


trong map
int size() Trả về số lượng entry trong map

84
DEM
O
Hiển thị toàn bộ entry của HashMap

85
Map

+ Ho và ten:
Tuan
+ Tuoi: 40

86
DEM
O
Lấy dữ liệu value trong HashMap
khi biết key

87
Map

+ Ho và ten:
Tuan
+ Tuoi: 40

88
Map
2. LinkedHashMap Class
• Kế thừa lớp HashMap và thực thi giao diện Map.
• Chứa các giá trị value dựa trên khóa key.
• Chứa các phần tử duy nhất.
• Có thể có một khóa key null và nhiều giá trị value null.
• Không được đồng bộ hóa.
• Duy trì thứ tự chèn.
• Dung lượng mặc định ban đầu của lớp HashMap là 16
với hệ số tải là 0,75.

89
Map
2.1 Hàm khởi tạo
Constructor Mô tả

LinkedHashMap () Khởi tạo LinkedHashMap mặc


định
LinkedHashMap (int capacity) Khởi tạo LinkedHashMap với
dung lượng đã cho
LinkedHashMap (int capacity, Khởi tạo cả công suất và hệ số
float loadFactor) tải
LinkedHashMap (int capacity, Khởi tạo cả công suất và hệ số
float loadFactor, boolean tải với cách sắp xếp được chỉ
accessOrder) định
LinkedHashMap (Map <? Nó được sử dụng để khởi tạo
Extends K,? Extends V> m) LinkedHashMap với các phần tử
từ lớp Map m đã cho

90
Map
2.2 Các phương thức (1)
Phương thức Mô tả
V get (Object key) Trả về value mà key được chỉ định
được ánh xạ đến
void clear () Xóa tất cả các cặp key - value khỏi
Map
boolean containsValue (Object Trả về true nếu Map ánh xạ một hoặc
value) nhiều key tới value đã chỉ định
Set <Map.Entry <K, V >> entryset () Trả về tập các ánh xạ có trong Map
void forEach (BiConsumer <? super Thực hiện action đã cho cho từng entry
K,? super V> action) trong Map cho đến khi tất cả các entry
được xử lý hoặc action đưa ra một
ngoại lệ

91
Map
2.2 Các phương thức (2)
Phương thức Mô tả
V getOrDefault (Object key, V Trả về value mà key được chỉ định ánh xạ đến
defaultValue) hoặc defaultValue nếu Map này không chứa
ánh xạ cho key
Set <K> keySet () Trả về một tập các key có trong Map
protected boolean Trả về true khi loại bỏ entry lớn nhất
removeEldestEntry (Map.Entry <K,
V> eldest)
void replaceAll (BiFunction <? Thay thế giá trị của từng entry bằng kết quả của
super K,? super V,? extends việc gọi hàm đã cho trên entry đó cho đến khi
V>function) tất cả các entry đã được xử lý hoặc hàm ném ra
một ngoại lệ
Collection <V> values () Trả về Collection các value có trong Map này

92
DEM
O
Viết chương trình sử dụng phương
thức xóa một phần tử bất kỳ khỏi
LinkedHashMap

93
Map

94
Map

95
Map
3. TreeMap Class
• Để lưu trữ các cặp key - value theo thứ tự được sắp
xếp.
• Chứa các giá trị value dựa trên khóa key
• Không thể có khóa null nhưng có thể có nhiều giá trị
null
• Không được đồng bộ hóa
• TreeMap duy trì thứ tự tăng dần

96
Map
3.1 Hàm khởi tạo
Constructor Sự miêu tả

TreeMap() Xây dựng một tree map trống được sắp


xếp theo thứ tự tự nhiên của khóa.

TreeMap (Comparator <? Xây dựng một map dựa trên tree trống
super K> comparator) sẽ được sắp xếp bằng comparator

TreeMap (Map <? extends Khởi tạo một treemap với các entry
K,? extends V> m) từ m, sẽ được sắp xếp theo thứ tự tự
nhiên của các key

TreeMap (SortedMap <K,? Khởi tạo một treemap với các entry
extends V> m) từ SortedMap m, sẽ được sắp xếp theo
thứ tự như m.

97
Map
3.1 Hàm khởi tạo

98
Map
3.2 Các phương thức (1)
Phương thức Mô tả
Map.Entry<K,V> ceilingEntry(K key) Trả về cặp key - value có key nhỏ nhất,
lớn hơn hoặc bằng key đã chỉ định hoặc
null nếu không có key đó
K ceilingKey(K key) Trả về key bé nhất, lớn hơn hoặc bằng
key đã chỉ định hoặc null nếu không có
key đó
void clear() Xóa tất cả các cặp key - value khỏi map
Object clone() Trả về một bản sao nông của đối tượng
TreeMap
Comparator<? super K> Trả về Comparator sắp xếp key theo thứ
comparator() tự hoặc null nếu map sử dụng thứ tự tự
nhiên.

99
Map
3.2 Các phương thức (2)
Phương thức Mô tả
NavigableSet<K> descendingKeySet() Trả về một tập các key theo trật tự đảo
ngược có trong map
NavigableMap<K,V> descendingMap() Trả về các cặp key - value được chỉ định
theo thứ tự giảm dần
Map.Entry firstEntry() Trả về cặp key - value có key bé nhất
Map.Entry<K,V> floorEntry(K key) Trả về key lớn nhất, nhỏ hơn hoặc bằng
key đã chỉ định hoặc null nếu không có
key đó
void forEach(BiConsumer<? super K,? Thực hiện hành động đã cho cho từng
super V> action) entry trong map cho đến khi tất cả các
entry được xử lý hoặc hành động đưa ra
một ngoại lệ

100
Map
3.2 Các phương thức (3)
Phương thức Mô tả
SortedMap<K,V> headMap(K toKey) Trả về các cặp key - value có key hoàn toàn nhỏ
hơn toKey.
NavigableMap<K,V> headMap(K toKey, Trả về các cặp key - value có key nhỏ hơn (hoặc
boolean inclusive) bằng nếu inclusive là đúng) toKey
Map.Entry<K,V> higherEntry(K key) Trả về cặp key - value ứng với key bé nhất lớn
hơn key đã cho hoặc null nếu không có key đó
K higherKey(K key) Trả về key bé nhất lớn hơn key đã cho hoặc null
nếu không có key đó
Set keySet() Trả về colection các key tồn tại trong map
Map.Entry <K, V> lastEntry () Trả về cặp key - value trị có key lớn nhất hoặc
null nếu không có key đó
Map.Entry <K, V> lowerEntry (K key) Trả về ánh xạ key - value được liên kết với key
lớn nhất hoàn toàn nhỏ hơn key đã cho hoặc null
nếu không có key đó

101
Map
3.2 Các phương thức (4)
Phương thức Mô tả
K lowerKey(K key) Trả về key lớn nhất hoàn toàn ít hơn khóa
đã cho hoặc null nếu không có key đó
NavigableSet<K> navigableKeySet() Trả về Navigable Set các key có trong map
này
Map.Entry <K, V> pollFirstEntry () Xóa và trả về ánh xạ key - value được liên
kết với key nhỏ nhất trong map này hoặc
null nếu map trống
Map.Entry <K, V> pollLastEntry () Xóa và trả về ánh xạ key - value được liên
kết với key lớn nhất trong map này hoặc null
nếu map trống
V put(K key, V value) Chèn value được chỉ định với key được chỉ
định trong map
void putAll(Map<? extends K,? extends V> Sao chép tất cả các cặp key - value từ map
map) này sang map khác
V replace(K key, V value) Thay thế value được chỉ định cho một key
được chỉ định
102
Map
3.2 Các phương thức (5)
Phương thức Mô tả
boolean replace(K key, V oldValue, V Thay thế value cũ bằng value mới cho một
newValue) key được chỉ định
void replaceAll(BiFunction<? super K,? Thay thế value của từng entry bằng kết quả
super V,? extends V> function) của việc gọi hàm đã cho trên entry đó cho
đến khi tất cả các entry đã được xử lý hoặc
hàm ném ra một ngoại lệ
NavigableMap<K,V> subMap(K fromKey, Trả về các cặp key - value có phạm vi key
boolean fromInclusive, K toKey, boolean từ fromKey đến toKey.
toInclusive)
SortedMap<K,V> subMap(K fromKey, K Trả về các cặp key - value có phạm vi key
toKey) từ fromKey đến nhỏ hơn toKey
SortedMap<K,V> tailMap(K fromKey) Trả về các cặp key - value có khóa lớn hơn
hoặc bằng fromKey.
NavigableMap<K,V> tailMap(K fromKey, Trả về các cặp key - value có khóa lớn hơn
boolean inclusive) (hoặc bằng, nếu inclusive là đúng) toKey

103
Map
3.2 Các phương thức (6)
Phương thức Mô tả
boolean containsKey(Object key) Trả về true nếu map chứa ánh xạ cho key được
chỉ định
boolean containsValue(Object value) Trả về true nếu map ánh xạ một hoặc nhiều key
tới value đã chỉ định
K firstKey() Trả về key đầu tiên (thấp nhất) hiện tại trong map
được sắp xếp này
V get(Object key) Trả về value mà map ánh xạ key được chỉ định
K lastKey() Trả về key cuối cùng (cao nhất) hiện tại trong map
được sắp xếp
V remove(Object key) Loại bỏ cặp key - value của key được chỉ định
khỏi map
Set<Map.Entry<K,V>> entrySet() Trả về một view các ánh xạ có trong map
int size() Trả về số lượng cặp key - value tồn tại trong
hashtable
Collection values() Trả về collection view các value có trong map
104
DEM
O
Hiển thị toàn bộ các entry của TreeMap

105
Map

106
DEM
O
Thay thế value của một entry
trong TreeMap

107
Map

108
BÀI TẬP
Code lại các ví dụ trong slide bài giảng chương 4.
Yêu cầu:
1. Tạo Project COLLECTIONS có các gói sau:
- com.na.collections.list: gồm các class trong các
slide 18, 19, 21, 24, 38 và 39, 41 và 42.
- com.na.collections.set: gồm các class
trong slide 53, 55, 59, 68
- com.na.collections.map: gồm các class
trong slide 85, 87, 105, 107.
2.Tên các file java đặt trùng tên class trong các
slide.
109
BÀI TẬP
Bài 1:
Viết chương trình nhập vào một dãy số các số
nguyên, sử dụng ArrayList. Thực hiện các công việc
sau:
• Tìm số nguyên có giá trị lớn nhất
• Nhập vào 1 số nguyên, xoá khỏi mảng các phần
từ có giá trị bằng giá trị vừa nhập
• Sắp xếp dãy số và in dãy số ra màn hình

110
BÀI TẬP
Bài 2:
Viết chương trình xây dựng 1 danh sách liên kết
(LinkedList) lưu trữ n số nguyên dương (n được
nhập từ bàn phím). Sau đó tính trung bình cộng của
các số chẵn và hiển thị kết quả ra màn hình.
Hướng dẫn: Để giải bài này, chúng ta sẽ sử dụng vòng
lặp for để duyệt qua các phần tử trong danh sách. Nếu
phần tử nào chia hết cho 2 thì phần tử đó là số chẵn.
Sau đó ta sẽ cộng dồn các số đó vào biến sum, và cuối
cùng chỉ cần lấy biến sum đó chia cho số các số chẵn thì
sẽ tìm được trung bình cộng của các số đó.
111
BÀI TẬP
Bài 3:
Viết chương trình thực hiện các yêu cầu sau:
• Khai báo một danh sách liên kết lưu trữ danh sách thông tin sinh
viên. Thông tin của 1 sinh viên bao gồm tên và điểm của sinh viên
đó.
• Thêm sinh viên vào trong danh sách vừa tạo. Việc nhập sinh viên
sẽ dừng lại khi người dùng nhập họ tên sinh viên là một chuỗi
rỗng.
• Đếm số sinh viên phải thi lại và hiển thị thông tin của những sinh
viên đó ra. Sinh viên phải thi lại khi điểm của sinh viên đó <= 5.
• Hiển thị các sinh viên có điểm cao nhất. Nếu có nhiều sinh viên
bằng điểm thì phải hiển thị tất cả những sinh viên đó ra.
• Tìm kiếm sinh viên theo tên và hiển thị thông tin sinh viên vừa tìm
được.
112
BÀI TẬP
Bài 4:
Viết chương trình thực hiện các công việc sau:
Khai báo 1 HashSet có kiểu dữ liệu là String. Sau đó thêm vào
HashSet này tên của các loại trái cây được nhập bất kỳ từ bàn
phím. Hiển thị số phần tử có trong HashSet vừa tạo.
Nhập vào tên 1 loại trái cây và kiểm tra loại trái cây đó có tồn tại
trong HashSet này hay không. Nếu có thì thông báo có tìm thấy,
ngược lại thì thông báo không tìm thấy. Xóa 1 loại trái cây bất kỳ
trong HashSet đó và hiển thị các phần tử còn lại.
Tạo 1 List mới có cùng kiểu dữ liệu với HashSet và thêm các phần
tử của List này. Sau đó thêm các phần tử của List này vào trong
HashSet ban đầu và hiển thị lại HashSet này sử dụng Iterator. Xóa
các phần tử của List có trong HashSet và hiển thị lại HashSet.
113
BÀI TẬP
Bài 5:
Xây dựng class SinhVien gồm ba thông tin: Mã sinh
viên, Họ và tên, Lớp.
• Dùng Map để:
 Nhập danh sách n sinh viên.
 Nhập tên Lớp từ bàn phím. Hiển thị những sinh
viên thuộc Lớp vừa nhập.
 Nhập Mã sinh viên từ bàn phím. Hiển thị họ tên
và Lớp tương ứng.

114

You might also like