【dart学习】之字典(Map)的相关方法总结
一,概述
通常来讲,Map是一个键值对相关的对象,键和值可以是任何类型的对象。每个键只出现一次,而一个值则可以出现多次。映射是动态集合。 换句话说,Maps可以在运行时增长和缩小。 dart:core库中的Map类提供了相同的支持。
二,声明
- 不指定泛型(普通方式,不指定任何类型,这时testMap中K-V的类型均是dynamic )
//直接赋值
var map1 = {'aa':'aaa','bb':22,'cc':true};
Map map2 = {'a':'a1','b':'b1'};//间接赋值
var map3 = new Map();
map3['aa'] = 'aaa';
Map map4 = new Map();
map4['a'] = 'aaa';
- 指定泛型(下面的例子表示Map的类型为<String,String>,初始化Map时map的类型为<String,String> ,如果类型不匹配或者不兼容就会导致程序crash)
//直接赋值
var map1 = <String,String>{'aa':'aaa','bb':'22','cc':'333'};
Map map2 = <String,String>{'a':'a1','b':'b1','c':'c1'}; //间接赋值
var map3 = new Map<String,String>();
map3['aa'] = 'aaa';
Map map4 = new Map<String,String>();
map4['a'] = 'a1';
- 通过复制的形式
/**
* 不使用类型操作符,从另一个map中初始化新的map,此时新的map中含有另一个map中的资源
*/
Map map1 = {'a':'a1','b':'b1','c':'c1'};
Map map2 = Map.castFrom(map1);
print(map2); /**
* 强制使用指定类型初始化map
* 下面的例子表示testMap1的类型为<num,String>,初始化Map时castFrom中map的类型为<int,String>
* 如果类型不匹配或者不兼容就会导致程序crashh
*/
Map<int,String> map3 = {1:'a',2:'b',3:'c'};
Map map4 = Map.castFrom<num,String>(map3);//这行代码会出错,主要原因是testMap是<dynamic,dynamic>类型的,但是这里需要的是<int,String>类型的map
Map map5 = Map.castFrom<String,String>(map3);//这行代码也会出错,因为无法将<String,String>类型的map转换为<int,String>类型的map
Map map6 = Map.castFrom<int,String>(map3); //正确 - 创建不可变的Map
Map map6 = const {'one':'Android','two':'IOS','three':'flutter'};//在目标的map6创建(复制)新的不可修改map7
Map map7 = Map.unmodifiable(map6);
print(map7);
//输出:{one: Android, two: IOS, three: flutter} - 根据list所提供的key value来创建map;
List<String> keys = ['one','two'];
List<String> values = ['Android','IOS'];
Map map9 = Map.fromIterables(keys, values);
print(map9);
三,属性
Map<String,int> map6 = {"a":1,"b":2};
lengthprint(map6.length);//2 长度
isNotEmptyprint(map6.isNotEmpty);//true 是否不为空
isEmptyprint(map6.isEmpty);//false 是否为空
keysprint(map6.keys);//(a, b) key的集合
valuesprint(map6.values);//(1, 2) value的集合
entriesprint(map6.entries);//(MapEntry(a: 1), MapEntry(b: 2)) map迭代的键值对集合
四,方法
- 增
- 新增一个key-value
Map<String,int> map7 = {"a":1,"b":2,"c":3,"d":4,"e":5};
//新增一个key value
map7["f"] = 6;//新增一个不存在的key
print(map7);//{a: 1, b: 2, c: 3, d: 4, e: 5, f: 6}
- 新增一个key-value
- 改
- 修改一个key的value
Map<String,int> map8 = {"a":1,"b":2,"c":3,"d":4,"e":5};
map8["a"] = 11;
print(map8);//{a: 11, b: 2, c: 3, d: 4, e: 5} - update() 对指定的key的value做出修改
Map<String,int> map23 = {"a":1,"b":2,"c":3};
int result3 = map23.update("a", (value)=>(value*2));//key存在 根据参数函数修改其值
print(result3);//
print(map23);//{a: 2, b: 2, c: 3}int result4 = map23.update("d", (value)=>(value*2));//key不存在 报错
int result4 = map23.update("d", (value)=>(value*2),ifAbsent: ()=>(10));//key不存在 但有ifAbsent参数 返回ifAbsent函数的值 并添加到map中
print(result4);//
print(map23);//{a: 2, b: 2, c: 3, d: 10} updateAll() 根据参数函数的规则,批量修改map
Map<String,int> map24 = {"a":1,"b":2,"c":3};
map24.updateAll((String key,int value){
return value*2;
});//
print(map24);//{a: 2, b: 4, c: 6} Map<String,int> map25 = {"a":1,"b":2,"c":3};
map25.updateAll((String key,int value){
if(key=="a"){return 10;}
if(key=="b"){return 20;}
return value*2;
});//
print(map25);//{a: 10, b: 20, c: 6}
- 修改一个key的value
- 删
- remove() 删除一个key
Map<String,int> map9 = {"a":1,"b":2,"c":3,"d":4,"e":5};
map9.remove("b");
print(map9);//{a: 11, c: 3, d: 4, e: 5} removeWhere() 根据条件批量删除
Map<String,int> map10 = {"a":1,"b":2,"c":3,"d":4,"e":5};
map10.removeWhere((key,value)=>(value>3));//删除掉 符合参数函数的keyvalue对
print(map10);//{a: 1, b: 2, c: 3}
- remove() 删除一个key
查- containsKey() 是否包含key
Map<String,int> map11 = {"a":1,"b":2,"c":3,"d":4,"e":5};
print(map11.containsKey("a"));//true 是否包含key
print(map11.containsKey("aa"));//false 是否包含key - containsValue() 是否包含value值
Map<String,int> map17 = {"a":1,"b":2,"c":3};
print(map17.containsValue(1));//true
print(map17.containsValue(4));//false - forEach() 遍历
Map<String,int> map12 = {"a":1,"b":2,"c":3,"d":4,"e":5};
map12.forEach((String key,int value){
print("$key $value");
a 1
b 2
c 3
d 4
e 5
}); 遍历时修改value值Map<String,int> map13 = {"a":1,"b":2,"c":3};
map13.forEach((String key,int value){
print("$key $value");
map13["c"] = 4;
a 1
b 2
c 4
});注意:
遍历时,新增或删除key 都会报错Map<String,int> map14 = {"a":1,"b":2,"c":3};
map14.forEach((String key,int value){
print("$key $value");
map14["d"] = 4;// 报错
map14.remove("a");// 报错
});
- containsKey() 是否包含key
- 其它
- map() 遍历每个元素 根据参数函数,对keyvalue做出修改,可转换成其他泛型的Map
Map<String,int> map19 = {"a":1,"b":2,"c":3};
Map<int,String> map20 = map19.map((String key,int value){
return new MapEntry(value, key);
});
print(map20);//{1: a, 2: b, 3: c} - clear() 清空map
Map<String,int> map15 = {"a":1,"b":2,"c":3};
map15.clear();
print(map15);//{} - addAll() 整体合并另一个map 泛型要一致
Map<String,int> map16 = {"a":1,"b":2,"c":3};
Map<String,int> other = {"a":1,"c":4,"d":7};
map16.addAll(other);//key相同时value值后者覆盖前者,前者不存在时则添加进来
print(map16);//{a: 1, b: 2, c: 4, d: 7} - addEntries() 合并两个map 如果key有重复,被合并的map的value覆盖前者
Map<String,int> map26 = {"a":1,"b":2,"c":3};
Map<String,int> map27 = {"a":1,"b":4,"d":3,"e":5};
map26.addEntries(map27.entries);
print(map26);//{a: 1, b: 4, c: 3, d: 3, e: 5} - putIfAbsent() 存在key就获取值,不存在则添加到map 然后返回值
Map<String,int> map18 = {"a":1,"b":2,"c":3};
int result = map18.putIfAbsent("a", ()=>(2));//存在
print(result);//1 获取key的值
print(map18);//{a: 1, b: 2, c: 3} map不变
int result2 = map18.putIfAbsent("d", ()=>(2));//不存在
print(result2);//2 获取新的key的value
print(map18);//{a: 1, b: 2, c: 3, d: 2} map改变 - cast() 泛型类型提升为其父祖类
Map<String,int> map21 = {"a":1,"b":2,"c":3};
Map<Object,Object> map22 = map21.cast();
map22["d"]=33;
print(map22);//{a: 1, b: 2, c: 3, d: 33}
- map() 遍历每个元素 根据参数函数,对keyvalue做出修改,可转换成其他泛型的Map
通用方法
List、Set和Map有一些通用的方法。其中的一些通用方法都是来自于类Iterable。List和Set是iterable类的实现。
虽然Map没有实现Iterable, 但是Map的属性keys和values都是Iterable对象。
通用属性 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 等等
testMap.forEach((k, v) => print("${k} is ${v}")); // zh is china 等等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
五,总结
- 当Map的Key没有指定类型时,Key类型不一致也不会报错。
- Map里面的key不能相同。但是value可以相同,value可以为空字符串或者为null。
- 创建Map有两种方式:通过构造器(new)和直接赋值。
【dart学习】之字典(Map)的相关方法总结的更多相关文章
- [dart学习]第三篇:dart变量介绍 (二)
本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...
- Dart 学习资料
Dart 学习资料: 学习资料 网址 Dart 编程语言中文网 http://dart.goodev.org/ Dart 官方包仓库 https://pub.dartlang.org/ 你想了解的Da ...
- Python3 字典(map)
ayout: post title: Python3 字典(map) author: "luowentaoaa" catalog: true tags: mathjax: true ...
- 《python基础教程(第二版)》学习笔记 字典(第4章)
<python基础教程(第二版)>学习笔记 字典(第4章)创建字典:d={'key1':'value1','key2':'value2'}lst=[('key1','value1'),(' ...
- Go学习笔记之Map
Go学习笔记之Map Map 引用类型,哈希表.map的key必须可以比较相等,除了slice, map, function的内建类型都可以作为key.struct类型不包含上述字段,也可作为key. ...
- Dart学习笔记-运算符-条件表达式-类型转换
Dart学习笔记-运算符-条件表达式-类型转换 一.运算符 1.算术运算符 + (加)- (减)* (乘)/ (除)~/ (取整) %(取余) 2.关系运算符 == (等等) != (不等) > ...
- Dart学习笔记-变量常量数据类型
变量和常量 1.变量的定义 main() { var t_str = 'hello world'; var t_num = 123456; String t_str2 = '你好,我很高兴'; int ...
- Python 2.7 学习笔记 字典(map)的使用
python中的字典,就是通常说的map,即 key/value集合的数据结构. 本文来介绍下在python下如何使用字典. 对于map这种数据结构能干什么,我们就不说了,这是一个常见的数据结构,我们 ...
- 【Dart学习】--之Iterable相关方法总结
一,概述 按顺序访问的值或元素的集合, List集合也是继承于Iterable List和Set也是Iterable,dart:collection库中同样有很多 部分Iterable集合可以被修改 ...
随机推荐
- Dataphin数据服务系列之--API 配置、管理和消费
研发小哥哥还在为公司里大量 API 只上不下,不可查不可用, 想找的 API 找不到而苦恼吗?业务方小姐姐还在为 API 开发时间长,业务相应不及时而抱怨吐槽吗? 铛铛铛,Dataphin 数据服务 ...
- 牛客多校训练营第九场 J - Symmetrical Painting (排序)
J - Symmetrical Painting 题意 给你\(n\)个矩形, 左下角\((i-1,\ L_i)\), 右上角\((i,\ R_i)\), 找一条线\(l\)平行于\(x\)轴, 让这 ...
- window使用
运行命令 regedit #注册表编译器 firewall.cpl #打开防火墙配置 powershell #打开powershell control #打开控制面版 cnpa.cpl #打开网络设置 ...
- [CSP-S模拟测试]:randomwalking(DP)
题目传送门(内部题59) 输入格式 第一行一个数$n$表示点数.第二行$n$个数$A_i$.接下来$n−1$行,每行两个数$u,v$表示$u$和$v$有边直接相连. 输出格式 一个数表示最小花费的起点 ...
- [CSP-S模拟测试]:Lighthouse(哈密顿回路+容斥)
题目背景 $Billions\ of\ lighthouses...stuck\ at\ the\ far\ end\ of\ the\ sky.$ 题目描述 平面有$n$个灯塔,初始时两两之间可以相 ...
- printf ("%*.*s")
小数点.后“*”表示输出位数,具体的数据来自参数表printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”. 同样,小数点 ...
- 第一次刷Leetcode,为什么耗费很多时间
Leetcode第2题思考过程分析:耗费的时间与思考过程 1. 审题耗费了很长时间,英文看不懂.两个单链表代表了两个整数,整数逆序,(2 -> 4 -> 3) + (5 -> 6 - ...
- ssh 免密码登录实现批量处理
搭建集群的时候ssh 免密码登录是一个问题以下脚本将实现批量处理 文件1主机名:host 17.19.18.11:12317.19.18.12:123 文件2:ssh_setup.py #!/usr/ ...
- CentOS 7虚拟机下设置固定IP详解
说明 1.笔记本主机IP为设置自动获取,不管什么情况下,不受虚拟机影响,只要连接外网就可以正常上网: 2.只要笔记本主机可以正常访问外网,启动虚拟机中的CentOS 7系统就可以正常访问外网,无需再进 ...
- time模块 datetime 模块 random 模块 OS 模块 sys 模块 hashlib 模块
time模块 在python中的时间表现形式: 时间戳 (自1970-01-01-00-00 到当前时间,按秒计算,一共过了多少秒 格式化时间 返回的是时间的字符串 格式化时间对象 返回的是一个元组 ...