第四节: Dart 中常用集合 List/Map

Dart 语法学习目录

第一节: Dart 语法了解,认识变量,常量,数据类型
第二节: Dart 操作符(运算符)
第三节: Dart 中流程控制,条件判断以及循环语句
第四节: Dart 中常用集合 List/Map
第五节: Dart 函数使用,声明函数/匿名函数/可选参数/作用域/闭包
第六节: Dart 面向对象/构造函数/静态属性
第七节: Dart中抽象类abstract/接口implements/混入Mixin
第八节: Dart中泛型/泛型定义与使用
第九节: Dart 中的库/自定义库/内置库/第三方库



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


1. List

lists 可以通过字面量来创建和初始化。 另外,也可以使用 List 的构造函数。


1.1 List 列表的创建
void main(){
    // 1. 字面量创建列表
    var list = ["苹果","香蕉","橘子"];
    print(list);    // [苹果, 香蕉, 橘子]

    // 2. 通过类创建列表
    var list2 = new List();
    print(list2);   // []

}


List 类还定义了若干方法,用于向列表添加或删除项目

接下来就让我们好好学习一些List列表的属性和方法


1.2 常用属性
  1. length 长度
  2. isEmpty 是否 为空
  3. isNotEmpty 是否不为空
  4. reversed 翻转
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);   // 集合倒叙,注意倒叙完后返回的不在是一个集合
 
  /*
    打印结果
      3
      false
      true
      (橘子, 香蕉, 苹果)
  */

  // 3. 我们发现集合翻转(倒叙后不像是一个集合,如果需要倒叙后依然返回一个集合)
  // toList 方法是将其他类型转为List 集合类型
  var listReverse = list.reversed.toList();
  print(listReverse);  // 打印: [橘子, 香蕉, 苹果]

}


1.3 常用方法
1.3.1. 添加内容
  1. add 增加
  2. addAll 拼接数组
void main(){
  // List 集合常用的属性
  // 1. 定义集合
  var list = ["苹果","香蕉","橘子"];
  print(list);

  // 2. 常用方法
  // 2.1 添加内容
  // add 方法一次只能添加一个集合内容
  // list.add("西瓜");
  // print(list);  // [苹果, 香蕉, 橘子, 西瓜]

  // addAll 方法参数是一个集合, 集合的拼接
  list.addAll(["西瓜","梨子"]);
  print(list);    // [苹果, 香蕉, 橘子, 西瓜, 梨子]
}


1.3.2. 查询集合内容的索引
  1. indexOf 查找索引,参数为具体内容
void main(){
  // List 集合常用的属性
  // 1. 定义集合
  var list = ["苹果","香蕉","橘子"];
  print(list);

  // 2. 常用方法
  // 2.2 查询集合内容的索引
  var index = list.indexOf("香蕉");
  print(index);  // 1

  print(index is int);  // 判断是不是数字类型, 结果为true
}


1.3.3. 删除内容
  1. remove 删除 参数具体的内容
  2. removeAt 删除, 参数为索引值
void main(){
  // List 集合常用的属性
  // 1. 定义集合
  var list = ["苹果","香蕉","橘子"];
  print(list);  // [苹果, 香蕉, 橘子]

  // 2. 常用方法
  // 2.3 删除集合内容
  
  // 通过集合内容删除  remove
  // list.remove("香蕉");
  // print(list);   // [苹果, 橘子]
  // remove  方法只会删除第一个匹配的内容, 如果有多个相同的内容,后面的不会被删除

  // 通过索引删除内容
  list.removeAt(2);
  print(list);   // [苹果, 香蕉]
}


1.3.4. 填充集合内容
  1. fillRange 填充内容

语法

​ list.fillRange(start, end, value);

参数

  1. star 开始修改的位置
  2. end 结束修改的位置(不包括结束位置)
  3. value 修改的内容
void main(){
  // List 集合常用的属性
  // 1. 定义集合
  var list = ["苹果","香蕉","橘子"];
  print(list);  // [苹果, 香蕉, 橘子]

  // 2. 常用方法
  // 2.4 修改集合内容
  // 修改一个内容
  // list.fillRange(1,2, '西瓜');
  // print(list) ;   //[苹果, 西瓜, 橘子]

  // 修改多个内容
  // list.fillRange(1,3, '西瓜');
  // print(list) ;   // [苹果, 西瓜, 西瓜]

}


1.3.5. 插入内容
  1. insert(index,value) 指定位置插入

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

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

  // 2. 常用方法
  // 2.5 插入内容
  // 插入一个内容
  // list.insert(1,"西瓜");
  // print(list);  // [苹果, 西瓜, 香蕉, 橘子]

  // 插入多个内容
  list.insertAll(1, ['西瓜',"梨子"]);
  print(list) ;   // [苹果, 西瓜, 梨子, 香蕉, 橘子]

}


1.3.6. 集合与字符串之间相互转换
  1. toList 其他类型转换为List

  2. join List转换成字符串

  3. split 字符串转为List

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

  // 2. 常用方法
  // 2.6 集合与其他内容相互转换
  // 集合转为字符串
  String str = list.join("-");
  print(str);  // 苹果-香蕉-橘子
  print(str is String); // 判断是不是字符串类型 true


  // 将字符串转为List
  String strr = "你好,师兄,欢迎来到北京";
  List list2 = strr.split(",");
  print(list2);  // [你好, 师兄, 欢迎来到北京]

}


1.3.7. 循环方法
  1. forEach
  2. map
  3. where
  4. any
  5. every

示例:

void main(){
    // List 循环
    // 1. 创建List
    List list = ["苹果","梨子","香蕉"];

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

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

    // 2.2 for ... in 循环
    // for(var value in list){
    //   print(value);
    // }
    /*
    苹果
    梨子
    香蕉
  */

    // 2.3 forEach 循环
    // list.forEach((value){
    //   // 接受一个参数,集合的值
    //   print(value);
    // });
    /*
    苹果
    梨子
    香蕉
  */


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


    // 注意map方法返回的不是集合
    // 需要手动的转为集合
    // print(list2.toList());  // [苹果:8元, 梨子:8元, 香蕉:8元]


    // 2.5 where 筛选
    // 类似于数组中的filter方法
    // List ll = [1,3,5,9,6,8,1];
    // var list3 = ll.where((value){
    //   return value >= 5;
    // });
    // print(list3);  // (5, 9, 6, 8)
    // 返回值不是集合,需要转化
    // 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 是没有顺序且不能重复的集合,所以不能通过索引去获取值


2.1 set 基本用法

通过add方法给set添加内容

void main(){
  // Set
  // 1. Set的基本用法
  var set = new Set();
  set.add("西瓜"); // 添加内容
  set.add("苹果"); 
  set.add("西瓜"); // 注意set中不能用重复的内容, 添加重复内容也会去重
  print(set);   // {西瓜, 苹果}

}


2.2 利用set处理list去重

因为set内容不能重复, 所以利用这个特性给list去重,

因此set主要的功能就是数组去重.

流程:

  1. list可以使用toSet方法将list转为set
  2. 因为list特性会自动去重
  3. 在利用toList方法将set转回为list
void main(){
 
  // 2. 利用set去重
  List list = ["苹果","香蕉","橘子","香蕉","橘子","苹果"];

  // 2.1 利用toSet 转为set
  // var set = list.toSet();
  // print(set);  // {苹果, 香蕉, 橘子}

  // 2.2  先创建set, 在通过addAll方法将list转为set 去重
  var set = new Set();
  set.addAll(list);
  print(set);  // {苹果, 香蕉, 橘子}

  // 将set转为List
  list = set.toList();
  print(list);  // [苹果, 香蕉, 橘子]  去重后的list

}


3. Map

map 是一个无序的 key-value (键值对)集合,就是大家熟知的 dictionary 或者 hash。 map 将 kay 与 value 关联,以便于检索。和 JavaScript 不同,Dart 对象不是 map 。


3.1 声明map

声明 map 可以使用简洁的字面量语法,也可以使用传统构造函数:

void main(){
    // 1. 字面量创建map
    Map map = {
        "name":"张三",
        "age":18
    };
    print(map);

    // 2. 构造函数创建map
    // 注意map添加内容不用使用.操作符,只能使用[]语法
    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. 创建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的数据

  2. addAll({...}) 合并映射, 给映射增加属性

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

示例:

void main(){
  // Map
  // 1. 创建Map
  Map map = {
    "name":"张三",
    "age":18
  };

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

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

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

 // 2.2 删除指定的数据
 map.remove("sex");

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

 // 2.3 判断map里有没有指定的内容
 print(map.containsValue("张三"));  // true
 print(map.containsValue("男"));    // false 
}


3.4 常用循环方法
  1. forEach

示例:

void main(){
    // Map 循环
    // 1. 创建Map
    Map map = {
        "name":"张三",
        "age": 18
    };

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

    // 2. 循环方法

    // 2.1 forEach 循环
    // map.forEach((key,value){
    //   // 接受一个参数,集合的值
    //   print("$key--$value");
    // });
    /*
    name--张三
    age--18
  */
}

你可能感兴趣的:(第四节: Dart 中常用集合 List/Map)