第三種介紹的集合類為 Map。
Map 是使用 鍵 (Key) - 值 (Value) 組合成元素,用「鍵」可以查出對應的值。在 Map 中,「鍵」是唯一的不得重複的,「值」則沒有限制。
var capital = {
'Taiwan':'Taipei',
'Japan':'Tokyo',
'USA':'Washington'
};
若沒有給予型別,Dart 會自動判斷型別,上例會被指定為 LinkedHashMap<String, String>。
同樣的,我們也可以在初始化時,給予其型別。
var capital = <String, String>{
'Taiwan':'Taipei',
'Japan':'Tokyo',
'USA':'Washington'
};
var emptyMap = {}; //_InternalLinkedHashMap<dynamic, dynamic>
var emptyMap = <String, String>{}; //_InternalLinkedHashMap<String, Stirng>
用大括弧直接定義 Map,預設是會實作 LinkedHashMap。
用 LinkedHashMap 儲進去 Map 的元素,會依照順序頭尾串接起來,是有序的 Map。
var emptyMap = Map(); //_InternalLinkedHashMap<dynamic, dynamic>
var emptyMap = Map<String, String>(); //_InternalLinkedHashMap<String, Stirng>
var capital = <String, String>{
'Taiwan':'Taipei',
'Japan':'Tokyo',
'USA':'Washington'
};
capital['Italy'] = 'Rome';
print(capital);
//{Taiwan: Taipei, Japan: Tokyo, USA: Washington, Italy: Rome}
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} //沒有改變
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}
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}
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
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.
是無序的 Map,存放在 HashMap 內的元素,在迭代取出時,不會依照順序取出。
預設 Map 的實作,將元素存進 LinkedHashMap,LinkedHashMap 會自動將前後的元素串起來,所以在迭代的時候就可以按照原先加入的順序取出。
存放在 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 的時候會跟前後連結在一起,迭代取出時,就會根據存入的順序取出。