Dart 資料型別 - Set
阿新 • • 發佈:2022-04-20
Set 是一個無序的、元素唯一的集合,無法通過 Set[index] 的方式取值
宣告方式 (1)、字面量:用大括號 (2)、建構函式:通過 Set() 建立一個空的集合,再往裡面新增元素
宣告方式 (1)、字面量:用大括號 (2)、建構函式:通過 Set() 建立一個空的集合,再往裡面新增元素
// 字面量 var subjects = {'dart', 'flutter'}; print(subjects); // {dart, flutter} Set<int> nums = <int>{1, 2, 3}; print(nums); // {1, 2, 3} // 建構函式 Set<String> fruits = new Set<String>(); fruits.add('apple'); fruits.add('banana'); print(fruits); // {apple, banana}
屬性 (1)、length:int,只讀,返回集合內容的長度 (2)、isEmpty/isNotEmpty:bool,只讀,判斷集合是否為空/至少包含一個元素 (3)、first/last:E,只讀,返回集合的第一/最後一個元素 (4)、single:E,只讀,檢查集合是否只有一個元素並返回該元素
// length, first, last print(fruits.length); // 2 print(fruits.first); // apple print(fruits.last); // banana// isEmpty, isNotEmpty print(fruits.isEmpty); // false print(fruits.isNotEmpty); // true // single var singleSet = {'unique'}; print(singleSet.single); // unique
方法 (1)、toList({bool growable = true}) → List<E> :把集合轉成一個List (2)、toSet() → Set<E> :去掉重複的元素 (3)、add(E value) → bool :新增一個元素 (4)、addAll(Iterable<E> elements) → void :新增多個元素 (5)、contains(Object? value) → bool :判斷是否包含某個元素 (6)、remove(Object? value) → bool :刪除某一個元素 (7)、intersection(Set<Object?> other) → Set<E> :返回兩個集合的交集 (8)、union(Set<E> other) → Set<E> :返回兩個集合的並集 (9)、difference(Set<Object?> other) → Set<E> :返回兩個集合的差集,呼叫other的contains方法,返回不包含在該集合中的元素 (10)、clear() → void :清空一個集合
//toList() List fruitsList = fruits.toList(growable: true); fruitsList.add('pear'); print(fruitsList); // [apple, banana, pear] // toSet() List<String> duplicateList = <String>['rogers', 'tony', 'roger', 'rogers']; Set result = duplicateList.toSet(); print(result); // {rogers, tony, roger} // add() bool isAddOk = fruits.add('watermelon'); print(isAddOk); // true print(fruits); // {apple, banana, watermelon} // addAll() fruits.addAll({'cherry', 'grape'}); print(fruits); // {apple, banana, watermelon, cherry, grape} // contains() bool hasElement = fruits.contains('grape'); print(hasElement); // true // remove() bool isRemoveOk = fruits.remove('watermelon'); print(isRemoveOk); // true print(fruits); // {apple, banana, cherry, grape} const num1 = {1, 2, 3}; const num2 = {3, 5, 7}; // intersection() Set result1 = num1.intersection(num2); print(result1); // {3} // union() Set result2 = num1.union(num2); print(result2); // {1, 2, 3, 5, 7} // difference() Set result3 = num1.difference(num2); print(result3); // {1, 2} fruits.clear(); print(fruits); // {}
遍歷 (1)、forEach(void action(E element)) → void (2)、map<T>(T toElement(E e)) → Iterable<T> :返回一個新的可迭代物件 (3)、reduce(E combine(E value, E element)) → E :用指定的方法對元素做連續操作 (4)、where(bool test(E element)) → Iterable<E> :返回滿足條件的可迭代物件 (5)、any(bool test(E element)) → bool :至少存在一個滿足條件的元素 (6)、elementAt(int index) → E :返回指定位置的元素 (7)、every(bool test(E element)) → bool :判斷集合中是否所有元素都滿足指定條件 (8)、expand<T>(Iterable<T> toElements(E element)) → Iterable<T> :為集合的每個元素都執行指定的操作 (9)、firstWhere(bool test(E element), {E orElse()?}) → E :返回第一個滿足條件的元素 (10)、fold<T>(T initialValue, T combine(T previousValue, E element)) → T :類似JS的reduce的累加器函式 (11)、join([String separator = ""]) → String :返回一個按條件拼接好的字串
const letters = {'A', 'B', 'C'}; // Set不可以通過[]獲取元素 for (int i = 0; i < letters.length; i += 1) { // print(letters[i]); // Error: The operator '[]' isn't defined for the class 'Set<String>'. print(letters.elementAt(i)); } // forEach() letters.forEach((element) { print(element); }); // map() final newLetters = letters.map((e) => '${e}D'); print(newLetters); // (AD, BD, CD) print(newLetters.toSet()); // {AD, BD, CD} // reduce() final numbers = [10, 20, 30]; final sum = numbers.reduce((value, element) => value + element); print(sum); // 60 // where() final res = numbers.where((element) => element % 4 == 0); print(res); // (20) print(res.toSet()); // {20} // any() bool anyResult = numbers.any((element) => element % 4 == 0); print(anyResult); // true // elementAt() final element = numbers.elementAt(0); print(element); // 10 // 訪問下標越界的元素會報錯 // final notExist = numbers.elementAt(100); // print(notExist); // RangeError (index): Invalid value: Not in inclusive range // every() bool everyResult = numbers.every((element) => element % 4 == 0); print(everyResult); // false // expand() const set1 = {'dart', 'flutter'}; final expandResult = set1.expand((element) => element.split('')); print(expandResult); // (d, a, r, t, f, l, u, t, t, e, r) // firstWhere() final set2 = {1, 3, 5, 7, 9}; final firstElement = set2.firstWhere((element) => element > 2); print(firstElement); // 3 // fold() Set<int> set3 = <int>{1, 2, 3, 4}; int foldResult = set3.fold<int>(100, (previousValue, element) => previousValue + element); print(foldResult); // 110 // join() String joinStr = set1.join('~'); print(joinStr); // dart~flutter