第三節(jié): Dart 中常用集合 List/Map

Dart 語法學(xué)習(xí)目錄

第一節(jié): Dart 語法了解,認(rèn)識變量,常量,數(shù)據(jù)類型
第二節(jié): Dart 操作符(運算符)
第三節(jié): Dart 中常用集合 List/Map
第四節(jié): Dart 函數(shù)使用,聲明函數(shù)/匿名函數(shù)/可選參數(shù)/作用域/閉包
第五節(jié): Dart 面向?qū)ο?構(gòu)造函數(shù)/靜態(tài)屬性
第六節(jié): Dart中抽象類abstract/接口implements/混入Mixin
第七節(jié): Dart中泛型/泛型定義與使用
第八節(jié): Dart 中的庫/自定義庫/內(nèi)置庫/第三方庫

Dart 附帶了核心集合 API ,其中包括 list ,set 和 map 類。

1. List

lists 可以通過字面量來創(chuàng)建和初始化。 另外,也可以使用 List 的構(gòu)造函數(shù)。

1.1 List 列表的創(chuàng)建
void main(){
    // 1\. 字面量創(chuàng)建列表
    var list = ["蘋果","香蕉","橘子"];
    print(list);    // [蘋果, 香蕉, 橘子]

    // 2\. 通過類創(chuàng)建列表
    var list2 = new List();
    print(list2);   // []

}

List 類還定義了若干方法,用于向列表添加或刪除項目

接下來就讓我們好好學(xué)習(xí)一些List列表的屬性和方法

1.2 常用屬性
  1. length 長度
  2. isEmpty 是否 為空
  3. isNotEmpty 是否不為空
  4. reversed 翻轉(zhuǎn)
void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);

  // 2\. 集合的屬性
  print(list.length);  //打印集合的長度
  print(list.isEmpty); // 判斷集合是否為空, 為空返回true,否則返回false
  print(list.isNotEmpty);  // 判斷及時是否不為空, 不為空返回true,否則返回false
  print(list.reversed);   // 集合倒敘,注意倒敘完后返回的不在是一個集合

  /*
    打印結(jié)果
      3
      false
      true
      (橘子, 香蕉, 蘋果)
  */

  // 3\. 我們發(fā)現(xiàn)集合翻轉(zhuǎn)(倒敘后不像是一個集合,如果需要倒敘后依然返回一個集合)
  // toList 方法是將其他類型轉(zhuǎn)為List 集合類型
  var listReverse = list.reversed.toList();
  print(listReverse);  // 打印: [橘子, 香蕉, 蘋果]

}

1.3 常用方法
1.3.1. 添加內(nèi)容
  1. add 增加
  2. addAll 拼接數(shù)組
void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);

  // 2\. 常用方法
  // 2.1 添加內(nèi)容
  // add 方法一次只能添加一個集合內(nèi)容
  // list.add("西瓜");
  // print(list);  // [蘋果, 香蕉, 橘子, 西瓜]

  // addAll 方法參數(shù)是一個集合, 集合的拼接
  list.addAll(["西瓜","梨子"]);
  print(list);    // [蘋果, 香蕉, 橘子, 西瓜, 梨子]
}

1.3.2. 查詢集合內(nèi)容的索引
  1. indexOf 查找索引,參數(shù)為具體內(nèi)容
void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);

  // 2\. 常用方法
  // 2.2 查詢集合內(nèi)容的索引
  var index = list.indexOf("香蕉");
  print(index);  // 1

  print(index is int);  // 判斷是不是數(shù)字類型, 結(jié)果為true
}

1.3.3. 刪除內(nèi)容
  1. remove 刪除 參數(shù)具體的內(nèi)容
  2. removeAt 刪除, 參數(shù)為索引值
void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);  // [蘋果, 香蕉, 橘子]

  // 2\. 常用方法
  // 2.3 刪除集合內(nèi)容

  // 通過集合內(nèi)容刪除  remove
  // list.remove("香蕉");
  // print(list);   // [蘋果, 橘子]
  // remove  方法只會刪除第一個匹配的內(nèi)容, 如果有多個相同的內(nèi)容,后面的不會被刪除

  // 通過索引刪除內(nèi)容
  list.removeAt(2);
  print(list);   // [蘋果, 香蕉]
}

1.3.4. 填充集合內(nèi)容
  1. fillRange 填充內(nèi)容

語法

list.fillRange(start, end, value);

參數(shù)

  1. star 開始修改的位置
  2. end 結(jié)束修改的位置(不包括結(jié)束位置)
  3. value 修改的內(nèi)容
void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);  // [蘋果, 香蕉, 橘子]

  // 2\. 常用方法
  // 2.4 修改集合內(nèi)容
  // 修改一個內(nèi)容
  // list.fillRange(1,2, '西瓜');
  // print(list) ;   //[蘋果, 西瓜, 橘子]

  // 修改多個內(nèi)容
  // list.fillRange(1,3, '西瓜');
  // print(list) ;   // [蘋果, 西瓜, 西瓜]

}

1.3.5. 插入內(nèi)容
  1. insert(index,value) 指定位置插入

  2. insertAll(index,list) 指定位置插入List

void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);  // [蘋果, 香蕉, 橘子]

  // 2\. 常用方法
  // 2.5 插入內(nèi)容
  // 插入一個內(nèi)容
  // list.insert(1,"西瓜");
  // print(list);  // [蘋果, 西瓜, 香蕉, 橘子]

  // 插入多個內(nèi)容
  list.insertAll(1, ['西瓜',"梨子"]);
  print(list) ;   // [蘋果, 西瓜, 梨子, 香蕉, 橘子]

}

1.3.6. 集合與字符串之間相互轉(zhuǎn)換
  1. toList 其他類型轉(zhuǎn)換為List

  2. join List轉(zhuǎn)換成字符串

  3. split 字符串轉(zhuǎn)為List

void main(){
  // List 集合常用的屬性
  // 1\. 定義集合
  var list = ["蘋果","香蕉","橘子"];
  print(list);  // [蘋果, 香蕉, 橘子]

  // 2\. 常用方法
  // 2.6 集合與其他內(nèi)容相互轉(zhuǎn)換
  // 集合轉(zhuǎn)為字符串
  String str = list.join("-");
  print(str);  // 蘋果-香蕉-橘子
  print(str is String); // 判斷是不是字符串類型 true

  // 將字符串轉(zhuǎn)為List
  String strr = "你好,師兄,歡迎來到北京";
  List list2 = strr.split(",");
  print(list2);  // [你好, 師兄, 歡迎來到北京]

}

1.3.7. 循環(huán)方法
  1. forEach
  2. map
  3. where
  4. any
  5. every

示例:

void main(){
    // List 循環(huán)
    // 1\. 創(chuàng)建List
    List list = ["蘋果","梨子","香蕉"];

    print(list);  // [蘋果, 梨子, 香蕉]

    // 2\. 循環(huán)方法
    // 2.1 普通for循環(huán)
    // for(var i = 0 ;i < list.length;i++){
    //   print(list[i]);
    // }
    /*
    蘋果
    梨子
    香蕉
  */

    // 2.2 for ... in 循環(huán)
    // for(var value in list){
    //   print(value);
    // }
    /*
    蘋果
    梨子
    香蕉
  */

    // 2.3 forEach 循環(huán)
    // list.forEach((value){
    //   // 接受一個參數(shù),集合的值
    //   print(value);
    // });
    /*
    蘋果
    梨子
    香蕉
  */

    // 2.4 map 映射
    // var list2  = list.map((value){
    //   // print(value);
    //   return '$value:8元';
    // });
    // print(list2); // (蘋果:8元, 梨子:8元, 香蕉:8元)

    // 注意map方法返回的不是集合
    // 需要手動的轉(zhuǎn)為集合
    // print(list2.toList());  // [蘋果:8元, 梨子:8元, 香蕉:8元]

    // 2.5 where 篩選
    // 類似于數(shù)組中的filter方法
    // List ll = [1,3,5,9,6,8,1];
    // var list3 = ll.where((value){
    //   return value >= 5;
    // });
    // print(list3);  // (5, 9, 6, 8)
    // 返回值不是集合,需要轉(zhuǎn)化
    // print(list3.toList());  // [5, 9, 6, 8]

    // 2.6 any 一些
    // 只要有一個符合條件返回true,否則返回false
    // List ll = [2,3,5,9,6,8,2];
    // var bool = ll.any((value){
    //   return value > 3;
    // });

    // print(bool);   // true

    // var bool = ll.any((value){
    //   return value > 10;
    // });

    // print(bool);   // 全部都不符合條件,返回false

    // 2.7 every 每一個
    // 必須所有的都符合條件才返回true,否則返回false
    List ll = [2,3,5,9,6,8,2];

    // var bool = ll.every((value){
    //   return value > 1 ;
    // });
    // print(bool);  // true

    var bool = ll.every((value){
        return value > 3 ;
    });
    print(bool);   // false

}

2. Set

Set 是沒有順序且不能重復(fù)的集合,所以不能通過索引去獲取值

2.1 set 基本用法

通過add方法給set添加內(nèi)容

void main(){
  // Set
  // 1\. Set的基本用法
  var set = new Set();
  set.add("西瓜"); // 添加內(nèi)容
  set.add("蘋果"); 
  set.add("西瓜"); // 注意set中不能用重復(fù)的內(nèi)容, 添加重復(fù)內(nèi)容也會去重
  print(set);   // {西瓜, 蘋果}

}

2.2 利用set處理list去重

因為set內(nèi)容不能重復(fù), 所以利用這個特性給list去重,

因此set主要的功能就是數(shù)組去重.

流程:

  1. list可以使用toSet方法將list轉(zhuǎn)為set
  2. 因為list特性會自動去重
  3. 在利用toList方法將set轉(zhuǎn)回為list
void main(){

  // 2\. 利用set去重
  List list = ["蘋果","香蕉","橘子","香蕉","橘子","蘋果"];

  // 2.1 利用toSet 轉(zhuǎn)為set
  // var set = list.toSet();
  // print(set);  // {蘋果, 香蕉, 橘子}

  // 2.2  先創(chuàng)建set, 在通過addAll方法將list轉(zhuǎn)為set 去重
  var set = new Set();
  set.addAll(list);
  print(set);  // {蘋果, 香蕉, 橘子}

  // 將set轉(zhuǎn)為List
  list = set.toList();
  print(list);  // [蘋果, 香蕉, 橘子]  去重后的list

}

3. Map

map 是一個無序的 key-value (鍵值對)集合,就是大家熟知的 dictionary 或者 hash。 map 將 kay 與 value 關(guān)聯(lián),以便于檢索。和 JavaScript 不同,Dart 對象不是 map 。

3.1 聲明map

聲明 map 可以使用簡潔的字面量語法,也可以使用傳統(tǒng)構(gòu)造函數(shù):

void main(){
    // 1\. 字面量創(chuàng)建map
    Map map = {
        "name":"張三",
        "age":18
    };
    print(map);

    // 2\. 構(gòu)造函數(shù)創(chuàng)建map
    // 注意map添加內(nèi)容不用使用.操作符,只能使用[]語法
    Map map2 = new Map();
    map2["name"] = "李四";
    map2["age"] = 20;
    print(map2);
}

3.2 常用屬性
  1. keys 獲取所有的key值
  2. values 獲取所有的value
  3. isEmpty 判斷是否為空
  4. isNotEmpty 判讀是否不為空

示例

void main(){
  // Map
  // 1\. 創(chuàng)建Map
  Map map = {
    "name":"張三",
    "age":18
  };

  print(map);  // {name: 張三, age: 18}

  // 2\. 常用屬性
  print(map.length);   // 2
  print(map.keys);  // (name, age)
  print(map.keys.toList());  // [name, age]
  print(map.values.toList());  // [張三, 18]
  print(map.isEmpty);    // false  不為空
  print(map.isNotEmpty); // true   不為空
}

3.3 常用方法
  1. remove(key) 刪除指定key的數(shù)據(jù)

  2. addAll({...}) 合并映射, 給映射增加屬性

  3. containsValue(value) 判斷映射里是否有某個值, 返回true/ false

示例:

void main(){
  // Map
  // 1\. 創(chuàng)建Map
  Map map = {
    "name":"張三",
    "age":18
  };

  print(map);  // {name: 張三, age: 18}

  // 2\. 常用方法
 // 2.1 給集合添加內(nèi)容
 map.addAll({
   "sex":"男",
   "like": ["游泳","下棋"]
 });

 print(map);  // {name: 張三, age: 18, sex: 男, like: [游泳, 下棋]}

 // 2.2 刪除指定的數(shù)據(jù)
 map.remove("sex");

 print(map);  // {name: 張三, age: 18, like: [游泳, 下棋]}

 // 2.3 判斷map里有沒有指定的內(nèi)容
 print(map.containsValue("張三"));  // true
 print(map.containsValue("男"));    // false 
}

3.4 常用循環(huán)方法
  1. forEach

示例:

void main(){
    // Map 循環(huán)
    // 1\. 創(chuàng)建Map
    Map map = {
        "name":"張三",
        "age": 18
    };

    print(map);  // {name: 張三, age: 18}

    // 2\. 循環(huán)方法

    // 2.1 forEach 循環(huán)
    // map.forEach((key,value){
    //   // 接受一個參數(shù),集合的值
    //   print("$key--$value");
    // });
    /*
    name--張三
    age--18
  */
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容