Dart 集合:List、Set、Map
- 发表于
- flutter
Dart提供了3种核心的集合类型 List(列表)、Set(集合)和Map(映射)。
一. List
编程中最常使用的集合是数组。Dart以列表(List)对象的形式表示数组。列表(List)只是一组有序的对象。
1. List种类
- 固定长度列表
- 可增长列表
A. 固定长度列表
固定长度列表的长度不能在运行时更改。
1).声明列表
1 |
var list_name = new List(initial_size) |
上面的语法创建了指定大小的列表。列表不能在运行时增长或缩小。任何调整列表大小的尝试都将导致异常。
2). 初始化列表
1 |
lst_name[index] = value; |
3). 例子
1 2 3 4 5 6 7 8 9 |
void main() { var myList = new List(3); myList[0] = 1; myList[1] = 2; myList[2] = 3; // myList[3] = 4; // error, 会导致数组越界 print(myList); // [1, 2, 3] } |
B. 可增长列表
可增长列表的长度可以在运行时更改。
1).声明列表
1 2 3 4 5 6 7 |
// 创建包含指定值的列表 var list_name = [val1, val2, val3]; // 或者 // 创建一个大小为零的列表 var list_name = new List(); |
2).初始化列表
1 |
list_name[index] = value; |
3).例子
1 2 3 4 5 6 7 |
void main() { var myList = new List(); myList.add(1); myList.add(2); print(myList); // [1, 2] } |
2. List里面常用的属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
常用属性: length 长度 reversed 翻转 isEmpty 是否为空 isNotEmpty 是否不为空 常用方法: add 增加 addAll 拼接数组 indexOf 查找 传入具体值 remove 删除 传入具体值 removeAt 删除 传入索引值 fillRange 修改 insert(index,value); 指定位置插入 insertAll(index,list) 指定位置插入List toList() 其他类型转换成List join() List转换成字符串 split() 字符串转化成List forEach map where any every |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
void main() { List myList = ['香蕉', '苹果', '西瓜']; print(myList[1]); // 苹果 var list = new List(); list.add('111'); list.add('222'); print(list); // [111, 222] // List里面的属性: List myList1 = ['香蕉', '苹果', '西瓜']; print(myList1.length); // 3 print(myList1.isEmpty); // false print(myList1.isNotEmpty); // true // 对列表倒序排序 print(myList1.reversed); // (西瓜, 苹果, 香蕉) var newMyList = myList1.reversed.toList(); print(newMyList); // [西瓜, 苹果, 香蕉] // List里面的方法: List myList2 = ['香蕉', '苹果', '西瓜']; // 增加数据 增加一个 myList2.add('桃子'); // 拼接数组 myList2.addAll(['桃子', '葡萄']); print(myList2); // [香蕉, 苹果, 西瓜, 桃子, 桃子, 葡萄] // indexOf查找数据 查找不到返回-1 查找到返回索引值 print(myList2.indexOf('苹x果')); // -1 myList2.remove('西瓜'); myList2.removeAt(1); print(myList2); // [香蕉, 桃子, 桃子, 葡萄] List myList3 = ['香蕉', '苹果', '西瓜']; // 修改 myList3.fillRange(1, 2, 'aaa'); myList3.fillRange(1, 3, 'aaa'); // 插入 一个 myList3.insert(1,'aaa'); // 插入 多个 myList3.insertAll(1, ['aaa', 'bbb']); print(myList3); // [香蕉, aaa, bbb, aaa, aaa, aaa] List myList4 = ['香蕉', '苹果', '西瓜']; // list转换成字符串 var str = myList4.join('-'); print(str); // 香蕉-苹果-西瓜 print(str is String); // true var str1 = '香蕉-苹果-西瓜'; var list1 = str1.split('-'); print(list1); // [香蕉, 苹果, 西瓜] print(list1 is List); // true } |
二. Set
Set是没有顺序且不能重复的集合,所以不能通过索引去获取值,用它最主要的功能就是去除数组重复内容,List 去重可以先转 Set 再转 List 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void main() { var mySet = new Set(); mySet.add('香蕉'); mySet.add('苹果'); mySet.add('苹果'); print(mySet); // {香蕉, 苹果} print(mySet.toList()); // [香蕉, 苹果] List myList = ['香蕉','苹果','西瓜','香蕉','苹果','香蕉','苹果']; var mySet1 = new Set(); mySet1.addAll(myList); print(mySet1); // {香蕉, 苹果, 西瓜} print(mySet1.toList()); // [香蕉, 苹果, 西瓜] } |
三. Map
Dart映射(Map对象)是一个简单的键/值对。映射中的键和值可以是任何类型。映射是动态集合。就是说,Map可以在运行时增长和缩小。
注 - 映射值可以是包括NULL的任何对象。
1. Map的两种方式声明
- 使用映射文字
- 使用Map构造函数
A. 使用映射文字
1). 要使用映射文字声明映射,需要将键值对括在一对花括号{}中。
1 |
var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] } |
2). 例子
1 2 3 4 5 |
void main() { var details = {'usrName':'admin', 'password':'123456'}; print(details); // {usrName: admin, password: 123456} } |
B. 使用Map构造器声明映射
1). 声明映射
1 |
var identifier = new Map(); |
2). 然后初始化映射
1 |
map_name[key] = value; |
3). 例子1:在运行时向映射文字添加值
1 2 3 4 5 6 |
void main() { var details = {'usrName':'admin','password':'123456'}; details['tag'] = 'test'; print(details); // {usrName: admin, password: 123456, tag: test} } |
例子2:Map构造函数
1 2 3 4 5 6 7 |
void main() { var details = new Map(); details['usrName'] = 'admin'; details['password'] = '123456'; print(details); // {usrName: admin, password: 123456} } |
2. Maps里面常用的属性和方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
常用属性: keys 获取所有的key值 values 获取所有的value值 isEmpty 是否为空 isNotEmpty 是否不为空 常用方法: remove(key) 删除指定key的数据 addAll({...}) 合并映射 给映射内增加属性 containsValue 查看映射内的值 返回true/false forEach map where any every |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
void main() { Map person = { "name":"张三", "age":20 }; var myMap = new Map(); myMap["name"] = "李四"; print(person); // {name: 张三, age: 20} print(myMap); // {name: 李四} // 常用属性: Map person1 = { "name":"张三", "age":20, "sex":"男" }; print(person1.keys.toList()); // [name, age, sex] print(person1.values.toList()); // [张三, 20, 男] print(person1.isEmpty); // false print(person1.isNotEmpty); // true // 常用方法: Map person2 = { "name":"张三", "age":20, "sex":"男" }; person2.addAll({ "work":['敲代码', '送外卖'], "height":160 }); print(person2); // {name: 张三, age: 20, sex: 男, work: [敲代码, 送外卖], height: 160} person2.remove("sex"); print(person2); // {name: 张三, age: 20, work: [敲代码, 送外卖], height: 160} print(person2.containsValue('张三')); // true } |
四. 通用方法
List、Set和Map有一些通用的方法。其中的一些通用方法都是来自于类Iterable。List和Set是iterable类的实现。
虽然Map没有实现Iterable, 但是Map的属性keys和values都是Iterable对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
void main() { // 通用属性 isEmpty和 isNotEmpty var testSet = Set.from(["a", "b", "c"]); var testList = [1, 2, 3, 4]; var testMap = Map(); print(testSet.isNotEmpty); // true print(testList.isEmpty); // false print(testMap.isEmpty); // true testMap.addAll({ "zh": "china", "us": "usa" }); // forEach方法 testList.forEach((num) => print("I am num ${num}")); // I am num 1, I am num 2, I am num 3, I am num 4 testMap.forEach((k, v) => print("${k} is ${v}")); // zh is china, us is usa // iterable提供了 map 方法,来处理每一个集合中的对象,并返回一个结果 var setIter = testSet.map((v) => v.toUpperCase()); print(setIter); // (A, B, C) // 可以用toList和toSet将结果转换成列表或者集合 var listIter = testSet.map((v) => v.toUpperCase()).toList(); print(listIter); // [A, B, C] // iterable提供了where方法,来过滤集合中的值,并返回一个集合 var whereList = testList.where((num) => num > 2).toList(); print(whereList); // [3, 4]。如果不用toList()则返回(3, 4) // iterable提供了any方法和every方法,来判断集合中的值是否符合条件,并返回bool print(testList.any((num) => num > 2)); // true print(testList.every((num) => num > 2)); // false } |
原文连接:Dart 集合:List、Set、Map
所有媒体,可在保留署名、
原文连接
的情况下转载,若非则不得使用我方内容。