Dart 知識點 - 集合 List, Set, Map
攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第14天,點選檢視活動詳情
推薦使用線上編輯器 dartpad.cn 或者 dartpad.dev 進行學習,測試~
Dart
中的集合類,允許以各種方式將元素分組,並定義各種使這些元素更容易操作的方法。本文,我們來認識相關的集合類。
集合的作用
集合有以下的作用:
- 對資料進行組織
- 簡單快捷搜尋大數量的數目
- 有的集合提供了排序的元素,可以在序列中快速插入或者刪除元素
- 有的集合提供了對映介面,可以快速查詢元素
Dart 中的集合
Dart
中重要有以下的集合:
- List:儲存一組不唯一且按插入順序排序的物件,可以操作索引(可以理解為
JavaScript
中的陣列) -Set:儲存一組唯一且無序的物件(可以理解為字典) - Map:
key - value
鍵值對的形式儲存資料,key
是唯一的(可以理解為JavaScript
中操作的鍵值對)
List 集合
List 是一組有序元素的集合,資料元素可以不唯一。
List 中的常用屬性有:
| 屬性 | 描述 | | --- | --- | | length | List 的長度 | | reversed | 反轉 List | | isEmpty | 判斷 List 是否為空 | | isNotEmpty | 判斷 List 是否不為空 |
```bash void main() { handleList(); }
void handleList() { // 元素可重複,比如:叫 'Jimmy' 的人不止一個 List list = ['Jimmy', 'Kimmy', 'Timmy', 'Jimmy'];
print(list); // [Jimmy, Kimmy, Timmy, Jimmy]
print(list.length); // 4
// 反轉後並沒有影響原 list List newList = list.reversed.toList(); print(newList); // [Jimmy, Timmy, Kimmy, Jimmy] print(list[2]); // Timmy print(newList[2]); // Kimmy
print(list.isEmpty); // false
print(list.isNotEmpty); // true
} ```
List 中的常用方法有:
| 方法 | 描述 |
| --- | --- |
| add | 增加一個元素 |
| addAll | 拼接陣列 |
| indexOf | 返回元素的索引,沒有則返回 -1 |
| remove | 根據傳入具體的值刪除元素 |
| removeAt | 根據傳入具體的索引刪除元素 |
| insert(index, value) | 根據索引位置插入元素 |
| insertAll(index, list) | 根據索引位置插入 List
|
| toList() | 其他型別轉換成 List
|
| join() | 將 List
元素拼接起來 |
| split() | 將字串按照指定的方式拆分並轉換成 List
|
| map | 遍歷 List
元素,如果符合條件返回 true
,否者返回 false
|
| where | 查詢 list
中滿足條件的元素 |
相關示範程式碼:
```bash void main() { handleList(); }
void handleList() { List list = ['Jimmy', 'Kimmy'];
print(list); // [Jimmy, Kimmy]
list.add('Timmy');
print(list); // [Jimmy, Kimmy, Timmy]
list.addAll(['Jimmy', 'Kimmy']);
print(list); // [Jimmy, Kimmy, Timmy, Jimmy, Kimmy]
List reversedList = list.reversed.toList();
print(reversedList); // [Kimmy, Jimmy, Timmy, Kimmy, Jimmy]
// 返回的是查詢到的第一元素的位置 print(list.indexOf('Jimmy')); // 0
// 移除的是查詢到的第一個元素 print(list.remove('Jimmy')); // true print(list); // [Kimmy, Timmy, Jimmy, Kimmy]
print(list.removeAt(0)); // Kimmy print(list); // [Timmy, Jimmy, Kimmy]
list.insert(0, 'Ivy'); print(list); // [Ivy, Timmy, Jimmy, Kimmy]
list.insertAll(0, ['Jimmy', 'Kimmy']); print(list); // [Jimmy, Kimmy, Ivy, Timmy, Jimmy, Kimmy]
String joinList = list.join('-'); print(joinList); // Jimmy-Kimmy-Ivy-Timmy-Jimmy-Kimmy print(list); // [Jimmy, Kimmy, Ivy, Timmy, Jimmy, Kimmy]
List newList = joinList.split('-'); print(newList); // [Jimmy, Kimmy, Ivy, Timmy, Jimmy, Kimmy]
print(list.map((item) => item == 'Jimmy')); // (true, false, false, false, true, false)
print(list.where((item) => item == 'Jimmy')); // (Jimmy, Jimmy) } ```
List 遍歷:
List
集合遍歷的方法有三種:
- for 迴圈遍歷,通過下標獲取元素
- for...in 迴圈遍歷,直接獲取每個元素
- forEach 迴圈遍歷,直接獲取每個元素
```bash void main() { List list = ['Jimmy', 'Kimmy'];
// for 迴圈 for(var i = 0; i < list.length; i++) { // 通過下標去訪問元素 print(list[i]); // Jimmy // Kimmy }
// for...in 迴圈 for(var item in list) { print(item); // Jimmy // Kimmy }
// forEach 迴圈 list.forEach((item) { print(item); // Jimmy // Kimmy }); }
```
Set 集合
Set
表示物件的集合,每個物件只能出現一次。
Set 中的常用屬性有:
| 屬性 | 描述 |
| --- | --- |
| first | 返回 Set
的第一個元素 |
| last | 返回 Set
的最後一個元素 |
| length | 返回 Set
的元素個數 |
| isEmpty | 判斷 Set
是否為空 |
| isNotEmpty | 判斷 Set
是否不為空 |
| iterator | 返回迭代器物件,用於遍歷集合 |
bash
void main() {
Set set = Set.from(['Jimmy', 'Ivy']);
print(set.first); // Jimmy
print(set.last); // Ivy
print(set.length); // 2
print(set.isEmpty); // false
print(set.isNotEmpty); // true
print(set.iterator); // Instance of '_CompactIterator<dynamic>'
}
Set 中的常用方法有:
| 方法 | 描述 | | --- | --- | | add | 新增一個元素 | | addAll | 新增一些元素 | | toString | 轉換字串形式 | | join | 以指定的字串連線,以字串形式輸出 | | contains | 集合中是否包含指定元素 | | containsAll | 集合中是否包含指定一些元素 | | elementAt(index) | 根據索引返回集合的元素 | | remove | 刪除指定的元素 | | removeAll | 刪除指定的一些元素 | | clear | 刪除所有元素 |
bash
void main() {
Set set = Set.from([]);
set.add('Jimmy');
print(set.toString()); // {Jimmy}
set.addAll(['Ivy', 'Kimmy']);
print(set.join('-')); // Jimmy-Ivy-Kimmy
print(set.contains('Timmy')); // false
print(set.containsAll(['Jimmy', 'Kimmy'])); // true
print(set.elementAt(1)); // Ivy
set.remove('Kimmy');
print(set); // {Jimmy, Ivy}
set.removeAll(['Jimmy', 'Anonymous']);
print(set); // {Ivy}
set.clear();
print(set); // {}
}
Set 遍歷:
Set
集合遍歷的方法有兩種:
- for...in 迴圈
- 呼叫 toList 方法返回一個 List 物件,再用 List 物件的遍歷方法操作...
```bash void main() { Set set = Set.from(['Jimmy', 'Ivy']); for(var item in set) { print(item); // Jimmy // Ivy }
set.toList().forEach((item){ print(item); // Jimmy // Ivy }); } ```
Map 集合
Map
物件就是一個鍵值對(key - value)。
Map 中的常用屬性有:
| 屬性 | 描述 | | --- | --- | | hasCode | 返回集合的雜湊碼 | | isEmpty | 是否為空 | | isNotEmpty | 是否不為空 | | keys | 返回集合所有的鍵 | | values | 返回集合所有的值 | | length | 返回集合鍵值對數 | | runtimeType | 返回物件執行時型別 |
bash
void main() {
Map map = {
"name": "Jimmy",
"height": 100
};
print(map.hashCode); // 101270140 (每次執行時值都有所改變)
print(map.isEmpty); // false
print(map.isNotEmpty); // true
print(map.keys.toList()); // [name, height]
print(map.values); // (Jimmy, 100)
print(map.length); // 2
print(map.runtimeType); // JsLinkedHashMap<dynamic, dynamic>
}
Map 中的常用方法有:
| 方法 | 描述 | | --- | --- | | toString | 字串表示 | | addAll | 新增鍵值對到集合 | | containsKey | 集合是否包含指定的鍵 | | containsValue | 集合是否包含指定的值 | | remove | 刪除指定鍵值對 | | clear | 刪除所有鍵值對 |
bash
void main() {
Map map = {
"name": "Jimmy",
"height": 100
};
print(map.toString()); // {name: Jimmy, height: 100}
map.addAll({
"age": 10
});
print(map); // {name: Jimmy, height: 100, age: 10}
print(map.containsKey('name')); // true
print(map.containsValue('1')); // false
map.remove('height');
print(map); // {name: Jimmy, age: 10}
map.clear();
print(map); // {}
}
Map 遍歷:
Map
集合遍歷的方法有兩種:
- forEach 迴圈
- for...in 迴圈
```bash void main() { Map map = { "name": "Jimmy", "height": 100 }; map.forEach((key, value) { print('${key} => ${value}'); // name => Jimmy // height => 100 });
for(var key in map.keys) { print(map[key]); // Jimmy // 100 } } ```
往期精彩推薦
如果讀者覺得文章還可以,不防一鍵三連:關注➕點贊➕收藏
- 前端開發中 5 個很讚的資源
- 懂點心理學 - 馬太效應
- Flutter 構建一個 todo list 應用
- Dart 知識點 - 資料型別
- Dart 知識點 - 混入 Mixin
- Dart 知識點 - 集合 List, Set, Map
- Flutter - 使用 push(), pop() 和路由進行導航
- Dart 知識點 - 面向物件基礎
- Flutter: Stateful 掛件 vs Stateless 掛件
- Flutter 實現登入 UI
- Dart 知識點 - 抽象類和介面
- 自 2020 年以來全球的開源商業化軟體融資情況
- IstioCon 2022 回顧及錄影、PPT 分享
- 網頁實現 1CM 物理長度
- Flutter 開發出現的那些 Bugs 和解決方案「持續更新... 」
- 仿寫新聞客戶端
- Beyond Istio OSS —— Istio 服務網格的現狀及未來
- 在外企的工作生活「年中總結」
- 如何在 Istio 中整合 SPRIRE?
- Javascript尾遞迴程式設計