Sets 是沒有索引值、不可重複的集合。
var sets = <int>{1,2,3,4};
在上例中,我們使用大括弧定義 Set,那麼是不是大括弧裡面沒有初始值就是空的 Set 呢?
→ 答案是否。原因是 Set 在 Dart 2.2 才推出,然而 Map 已經以大括弧拿去使用,所以當欲使用大括弧定義一個空的 Set 時,Dart 的型別推斷會將此空的大括弧推斷為 Map 而不是 Set。
var emptySet = {};
print(emptySet.runtimeType);
//_InternalLinkedHashMap<dynamic, dynamic>
那麼我們該怎麼定義空的 Set 呢?
→ 用大括弧定義時,前方需加入型態。
var emptySet = <int>{};
print(emptySet.runtimeType);
//_CompactLinkedHashSet<int>
→ 等同於用 Set()
var emptySet = Set<int>();
print(emptySet.runtimeType);
//_CompactLinkedHashSet<int>
建構子 Set.from() 可以帶入迭代類,產生 Set
var set = Set.from([0,0,1,2,3,4]);
print(set);
//{0,1,2,3,4}
Set 在存入元素時,並沒有連同索引值一起存入,所以無法像 Lists 一樣使用索引值取得元素。
但是,Dart 的 Set 是實作 LinkedHashSet,所以 Set 會保存元素存入的順序。
var animals = <String>{'Lion', 'Tiger'};
animals.add('Leopard'); // 增加元素 Leopard
animals.remove('Lion'); //移除元素 Lion
animals.clear(); //清除所有元素
var animals1 = <String>{'Lion', 'Tiger', 'Leopard'};
var animals2 = <String>{'Elephant', 'Lion'};
print(animals1.difference(animals2));
//{Tiger, Leopard}
var animals1 = <String>{'Lion', 'Tiger', 'Leopard'};
var animals2 = <String>{'Elephant', 'Lion'};
print(animals1.union(animals2));
//{Lion, Tiger, Leopard, Elephang}
var animals = <String>{'Lion', 'Tiger', 'Leopard'};
for(var element in animals){
print(element);
}
//Lion
//Tiger
//Lepord
可以用 forEach + Lambda 函數進行迭代。
var animals = <String>{'Lion', 'Tiger', 'Leopard'};
animals1.forEach((element) => print(element));
//Lion
//Tiger
//Lepord
如同 List,展開運算式同樣也可以使用於 Set 中。
var list = [1,1,2,3,4];
var spreadSet = {0, ...list};
print(spreadSet);
//0,1,2,3,4
Set 是設計用來儲存唯一元素的集合,但是沒有使用索引值儲存存入順序,所以取得元素相較於 List 來說是比較慢的。
不過在 Dart 的 Set 中,它是實作 LinkedHashSet() ,表示它的存入是有順序的,在迭代時,仍然可以依序取出 Set 中的元素。
您好,
想請問最後在小結中提到的:
Set 是設計用來儲存唯一元素的集合,但是沒有使用索引值儲存存入順序,
所以"取得元素相較於 Set 來說是比較慢的"。
是否有打錯?
實際所指的是取得元素相較於 List 來說是比較慢的?
沒錯,謝謝你的回覆,已修正