Contents
Chào mừng bạn đến với Fx Studio. Chúng ta đã được biết về 2 kiểu dữ liệu đại diện cho Collections Type trong ngôn ngữ lập trình Dart rồi. Và với chuyến du lịch 0 đồng Dart Tour này, ta sẽ tìm hiểu tiếp một kiểu dữ liệu mới. Đó chính là Map Type, hay còn gọi là kiểu từ điển.
Nếu bạn chưa biết về List & Set, là kiểu dữ liệu cơ bản của Collections, thì có thể tham khảo qua 2 link sau:
Còn nếu mọi việc đã ổn rồi, thì …
Bắt đầu thôi!
Chuẩn bị
Về mặt công cụ editor thì khá đơn giản:
- TextEditor
- Visual Studio Code (nên dùng)
Hoặc bạn vào trang https://dartpad.dev/ để tiến hành code luôn. Khá là giống với Playground của Swift.
Về mặt lý thuyết, nếu bạn chưa biết gì về Dart, thì có thể theo dõi lại các bài viết trong series Dart Tour nhóe.
Map Type
Map Type trong Dart cũng là một cấu trúc dữ liệu tập hợp.
Map Type còn được xem là một kiểu từ điển, tức là với mỗi key
sẽ có value
tương tứng. Và ta có các đặc điểm sau cho Map.
- Các phần tử là 1 cặp giá trị, bao gồm
key
&value
- Không có yêu cầu về thứ tự trong Map
- Các
key
phải cũng kiểu dữ liệu với nha vàvalue
cũng vậy - Giữa
key
&value
có thể khác kiểu dữ liệu - 1
key
trong Map là tồn tại duy nhất. - Để tìm tới giá trị của một phần tử thì phải dựa vào
key
của nó
Nghe qua có thể bạn mông lung một chút. Nhưng đây chính là kiểu dữ liệu mô tả cho kiểu dữ liệu JSON mà bạn sẽ phải tương tác khi muốn làm việc với các API>
Create Map
Ta sẽ sử dụng các dấu {}
để tạo ra một Map. Tuy nhiên, sẽ có chút khác biệt lại generic type cung cấp vào giữa 2 dấu <>
. Bạn sẽ cần tới 2 type cho key
& value
. Cú pháp đơn giản sẽ như sau:
Map<type_key, type_value> map_name = {};
Tạo một Map rỗng
Bạn xem ví dụ nha:
//1 final Map<String, int> emptyMap = {}; //2 final emptyMap = <String, int>{}; //3 final emptySomething = {};
Trong đó:
- Cách 1 & 2 thì ý nghĩa giống như List & Set đã trình bày ở trên.
- Cách 3 thì tạo 1 Map rỗng mà không cho biết kiểu dữ liệu như thế nào, nên chúng sẽ nhận kiểu như sau
<dynamic, dynamic>
.
Set & Map có cùng kiểu gán một tập hợp rỗng với dấu
{}
. Nên bạn phải cẩn thận nha.
Tạo một Map với giá trị
Bạn xem ví dụ sau:
final foods = { 'cakes': 20, 'pies': 14, 'donuts': 37, 'cookies': 141, }; final numbers = { 1: 'one', 2: 'two', 3: 'three', 4: 'four', }; print(foods); //{cakes: 20, pies: 14, donuts: 37, cookies: 141} print(numbers); //{1: one, 2: two, 3: three, 4: four}
Cách này tương tự với việc tạo bằng Map rỗng, tuy nhiên chúng ta sẽ thêm các cặp giá trị vào giữa 2 dấu {}
. Dart sẽ tự động nhận diện ra được kiểu cho key
& value
. Như ví dụ thì:
foods
có kiểu dữ kiệu<String, int>
numbers
có kiểu dữ liệu là<int, String>
Ta có một số lưu ý như sau:
- Keys sẽ phải đảm bảo tất cả là duy nhất
- Về Values thì có thể trung nhau vẫn được
Ví dụ như sau:
final map1 = { 'A' : 1, 'B' : 2, 'C' : 4, 'B' : 3 }; // error final map2 = { 'A' : 1, 'B' : 2, 'C' : 3, 'D' : 3 };
Operations
Cũng như List, với Map ta cũng sẽ có một số toán tử cơ bản liên quan tới việc truy cập các phần tử. Map sẽ có đặc trưng thông qua key
(List thì thông qua index
). Ta sẽ tìm hiểu thông qua các ví dụ sau:
- Accessing elements from a map
Vấn đề đâu tiên, cần bạn thành thạo đó là truy cập tới phần tử trong Map, thông qua key
của nó. Ví dụ code như sau:
final numberOfCakes = foods['cakes']; print(numberOfCakes); //20
Chúng ta sẽ đặt key
vào trong dấu []
để truy cập tới đúng phần tử mà chúng ta mong muốn
- Adding elements to a map
Xem ví dụ trước nhoé.
foods['brownies'] = 99; print(foods); //{cakes: 20, pies: 14, donuts: 37, cookies: 141, brownies: 99}
Khi thêm 1 phần tử mới vào Map, thì cũng giống như ra truy cập vào phần tử qua key
. Sau đó, ta gán giá trị vào. Vì key
chưa tồn tại trong Map, nên Map sẽ tạo thêm một phần tử theo key
đó và value
bằng giá trị ta gán vào.
- Updating an element
Tương tự như cách thêm một phần tử, với việc cập nhật lại giá trị thì ta sẽ dùng key
là phần tử đã có trong Map. Sau đó, gán giá trị mới vào.
foods['cakes'] = 1;
- Removing elements from a map
Còn xoá đi một phần tử, thì bạn dùng toán tử .remove()
. Ta sẽ truyền key
của phần tử muốn xoá vào. Xem ví dụ nhoé.
foods.remove('cookies');
Map Type Properties
Ta sẽ đi nhanh qua các thuộc tính cơ bản của một Map Type bất kì nhóe. Vẫn là một số thuộc tính quen thuộc, như:
- Rỗng
.isEmpty
- Không rỗng
.isNotEmpty
- Số lượng phần tử trong Map
.length
- Lấy tất cả các keys
.keys
- Lấy tất cả các value
.values
Xem ví dụ nhoé.
print(foods.isEmpty); // false print(foods.isNotEmpty); // true print(foods.length); // 4 print(foods.keys); print(foods.values);
Checking
Để kiểm tra tồn tại của một key
hay value
nào đó có thực sự tồn tại trong Map hay không. Bạn sẽ sử dụng 2 toán tử sau: .containsKey
& .containsValue
. Ví dụ:
print(foods.containsKey('pies')); print(foods.containsValue(42));
Khá làm EZ phải không nào!
Looping
Vì Map có cấu trúc khác với List, nên việc lặp hay duyệt các phần tử cũng có sự khác nhau. Và ta sẽ có các kiểu lặp và duyệt các phần tử trong Map như sau:
- For in Map
Sử dụng vòng lặp for in
để duyệt qua lần lượt các phần tử trong Map. Ta sẽ thử với ví dụ sau:
for (var item in foods) { print(foods[item]); }
Rất buồn là nó sẽ gặp lỗi.
Dart không thể nào duyệt qua Map như vậy. Ta sẽ tìm hiểu nguyên nhân sau nhoé. Ta sẽ fix như sau:
for (var item in foods.keys) { print(foods[item]); }
Đơn giản là duyệt qua keys
thôi.
- ForEach
Với ForEach thì có vẻ đơn giản hơn xí. Khi ta duyệt qua từng cặp key
và value
. Xem ví dụ nhoé.
foods.forEach((key, value) => print('$key -> $value'));
Hoặc có cách viết tương tự như sau:
for (final entry in foods.entries) { print('${entry.key} -> ${entry.value}'); }
Trong đó
foods.entries
sẽ là cách bạn lấy được tất cả các thực thể hay các phần tử mà Map có- Mỗi thực thể là 1 cặp giá trị
key
&value
Tạm kết
- Tìm hiểu về kiểu dữ liệu Map Type, cú pháp và cách khởi tạo
- Các toán tử dùng trong Map
- Các thuộc tính cơ bản của Map
- Cách kiểu tra tồn tại các key hay value
- Lặp hay duyệt các phần tử trong Map
Okay! Tới đây, mình xin kết thúc bài viết về Map type trong series Dart Tour. Nếu có gì thắc mắc hay góp ý cho mình thì bạn có thể để lại bình luận hoặc gởi email theo trang Contact.
Cảm ơn bạn đã đọc bài viết này!
Related Posts:
Written by chuotfx
Hãy ngồi xuống, uống miếng bánh và ăn miếng trà. Chúng ta cùng nhau đàm đạo về đời, về code nhóe!
Leave a Reply Cancel reply
Fan page
Tags
Recent Posts
- Charles Proxy – Phần 1 : Giới thiệu, cài đặt và cấu hình
- Complete Concurrency với Swift 6
- 300 Bài code thiếu nhi bằng Python – Ebook
- Builder Pattern trong 10 phút
- Observer Pattern trong 10 phút
- Memento Pattern trong 10 phút
- Strategy Pattern trong 10 phút
- Automatic Reference Counting (ARC) trong 10 phút
- Autoresizing Masks trong 10 phút
- Regular Expression (Regex) trong Swift
You may also like:
Archives
- September 2024 (1)
- July 2024 (1)
- June 2024 (1)
- May 2024 (4)
- April 2024 (2)
- March 2024 (5)
- January 2024 (4)
- February 2023 (1)
- January 2023 (2)
- November 2022 (2)
- October 2022 (1)
- September 2022 (5)
- August 2022 (6)
- July 2022 (7)
- June 2022 (8)
- May 2022 (5)
- April 2022 (1)
- March 2022 (3)
- February 2022 (5)
- January 2022 (4)
- December 2021 (6)
- November 2021 (8)
- October 2021 (8)
- September 2021 (8)
- August 2021 (8)
- July 2021 (9)
- June 2021 (8)
- May 2021 (7)
- April 2021 (11)
- March 2021 (12)
- February 2021 (3)
- January 2021 (3)
- December 2020 (3)
- November 2020 (9)
- October 2020 (7)
- September 2020 (17)
- August 2020 (1)
- July 2020 (3)
- June 2020 (1)
- May 2020 (2)
- April 2020 (3)
- March 2020 (20)
- February 2020 (5)
- January 2020 (2)
- December 2019 (12)
- November 2019 (12)
- October 2019 (19)
- September 2019 (17)
- August 2019 (10)