Hưnn ít thức khuya

Hưnn ít thức khuya Educator, Writor, Romancer, Developer

10/09/2024

COMPONENT TRONG ANGULAR (PHẦN 2)

Ở phần trước, chúng ta đã tìm hiểu về các kiến thức cơ bản trong Angular component. Trong phần này, chúng ta sẽ đi sâu hơn vào những khái niệm nâng cao giúp bạn làm chủ cách xây dựng và tối ưu hóa component trong Angular.

1. Lifecycle Hooks (Các vòng đời của component)
Lifecycle hooks cho phép bạn can thiệp vào các giai đoạn khác nhau trong vòng đời của một component. Điều này đặc biệt hữu ích khi bạn cần thực hiện những công việc như khởi tạo dữ liệu, cập nhật giao diện hoặc dọn dẹp tài nguyên.

Các hooks phổ biến:
a. ngOnInit():

Cách hoạt động: Được gọi một lần duy nhất sau khi Angular đã khởi tạo tất cả các property .

Sử dụng khi nào: Dùng để khởi tạo dữ liệu hoặc gọi các API khi component được tạo.

b. ngOnChanges(changes: SimpleChanges):

Cách hoạt động: Được gọi khi có sự thay đổi giá trị của bất kỳ property nào trong component.

Sử dụng khi nào: Khi cần xử lý logic khi dữ liệu từ component cha thay đổi.

c. ngDoCheck():

Cách hoạt động: Được gọi khi Angular thực hiện change detection, cho phép bạn kiểm tra các thay đổi mà ngOnChanges không thể nhận diện.

Sử dụng khi nào: Khi cần thực hiện kiểm tra thay đổi tùy chỉnh mà Angular không thể tự động bắt được.

d. ngAfterViewInit():

Cách hoạt động: Được gọi sau khi view của component và tất cả các view con của nó đã được khởi tạo.
Sử dụng khi nào: Thường dùng để thao tác với DOM hoặc khởi tạo các thành phần con sau khi view đã được render.

e. ngOnDestroy():

Cách hoạt động: Được gọi ngay trước khi component bị hủy.
Sử dụng khi nào: Dùng để dọn dẹp tài nguyên, chẳng hạn như hủy các subscription hoặc giải phóng bộ nhớ.

2. Component Interaction (Giao tiếp giữa các component)
Trong ứng dụng Angular, các component thường cần trao đổi dữ liệu với nhau. Có nhiều cách để thực hiện điều này tùy thuộc vào mối quan hệ giữa các component.

Cách giao tiếp giữa các component:
a. () và ():

- (): Cho phép component nhận dữ liệu từ component cha.

- (): Dùng để phát sự kiện từ component con lên component cha bằng EventEmitter.

b. ViewChild và ContentChild:

- ViewChild: Lấy tham chiếu đến một thành phần con hoặc phần tử DOM sau khi view đã được render.

- ContentChild: Được sử dụng để tham chiếu đến các phần tử được chèn từ bên ngoài vào qua ng-content.

c. Service (Dependency Injection):

Sử dụng service để chia sẻ dữ liệu và logic giữa các component.
Thông qua dependency injection, Angular sẽ cung cấp instance của service cho các component có nhu cầu sử dụng chung dữ liệu.

3. Dynamic Components (Component động)
Angular cho phép bạn tạo và thêm các component vào DOM một cách động, hữu ích khi cần tạo giao diện linh hoạt, ví dụ như mở các modal hoặc popup.

4. Content Projection (Nguyên lý chèn nội dung)
Content projection cho phép bạn chèn nội dung từ component cha vào một component con, giúp tăng khả năng tái sử dụng component.

- : Được sử dụng để chèn nội dung từ bên ngoài vào component.

- Multi-slot projection:

Cho phép chèn nhiều đoạn nội dung vào các vị trí khác nhau trong component.

5. Optimizing Components (Tối ưu hóa component)
Trong Angular, việc tối ưu hóa component giúp cải thiện hiệu suất và giảm thiểu số lần re-render không cần thiết.

a. Pure vs Impure Pipes:
- Pure Pipes: Chỉ được gọi lại khi giá trị đầu vào thay đổi (dựa trên tham chiếu). Tối ưu hiệu suất tốt hơn.

- Impure Pipes: Được gọi lại trong mỗi lần change detection. Thường dùng cho các dữ liệu thay đổi liên tục như danh sách động.

b. TrackBy trong ngFor:
TrackBy cho phép Angular theo dõi danh sách dữ liệu tốt hơn, giúp ngăn việc re-render toàn bộ danh sách khi chỉ có một phần tử thay đổi.

c. Lazy Loading:
Lazy loading cho phép tải các component hoặc module chỉ khi chúng cần thiết, giúp giảm tải lượng tải ban đầu của ứng dụng.

10/09/2024

COMPONENT TRONG ANGULAR ( phần 1 )

- Trong Angular, Component là một trong những yếu tố cốt lõi. Nó kết hợp logic, giao diện người dùng, và các styles để tạo nên một phần của ứng dụng. Mỗi component thường có bốn file chính:ts: Chứa logic của component cùng với decorator .html: Template HTML để định nghĩa giao diện.css hoặc .scss: File stylesheet để định nghĩa các style cho component.spec.ts: File chứa các bài kiểm thử (unit test) cho component.

- Angular cung cấp nhiều tham số cấu hình để tinh chỉnh hành vi của component thông qua decorator . Dưới đây là 14 tham số cấu hình thường gặp và cách sử dụng chúng trong Angular.

1. changeDetection
Cách hoạt động: Kiểm soát khi nào một component cần được cập nhật lại (re-render).

Mô tả:
ChangeDetectionStrategy.Default: Angular tự động kiểm tra mọi thay đổi và cập nhật component sau mỗi hành động hoặc sự kiện.
ChangeDetectionStrategy.OnPush: Chỉ cập nhật component khi các Input properties của nó thay đổi (tức là khi tham chiếu của dữ liệu thay đổi) hoặc có sự kiện nội bộ.

Kết quả:
Default: Mọi thay đổi trong dữ liệu hoặc sự kiện sẽ kích hoạt việc cập nhật lại giao diện.
OnPush: Component chỉ cập nhật khi thật sự cần thiết.

Sử dụng phù hợp:
Sử dụng Default khi không cần tối ưu hóa hiệu năng.
Sử dụng OnPush để giảm tải kiểm tra thay đổi và tối ưu hiệu năng trong các ứng dụng lớn.

2. viewProviders
Cách hoạt động: Định nghĩa các service hoặc provider chỉ được inject vào view con của component.

Kết quả: Chỉ các phần tử trong view con của component có thể truy cập những provider này, không có sẵn trong component cha.

Sử dụng phù hợp: Khi bạn cần cung cấp một dịch vụ hoặc dependency chỉ cho phần view con của component và muốn tách biệt khỏi view cha.

3. moduleId
Cách hoạt động: Được sử dụng để xử lý các URL tương đối trong các template hoặc style.
Kết quả: Cấu hình này đã bị deprecated và sẽ bị loại bỏ trong
Angular v17.

Sử dụng phù hợp: Không cần sử dụng nữa. Thay vào đó, sử dụng đường dẫn tương đối từ nơi mà module được định nghĩa.

4. templateUrl
Cách hoạt động: Chỉ định đường dẫn đến file HTML chứa template cho component.

Kết quả: Angular sẽ tải file HTML từ đường dẫn này và sử dụng nó để render giao diện.

Sử dụng phù hợp: Khi template HTML của component phức tạp hoặc dài, nên tách ra thành file riêng để dễ quản lý.

5. template
Cách hoạt động: Định nghĩa template inline dưới dạng chuỗi.

Kết quả: HTML được viết trực tiếp trong file TypeScript của component.

Sử dụng phù hợp: Sử dụng khi template ngắn, đơn giản và không cần tách riêng ra file .html.

6. styleUrls
Cách hoạt động: Định nghĩa đường dẫn đến file CSS/SCSS chứa các stylesheet cho component.

Kết quả: Angular sẽ tải các file CSS từ đường dẫn này và áp dụng style cho component.

Sử dụng phù hợp: Sử dụng khi các style được định nghĩa trong file CSS/SCSS riêng biệt.

7. styles
Cách hoạt động: Định nghĩa CSS inline trực tiếp trong file TypeScript.

Kết quả: CSS được viết trực tiếp trong file .ts và chỉ áp dụng cho component đó.

Sử dụng phù hợp: Khi style đơn giản, ngắn gọn và không cần tách ra file riêng.

8. animations
Cách hoạt động: Định nghĩa các animation trigger sẽ được sử dụng trong component.

Kết quả: Cho phép sử dụng các hiệu ứng chuyển động (animation) trong template của component.

Sử dụng phù hợp: Khi cần tạo các hiệu ứng chuyển động để làm UI hấp dẫn hơn.

9. encapsulation
Cách hoạt động: Quy định chính sách đóng gói (encapsulation) của các style trong component.

Mô tả:
ViewEncapsulation.Emulated: Giả lập Shadow DOM, các style chỉ áp dụng cho component.
ViewEncapsulation.None: Style áp dụng cho toàn bộ ứng dụng.
ViewEncapsulation.ShadowDom: Sử dụng Shadow DOM thật để đóng gói style.

Kết quả: Quyết định phạm vi áp dụng của các style trong component.

Sử dụng phù hợp: Sử dụng Emulated khi muốn đóng gói style cục bộ, hoặc None khi muốn các style áp dụng toàn bộ ứng dụng.

10. interpolation
Cách hoạt động: Định nghĩa lại dấu phân cách cho các biểu thức trong template thay vì dùng mặc định là {{ và }}.

Kết quả: Có thể thay đổi dấu phân cách cho phù hợp với các cú pháp khác hoặc yêu cầu đặc biệt.

Sử dụng phù hợp: Khi cần tránh xung đột cú pháp với một ngôn ngữ hoặc template engine khác.

11. preserveWhitespaces
Cách hoạt động: Quyết định có giữ lại khoảng trắng thừa trong template khi biên dịch hay không.

Kết quả: Nếu true, khoảng trắng sẽ được giữ lại; nếu false, khoảng trắng thừa sẽ bị loại bỏ.

Sử dụng phù hợp: Khi bạn cần giữ nguyên định dạng khoảng trắng trong template vì lý do hiển thị hoặc logic.

12. standalone
Cách hoạt động: Đánh dấu component là "standalone", nghĩa là nó không cần phải được khai báo trong một NgModule.

Kết quả: Component độc lập không cần nằm trong NgModule và có thể tự quản lý các dependencies.

Sử dụng phù hợp: Khi bạn muốn tạo component độc lập không cần NgModule, giúp giảm sự phụ thuộc và tăng tính linh hoạt.

13. imports
Cách hoạt động: Định nghĩa các dependencies (component, directive, pipe) mà component standalone cần để hoạt động.

Kết quả: Các thành phần này sẽ được import và sử dụng trong template của component.

Sử dụng phù hợp: Khi bạn làm việc với các standalone component và muốn nhập các dependencies cần thiết.

14. schemas
Cách hoạt động: Định nghĩa các schema cho phép sử dụng các phần tử HTML hoặc thuộc tính không phải của Angular.

Kết quả: Các thành phần không chuẩn (như custom elements) sẽ được phép sử dụng trong component.

Sử dụng phù hợp: Khi bạn làm việc với các custom elements hoặc thành phần không phải của Angular và cần khai báo chúng trong component.

Đề bài: Bạn có một luống hoa dài, trong đó một số ô đã được trồng hoa, một số khác thì chưa được trồng. Quy tắc là không...
12/01/2024

Đề bài: Bạn có một luống hoa dài, trong đó một số ô đã được trồng hoa, một số khác thì chưa được trồng.
Quy tắc là không thể trồng hoa ở 2 ô liền kề nhau.
Cho một mảng số nguyên flowerbed, trong mảng này 0 biểu thị ô trống, 1 biểu thị ô đã có hoa và n là số hoa mới muốn trồng

Nhiệm vụ: Xác định xem liệu có thể trồng n hoa mới vào luống hoa flowerbed mà không vi phạm nguyên tắc không trồng liền kề hay không. Nếu có thì trả về true, sai thì false

Logic:
~ Xử lý trường hợp không cần trồng hoa
+ if (n == 0) return true: Nếu n là 0, nghĩa là không cần trồng thêm hoa nào, ta có thể trả về true ngay lập tức.

~ Khởi tạo biến đếm và lưu độ dài luống hoa:
+ int possible = 0: Biến này sẽ đếm số hoa có thể trồng được theo quy tắc.
+ int length = flowerbed.length: Lưu độ dài của mảng flowerbed để tránh truy cập vượt quá chỉ số hợp lệ.

~ Xử lý trường hợp luống hoa chỉ có một ô:
+ if (length == 1) { return flowerbed[0] == 0; }: Nếu luống hoa chỉ có một ô, ta chỉ cần kiểm tra xem ô đó có trống hay không (flowerbed[0] == 0) và trả về kết quả tương ứng.

~ Xử lý ô đầu tiên
+ if (flowerbed[0] == 0 && flowerbed[1] == 0) { ... }: Nếu ô đầu tiên và ô thứ hai đều trống, ta có thể trồng hoa ở ô đầu tiên và tăng biến đếm possible.

~ Duyệt các ô ở giữa luống hoa
+ for (int i = 1; i < length - 1; i++) { ... }: Vòng lặp này duyệt qua các ô ở giữa luống hoa (từ ô thứ hai đến ô áp chót).
+ if (flowerbed[i] == 0 && flowerbed[i - 1] != 1 && flowerbed[i + 1] != 1) { ... }: Nếu ô hiện tại trống và hai ô liền kề trước sau đều không có hoa, ta có thể trồng hoa ở ô hiện tại và tăng biến đếm possible.

~ Xử lý ô cuối cùng
+ if (flowerbed[length - 1] == 0 && flowerbed[length - 2] == 0) { ... }: Nếu ô cuối cùng và ô trước đó đều trống, ta có thể trồng hoa ở ô cuối cùng và tăng biến đếm possible.

~ Kết quả:
+ return possible >= n;: Cuối cùng, ta trả về true nếu số hoa có thể trồng được (possible) lớn hơn hoặc bằng số hoa cần trồng (n), ngược lại trả về false.

Giải thích bài toán chia kẹo cho trẻ emBài toán này yêu cầu bạn phân chia số kẹo thêm sao cho một số trẻ em có tổng số k...
11/01/2024

Giải thích bài toán chia kẹo cho trẻ em
Bài toán này yêu cầu bạn phân chia số kẹo thêm sao cho một số trẻ em có tổng số kẹo lớn nhất sau khi nhận kẹo. Dưới đây là giải thích chi tiết từng bước:

1. Input:
- candies: Một mảng chứa số kẹo ban đầu của từng trẻ em (kiểu int).
- extraCandies: Số kẹo bổ sung mà bạn có (kiểu int).

2. Output:
- result: Một mảng kiểu bool có độ dài bằng với candies. Giá trị true tại result[i] nghĩa là sau khi bạn cho trẻ em thứ i tất cả các kẹo bổ sung extraCandies, trẻ đó sẽ có tổng số kẹo lớn nhất (so với giá trị max trước khi cho). Ngược lại, giá trị false nghĩa là trẻ đó sẽ không có tổng số kẹo lớn nhất.

3. Nôm na:
- Lấy ra giá trị lớn nhất trước khi cho kẹo, so sánh kẹo sau khi cho và giá trị lớn nhất. Nếu lớn hơn thì true, nếu bé hơn là false

Đề bài: Cho hai chuỗi str1 và str2, trả về 1 chuỗi nhỏ nhất là x sao x thuộc str1 và str2.Example 1:Input: str1 = "ABCAB...
10/01/2024

Đề bài: Cho hai chuỗi str1 và str2, trả về 1 chuỗi nhỏ nhất là x sao x thuộc str1 và str2.
Example 1:

Input: str1 = "ABCABC", str2 = "ABC"
Output: "ABC"
Example 2:

Input: str1 = "ABABAB", str2 = "ABAB"
Output: "AB"
Example 3:

Input: str1 = "LEET", str2 = "CODE"
Output: ""

Phương pháp:
- Vì str1 và str2 cùng chia hết cho một str x, cũng như là str1 > str2 do đó str2 là 1 phần của str1.

- Người thông minh dùng đệ quỵ để cắt chuỗi sao cho không còn cắt được nữa

- Người ngu dùng 2 vòng lặp để thêm vào Set
*** Đây là cách tôi giải mấy ông à:

class Solution {
public String gcdOfStrings(String str1, String str2) {
if (str1.contains(str2)) {
char[] chars1 = str1.toCharArray();
char[] chars2 = str2.toCharArray();

Set commonChars = new HashSet();
for (char c1 : chars1) {
for (char c2 : chars2) {
if (c1 == c2) {
commonChars.add(c1);
break;
}
}
}

// Tạo một string mới chỉ chứa các ký tự chung
String gcd = "";
for (Character c : commonChars) {
gcd += c;
}

return gcd;
}else {
return "";
}

}
}
O (n^2) // (này đi làm người ta đuổi kuts)

Cách giải: bên dưới có bigO là On

Đề bài: Cho 2 chuỗi là word1 và word2. Hãy hợp nhất 2 chuỗi lại với nhau theo thứ tự lần lượt.Mô tả: word1:  a   b   cwo...
10/01/2024

Đề bài: Cho 2 chuỗi là word1 và word2. Hãy hợp nhất 2 chuỗi lại với nhau theo thứ tự lần lượt.

Mô tả:
word1: a b c
word2: p q r
merged: a p b q c r

Phương pháp:
- Dùng 1 vòng lặp while để thêm lần lượt ký tự từ word1 và word2 vào StringBuilder (sử dụng append)

Binary Search - Easy
06/01/2024

Binary Search - Easy

Đề bài: Xây dựng một phương thức gồm 2 tham số là ListNode (list1, list2). Trong đó 1 node có cấu trúc gồm data, con trỏ...
22/12/2023

Đề bài: Xây dựng một phương thức gồm 2 tham số là ListNode (list1, list2). Trong đó 1 node có cấu trúc gồm data, con trỏ chỉ đến node sau. Rồi sắp xếp từ bé đến lớn.

Bài giải:
Bước 1: Khởi tạo một class ListNode để triển khai cho một node trong Linked List. Trong đó giá trị (value) và một con trỏ next (trỏ đến node tiếp theo danh sách)

Bước 2: Xây dựng phương thức mergeTwoLists dùng để gộp 2 Linked List (đã sắp xếp từ bé đến lớn)
+ Trong đó, ta khởi tạo một node dummy có giá trị là 0. Node này sẽ làm HEAD của ListNode sau khi gộp

+ Khởi tạo con trỏ current và và gán nó với node dummy trên. Ngoài ra, con trỏ này sẽ di chuyển qua mỗi bước gộp để thêm vào danh sách kết quả

Bước 3: Phương thức mergeTwoLists:
+ Sử dụng vòng lặp while để duyệt qua cả hai danh sách liên kết (list1 và list2) đồng thời.

+ So sánh giá trị của node đầu tiên của cả hai danh sách (list1.value và list2.value).
~ Nếu list1.value nhỏ hơn, thêm list1 vào danh sách kết quả và di chuyển list1 đến node tiếp theo của nó.

~ Nếu list2.value nhỏ hơn hoặc bằng, thêm list2 vào danh sách kết quả và di chuyển list2 đến node tiếp theo của nó.

~ Di chuyển current đến node mới thêm vào danh sách kết quả.

20/12/2023



CẤU TRÚC DỮ LIỆU QUEUE TRONG JAVA

1. Khái niệm
- Queue hay còn gọi là hàng đợi là gì? Đó là một cấu trúc dữ liệu tuyến tính dựa theo nguyên tắc FIFO (First in First Out) vào trước ra trước.

- Hãy tưởng tượng bạn đi mua bánh phô mai đồng xu hoặc trà chanh giã tay thì bạn sẽ cần phải xếp hàng để mua lần lượt, khi đó ai đến trước (xếp hàng trước) sẽ được mua trước (thoát khỏi hàng)

- Class LinkedList và ArrayDeque là hai class thường được sử dụng để implements interface Queue.
--------------------
2. Cấu trúc dữ liệu Queue đượ sử dụng để làm gì?
- 1 ứng dụng mà chúng ta thường thấy khi sử dụng Queue đó là việc in ấn. Trong đó file của tôi có 100 trang đánh thứ tự từ 1 đến 100 thì chúng sẽ lần lượt được cho vào một cấu trúc Queue tránh xung đột giữa các trang hoặc một máy in có 3 người cùng in thì người nào yêu cầu in trước sẽ được máy in in trước cho đến người cuối cùng

--------------------
3. Các phương thức trong interface Queue
- add(E element): Thêm phần tử vào cuối hàng đợi. Nếu không thể thêm được (ví dụ: hàng đợi có giới hạn và đầy), nó sẽ ném một ngoại lệ.

- offer(E element): Thêm phần tử vào cuối hàng đợi. Trả về true nếu thêm thành công, false nếu không thể thêm được (hàng đợi đầy).

- remove(): Loại bỏ và trả về phần tử ở đầu hàng đợi. Nếu hàng đợi trống, nó sẽ ném một ngoại lệ.

- poll(): Loại bỏ và trả về phần tử ở đầu hàng đợi. Trả về null nếu hàng đợi trống.

- element(): Trả về phần tử ở đầu hàng đợi mà không loại bỏ nó. Nếu hàng đợi trống, nó sẽ ném một ngoại lệ.

- peek(): Trả về phần tử ở đầu hàng đợi mà không loại bỏ nó. Trả về null nếu hàng đợi trống.

--------------------
4. Ví dụ về interface Queue
package com.gpcoder.collection.queue;

import java.util.LinkedList;
import java.util.Queue;

public class QueueLinkedListDemo {
public static void main(String[] args) {
// Khởi tạo hàng đợi LinkedList
Queue names = new LinkedList();

// offer(E): Thêm phần tử vào hàng đợi (queue).
// Với hàng đợi LinkedList phần tử sẽ được thêm vào cuối hàng đợi.
// Trả về true nếu trèn thành công.
// Trả về false nếu hàng đợi không còn chỗ.
names.offer("E");
names.offer("A");
names.offer("M");

// add(E): Thêm phần tử vào hàng đợi.
// Với hàng đợi LinkedList phần tử sẽ thêm vào cuối hàng đợi.
// Trả về true nếu thêm thành công
// Ném ra ngoại lệ nếu hàng đợi không còn chỗ.
names.add("G");
names.add("B");

while (true) {
// Lấy ra và loại bỏ phần tử đầu tiên ra khỏi hàng đợi.
// Trả về null nếu không còn phần tử nào trong hàng đợi.
String name = names.poll();
if (name == null) {
break;
}
System.out.println("Name=" + name);
}

}
}

--------------------
Output:
Name=E
Name=A
Name=M
Name=G
Name=B

20/12/2023



CẤU TRÚC DỮ LIỆU STACK TRONG JAVA

1. Khái niệm
- Stack hay còn gọi là ngăn xếp là gì? Đó là cấu trúc dữ liệu tuyến tính dựa trên nguyên tắc LIFO (Last in First out) vào sau ra trước

- Hãy tưởng tượng bạn một trồng đĩa đang xếp trồng lên nhau và khi bạn cần sử dụng thì bạn sẽ lấy cái đĩa ở trên cùng ra trước (đĩa trên cùng là đĩa vào sau).

--------------------
2. Cấu trúc dữ liệu Stack để làm gì?
- 1 ứng dụng rất dễ thấy của Stack là lệnh Undo(Ctrl + Z) bạn sử dụng trong Word hay 1 số chương trình khác. Trong đó ứng dụng sẽ lưu trữ lịch sử các trạng thái hoặc hành động của người dùng. Khi người dùng gọi đến yêu cầu Undo thì chương trình sẽ xóa hành động cuối cùng ra khỏi stack và khôi phục trạng thái đó.

--------------------
3. Các phương thức của Stack
- push(E item): Đưa phần tử vào đỉnh của stack.

- pop(): Lấy ra và loại bỏ phần tử ở đỉnh của stack.

- peek(): Xem giá trị của phần tử ở đỉnh của stack mà không loại bỏ nó.

- empty(): Kiểm tra xem stack có rỗng hay không.

- search(Object o): Tìm kiếm một phần tử trong stack và trả về chỉ số từ đỉnh của stack. Nếu không tìm thấy, trả về -1.

Do class Stack được kế thừa từ class Vector trong Java do đó nó có thể sử dụng các phương thức của Vector.

- add(E element): Thêm phần tử vào cuối vector.

- add(int index, E element): Thêm phần tử vào vị trí cụ thể trong vector.

- addAll(Collection c): Loại bỏ tất cả các phần tử từ một Collection khỏi vector.

- size(): Trả về số lượng phần tử trong vector.

20/12/2023



MAP INTERFACE TRONG JAVA

1. Khái niệm
- Trong java, map được sử dụng để lưu trữ và truy xuất dữ liệu theo cấu trúc key-value. Mỗi cặp key-value được gọi là một entry

- Map chỉ chứa các key duy nhất không chứa các key trùng lặp.

- Các class implements Map interface là HashMap, LinkedHashMap, TreeMap.
+ HashMap không đảm bảo thứ tự các entry được thêm vào

+ LinkedHashMap đảm bảo thứ tự các entry được thêm vào

+ TreeMap duy trì thứ tự các phần tử dựa vào bộ so sánh "Comparator"

-----------------------------
2. Các phương thức của Map interface
- void clear(): Gỡ bỏ tất cả cặp key/value từ Map đang gọi

- boolean containsKey(Object key): Trả về true nếu Map đang gọi chứa k như là một key. Nếu không là false

- boolean containsValue(Object v): Trả về true nếu Map đang gọi chứa v như là một value. Nếu không là false

- boolean equals(Object obj): Trả về true nếu obj là một Map và chứa cùng các Entry. Nếu không là false.

- Object get(Object key): Trả về value mà liên kết với key

- int hashCode(): Trả về hash code cho Map đang gọi

- boolean isEmpty() Trả về true nếu Map đang gọi là trống, nếu không là false

- Object put(Object key, Object value): Đặt một entry vào Map đang gọi, ghi đè bất kỳ value trước mà liên kết với key. Với key và value tương ứng là k và v. Trả về null nếu key đã không tồn tại. Nếu không thì, value trước mà liên kết với key được trả về

- void putAll(Map map): Đặt tất cả entry từ m vào trong Map này

- Object remove(Object key): Gỡ bỏ entry mà có khóa là key được chỉ định.

- int size(): Trả về số các cặp key/value trong Map

- Collection values( ): Trả về một tập hợp chứa các value trong Map. Phương thức này cung cấp một collection-view của các value trong Map

- Set keySet(): Nó được sử dụng để trả đối tượng Set có chứa tất cả các keys.

- Set entrySet(): Nó được sử dụng để trả lại đối tượng Set có chứa tất cả các keys và values.

-----------------------------
3. Ví dụ sử dụng Map
package data.structure.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

public class MapExample {
public static void main(String args[]) {
// init map
Map map = new HashMap();
map.put(1, "Basic java");
map.put(2, "OOP");
map.put(3, "Collection");

// show map using method keySet()
for (Integer key : map.keySet()) {
String value = map.get(key);
System.out.println(key + " = " + value);
}

System.out.println("---");

// show map using method keySet()
for (Entry entry : map.entrySet()) {
Integer key = entry.getKey();
String value = entry.getValue();
System.out.println(key + " = " + value);
}
}
}
-----------------------------
Output:
1 = Basic java
2 = OOP
3 = Collection
---
1 = Basic java
2 = OOP
3 = Collection

Address

Hanoi
10000

Telephone

+84359021323

Website

Alerts

Be the first to know and let us send you an email when Hưnn ít thức khuya posts news and promotions. Your email address will not be used for any other purpose, and you can unsubscribe at any time.

Share

Share on Facebook Share on Twitter Share on LinkedIn
Share on Pinterest Share on Reddit Share via Email
Share on WhatsApp Share on Instagram Share on Telegram