iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 7
0
Software Development

Dart 語言 - 開啟 Flutter 的鑰匙系列 第 7

Day7:內建型態(集合) - Maps

第三種介紹的集合類為 Map。

Map

Map 是使用 鍵 (Key) - 值 (Value) 組合成元素,用「鍵」可以查出對應的值。在 Map 中,「鍵」是唯一的不得重複的,「值」則沒有限制。

定義Map

  • 利用大括弧 { } 定義,在 Map 內的元素以:分隔鍵與值。如下:
var capital = {
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};
  • 若沒有給予型別,Dart 會自動判斷型別,上例會被指定為 LinkedHashMap<String, String>。

  • 同樣的,我們也可以在初始化時,給予其型別。

var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};

定義空 Map

  • 使用大括弧直接定義
var emptyMap = {}; //_InternalLinkedHashMap<dynamic, dynamic>
var emptyMap = <String, String>{}; //_InternalLinkedHashMap<String, Stirng>

發現什麼?

用大括弧直接定義 Map,預設是會實作 LinkedHashMap。

用 LinkedHashMap 儲進去 Map 的元素,會依照順序頭尾串接起來,是有序的 Map。

  • 用 Map() 定義
var emptyMap = Map(); //_InternalLinkedHashMap<dynamic, dynamic>
var emptyMap = Map<String, String>(); //_InternalLinkedHashMap<String, Stirng>

Map 的基本操作

  • 用 中括弧 [ ] 加入元素:如同 List 類可以使用 [Index]=更新該索引值內的數值,Map 類同樣也可以使用中括弧加入元素或更新元素。
var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};

capital['Italy'] = 'Rome';
print(capital);
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington, Italy: Rome}
  • putIfAbsent():插入元素,如果「鍵」不存在。
var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};

capital.putIfAbsent('Italy', () => 'Rome');
print(capital);
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington, Italy: Rome}
capital.putIfAbsent('Italy', () => 'XXX');
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington, Italy: Rome} //沒有改變
  • remove(Object):若「鍵」有存在於 Map 中,則將元素移除。
var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};
print(capital);
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington}
capital.remove('USA');
print(capital);
//{Taiwan: Taipei, Japan: Tokyo}
  • update(key, value):若「鍵」存在,則更新「值」。
var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};
print(capital);
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington}
capital.update('USA', (_)=>'Washington DC');
print(capital);
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington DC}
  • containsKey(key)
  • containsValue(value)
var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};
print(capital.containsKey('Taiwan'));
print(capital.containsKey('China'));
print(capital.containsValue('Tokyo'));
print(capital.containsValue('Seoul'));

// true
// false
// true
// false

迭代

  • forEach
var capital = <String, String>{
	'Taiwan':'Taipei',
	'Japan':'Tokyo',
	'USA':'Washington'
};

capital.forEach((key, value) => {
	print("$key's capital is $value.")
});

//Taiwan's capital is Taipei.
//Japan's capital is Tokyo.
//USA's capital is Washington.

發現什麼?

  • 利用 forEach 方法後面帶入 Lambda 函數,即可迭代走訪每一個 Map 裡的元素。
  • Lambda 函數包含兩個引數,一個是 Key,另一個是 Value。
  • 我們使用字串插入的方式,將 key 以及 value 插入至字串中。
  • 字串使用雙引號定義,避免使用跳脫符號。

HashMap, LinkedHashMap, SplayTreeMap

HashMap

是無序的 Map,存放在 HashMap 內的元素,在迭代取出時,不會依照順序取出。

LinkedHashMap

預設 Map 的實作,將元素存進 LinkedHashMap,LinkedHashMap 會自動將前後的元素串起來,所以在迭代的時候就可以按照原先加入的順序取出。

SplayTreeMap

存放在 SplayTreeMap 的元素,可以按照順序排列。

var capitalMap3 = SplayTreeMap<String, String>();

capitalMap3['Taiwan']='Taipei';
capitalMap3['Japan']='Tokyo';
capitalMap3['USA']='Washington';
capitalMap3.forEach((key, value) { print("$key's capital is $value."); });

//Japan's capital is Tokyo.
//Taiwan's capital is Taipei.
//USA's capital is Washington.

小結

連續三篇文章介紹集合函數,List 含有索引值,能根據索引值取出元素。Set 內容為唯一的。本次介紹的 Map,某種層面算是 List 加上 Set,Map 是由鍵-值組成的元素,鍵是唯一的,值可以重複。

Map 的取值方式是用「鍵」找到「值」與 List 用 「索引值」找到「值」使用方式相似。

Dart 的 Map 預設是實作 LinkedHashMap,所以每一個元素存入 Map 的時候會跟前後連結在一起,迭代取出時,就會根據存入的順序取出。


上一篇
Day6:內建型態(集合) - Sets
下一篇
Day8:函數 (Functions)
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30

尚未有邦友留言

立即登入留言