第三节: Dart 中常用集合 List/Map
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 常用属性
- length 长度
- isEmpty 是否 为空
- isNotEmpty 是否不为空
- 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. 添加内容
- add 增加
- 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. 查询集合内容的索引
- 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. 删除内容
- remove 删除 参数具体的内容
- 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. 填充集合内容
- fillRange 填充内容
语法
list.fillRange(start, end, value);
参数
- star 开始修改的位置
- end 结束修改的位置(不包括结束位置)
- 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. 插入内容
-
insert(index,value) 指定位置插入
-
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. 集合与字符串之间相互转换
-
toList 其他类型转换为List
-
join List转换成字符串
-
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. 循环方法
- forEach
- map
- where
- any
- 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主要的功能就是数组去重.
流程:
- list可以使用
toSet
方法将list转为set - 因为list特性会自动去重
- 在利用
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 常用属性
- keys 获取所有的key值
- values 获取所有的value
- isEmpty 判断是否为空
- 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 常用方法
-
remove(key) 删除指定key的数据
-
addAll({...}) 合并映射, 给映射增加属性
-
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 常用循环方法
- 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
*/
}