Dart 集合:List、Set、Map

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
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值