Dart 集合:List、Set、Map

  • 发表于
  • flutter

Dart提供了3种核心的集合类型 List(列表)、Set(集合)和Map(映射)。

一. List

编程中最常使用的集合是数组。Dart以列表(List)对象的形式表示数组。列表(List)只是一组有序的对象。

1. List种类

  • 固定长度列表
  • 可增长列表

A. 固定长度列表

固定长度列表的长度不能在运行时更改。
1).声明列表

var list_name = new List(initial_size)

上面的语法创建了指定大小的列表。列表不能在运行时增长或缩小。任何调整列表大小的尝试都将导致异常。
2). 初始化列表

lst_name[index] = value;

3). 例子

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).声明列表

// 创建包含指定值的列表
var list_name = [val1, val2, val3];

// 或者

// 创建一个大小为零的列表
var list_name = new List();

2).初始化列表

list_name[index] = value;

3).例子

void main()
{
var myList = new List(); 
myList.add(1); 
myList.add(2); 
print(myList);// [1, 2]
}

2. List里面常用的属性和方法:

常用属性:
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
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 即可。

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). 要使用映射文字声明映射,需要将键值对括在一对花括号{}中。

var identifier = { key1:value1, key2:value2 [,…..,key_n:value_n] }

2). 例子

void main()
{
var details = {'usrName':'admin', 'password':'123456'}; 
print(details); // {usrName: admin, password: 123456}
}

B. 使用Map构造器声明映射

1). 声明映射

var identifier = new Map();

2). 然后初始化映射

map_name[key] = value;

3). 例子1:在运行时向映射文字添加值

void main()
{
var details = {'usrName':'admin','password':'123456'}; 
details['tag'] = 'test'; 
print(details); // {usrName: admin, password: 123456, tag: test}
}

例子2:Map构造函数

void main()
{
var details = new Map(); 
details['usrName'] = 'admin'; 
details['password'] = '123456'; 
print(details); // {usrName: admin, password: 123456}
}

2. Maps里面常用的属性和方法:

常用属性:
keys获取所有的key值
values获取所有的value值
isEmpty 是否为空
isNotEmpty是否不为空
常用方法:
remove(key) 删除指定key的数据
addAll({...}) 合并映射给映射内增加属性
containsValue 查看映射内的值返回true/false
forEach 
map
where
any
every
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对象。

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
}