Dart 知識點 - 集合 List, Set, Map

語言: CN / TW / HK

攜手創作,共同成長!這是我參與「掘金日新計劃 · 8 月更文挑戰」的第14天,點擊查看活動詳情

推薦使用線上編輯器 dartpad.cn 或者 dartpad.dev 進行學習,測試~

Dart 中的集合類,允許以各種方式將元素分組,並定義各種使這些元素更容易操作的方法。本文,我們來認識相關的集合類。

集合的作用

集合有以下的作用:

  • 對數據進行組織
  • 簡單快捷搜索大數量的數目
  • 有的集合提供了排序的元素,可以在序列中快速插入或者刪除元素
  • 有的集合提供了映射接口,可以快速查找元素

Dart 中的集合

Dart 中重要有以下的集合:

  • List:存儲一組不唯一且按插入順序排序的對象,可以操作索引(可以理解為 JavaScript 中的數組) -Set:存儲一組唯一且無序的對象(可以理解為字典)
  • Mapkey - 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 } } ```

往期精彩推薦

如果讀者覺得文章還可以,不防一鍵三連:關注➕點贊➕收藏