iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0

Sets

Sets 是沒有索引值、不可重複的集合。

定義一個 Sets

var sets = <int>{1,2,3,4};
  • 利用大括弧 {} 初始化 Sets,括弧裡面的項目以逗號 (,) 分隔。
  • 如果沒有指定型態,那 Dart 會做型態推斷,如上例會型態會被判斷成 Set。

定義一個空的 Set

在上例中,我們使用大括弧定義 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.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 會保存元素存入的順序。

Set 基本操作

  • add(element):增加一個元素。
  • remove(element):移除一個元素。
  • clear():移除全部元素。
var animals = <String>{'Lion', 'Tiger'};
animals.add('Leopard'); // 增加元素 Leopard
animals.remove('Lion'); //移除元素 Lion
animals.clear(); //清除所有元素
  • difference(set):與帶入的 Set 相比,回傳差異值。
var animals1 = <String>{'Lion', 'Tiger', 'Leopard'};
var animals2 = <String>{'Elephant', 'Lion'};
print(animals1.difference(animals2));
//{Tiger, Leopard}
  • union(set):與帶入的 Set 合併成一個 Set。
var animals1 = <String>{'Lion', 'Tiger', 'Leopard'};
var animals2 = <String>{'Elephant', 'Lion'};
print(animals1.union(animals2));
//{Lion, Tiger, Leopard, Elephang}

迭代

  • for
var animals = <String>{'Lion', 'Tiger', 'Leopard'};
for(var element in animals){
	print(element);
}

//Lion
//Tiger
//Lepord
  • forEach

可以用 forEach + Lambda 函數進行迭代。

var animals = <String>{'Lion', 'Tiger', 'Leopard'};
animals1.forEach((element) => print(element));
//Lion
//Tiger
//Lepord

展開運算式 (Spread Operator)

如同 List,展開運算式同樣也可以使用於 Set 中。

var list = [1,1,2,3,4];
var spreadSet = {0, ...list};
print(spreadSet);
//0,1,2,3,4
  • 由上方的結果可以得知,將有重複項的 List 經由展開運算式插入 Set 中,結果因為 Set 裡面的項目唯一的特性,所以重複的項目被移除。

小結

Set 是設計用來儲存唯一元素的集合,但是沒有使用索引值儲存存入順序,所以取得元素相較於 List 來說是比較慢的。

不過在 Dart 的 Set 中,它是實作 LinkedHashSet() ,表示它的存入是有順序的,在迭代時,仍然可以依序取出 Set 中的元素。


上一篇
Day5:內建型態 (集合) -Lists
下一篇
Day7:內建型態(集合) - Maps
系列文
Dart 語言 - 開啟 Flutter 的鑰匙30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
JimmyHuang369
iT邦新手 3 級 ‧ 2022-01-26 11:51:34

您好,
想請問最後在小結中提到的:
Set 是設計用來儲存唯一元素的集合,但是沒有使用索引值儲存存入順序,
所以"取得元素相較於 Set 來說是比較慢的"。

是否有打錯?
實際所指的是取得元素相較於 List 來說是比較慢的?

沒錯,謝謝你的回覆,已修正

我要留言

立即登入留言