dart之旅(三)- list
list, 在 js 中被称为数组, 但是和 js 中的数组还是有不少不同的地方,我们来看一个例子:
// 声明一个长度不可变的 list
List<int> fixedLengthList = new List(5); // 声明一个长度为 5 的数组
fixedLengthList.length = 0; // 不能修改数组长度
fixedLengthList.add(499); // 由于声明的数组长度已经给定,不能在数组尾部添加新元素
fixedLengthList[1] = 4; // 改变已有索引的值 ok
// 声明一个长度可变的 list
List<int> growableList = [1, 2];
growableList.length = 0;
print(growableList); // []
growableList.add(499);
print(growableList); // [499]
growableList[0] = 87;
从上面的例子中我们可以看出,当使用 new List
并传递一个长度参数来初始化一个 list 时,这个 list 的长度在之后是不可变的。所有改变 list 长度的操作都会报错;
当使用字面量来初始化一个 list 时,则不会有这个问题,可以在 list 尾部新增元素
list 的构造方法
除了字面量以外,你可以使用以下方法来构造一个 list:
List
var l = new List(3)// 长度不可变
l.length = 4 // error
new List()// 长度可变
l.length = 6 // OK
List.filled
这个方法接受一个长度数字,和一个要填充的元素, 使用 fill 方法需要 ** 注意 ** 的一点是,当用来填充的元素不是原始类型(number,string,boolean)等时,list 的每一个元素都是对填充元素的一个引用,当修改填充元素时,list 的所有元素都会发生变化。如果希望消除这个问题,可以使用 List.generate
new List<int>.filled(3, 0); // [0, 0, 0]
var l = new List.filled(3, '1'); // ['1', '1', '1']
l[1] = '3';
print(l);//['1', '3', '1']
var l2 = new List.filled(3, []); // [[], [], []]
l2[1].add(3);
print(l2);// [[3], [3], [3]]
List.generate
List.generate 同样接受一个长度参数,此外,还接受一个函数,用来生成相应索引下的元素:
new List<int>.generate(3, (int index) => index);// [1,2,3]
List.from
这个方法接受一个可迭代对象,并将它转换为一个 list, 此外还接受一个可选的布尔值参数,用来控制这个 list 的长度是否可变。
var map = {'a': 1, 'b': 2, 'c': 3};
print(map.keys);//iterable
var l3 = List.from(map.keys);
print(l3);
此外,还有 List.of 和 List.unmodifiable 等方法可以构造一个 list。
list 的属性
var list = [1,2,3,4];
list.first // 1
list.last // 4
list.length // 4
list.reversed //iterable 对象 (4, 3, 2, 1)
list.from(list.reversed) // [4,3,2,1]
list 实例的方法
list 方法可以按照增,删,改,查,转换分类,满足了我们对 list 的常用操作
增
- list.add 在list尾部增加一个元素
- list.addAll 在list尾部增加一队元素
- list.insert 在list中间插入一个元素
- list.insertAll 在list中间插入一队元素
看下面的例子:
var li = [];
li.add(1); // [1]
li.addAll([1,2,3,'x']); // [1,1,2,3,'x']
li = li + [3];
li.insert(2, 'm');
li.insertAll(2, ['mmm', 'mmmm']);
删
- list.clear 清空list
- list.remove(e) 删掉e元素
- list.removeAt(x) 删掉索引为x的某个元素
- list.removeLast 删掉最后一个元素
- list.removeWhere 删掉满足某些条件的元素
var del = List.generate(40, (index) => index);// [0..39]
del.removeLast();//[0..38]
del.removeAt(5);// 去掉 del[5]
del.remove(10);// 去掉值为 10 的元素
del.removeRange(20, 30);// 去掉索引为 20 到 29 的元素
print(del);
del.removeWhere((item) => item % 2 == 0);// 去掉偶数
del.retainWhere((item) => item % 2 != 0);// 保留奇数
print(del);
del.clear();// 清空 list
print(del);
改
list.setAll, 接受两个参数,开始被替换的索引,和用于替换的 iterable 对象
List<String> list = ['a', 'b', 'c'];
list.setAll(1, ['bee', 'sea']);
list.join(','); // 'a, bee, sea'
list.setRange 可接受四个参数,其中第四个参数表示从第三个参数(一个可迭代对象)中的第几个元素开始替换前一个 list
List<int> list1 = [1, 2, 3, 4];
List<int> list2 = [5, 6, 7, 8, 9];
// 将 list2 中的从第三个元素开始替换 list1 中的索引为 1,2 的元素
list1.setRange(1, 3, list2, 3);
list1.join(','); // '1, 8, 9, 4'
list.replaceRange, 接受一个 start,end 索引,以及一个用来替换的 iterable 对象,方法将根据 start,end 清除 strat 到 end 的元素,并插入 iterable 对象
List<int> list = [1, 2, 3, 4, 5];
list.replaceRange(1, 4, [6, 7]);
list.join(','); // '1, 6, 7, 5'
查
- list.indexOf
- list.lastIndexOf
- list.indexWhere
- list.lastWhere
这四个方法都可接受一个数字作为第二个可选参数,表示从哪里开始搜索。of 和 where 的区别在于 of 接受一个元素,而 where 接受一个函数作为参数,所以 where 更加灵活。
var list = [1,2,3,4,5,2,1];
print(list.indexOf(2)); // 1
print(list.lastIndexOf(2)); // 5
print(list.lastIndexWhere((e) => e % 3 == 0)); // 2
排序和打乱
list.sort 用来对 list 排序, list.shuffle 可以打乱 list。
var list = [8, 7, 5, 1, 4, 3, 8, 9];
list.sort((a, b ) => b-a);//[9, 8, 8, 7, 5, 4, 3, 1]
list.shuffle(); // 打乱这个 list[3, 8, 5, 9, 7, 8, 1, 4]
本节完。
dart之旅(三)- list的更多相关文章
- Hadoop学习之旅三:MapReduce
MapReduce编程模型 在Google的一篇重要的论文MapReduce: Simplified Data Processing on Large Clusters中提到,Google公司有大量的 ...
- [dart学习]第三篇:dart变量介绍 (二)
本篇继续介绍dart变量类型,可参考前文:第二篇:dart变量介绍 (一) (一)final和const类型 如果你不打算修改一个变量的值,那么就把它定义为final或const类型.其中:final ...
- dart之旅(二)- 内建类型
目录 number 类型 字符串 布尔类型 像大多数语言一样,dart 也提供了 number,string,boolean 等类型,包括以下几种: numbers strings booleans ...
- 滴滴Booster移动APP质量优化框架 学习之旅 三
推荐阅读: 滴滴Booster移动App质量优化框架-学习之旅 一 Android 模块Api化演练 不一样视角的Glide剖析(一) 滴滴Booster移动App质量优化框架-学习之旅 二对重复资源 ...
- Dart语言学习(三)Dart数值型
一.类型 数值型有 num,int, double num a = ; a = 12.5; print(a); print(a.runtimeType); ; // b = 20.5; print( ...
- Netty之旅三:Netty服务端启动源码分析,一梭子带走!
Netty服务端启动流程源码分析 前记 哈喽,自从上篇<Netty之旅二:口口相传的高性能Netty到底是什么?>后,迟迟两周才开启今天的Netty源码系列.源码分析的第一篇文章,下一篇我 ...
- dart之旅(一)
前言 最近在看 dart 了,本着 "纸上得来终觉浅,绝知此事 markdown" 的原则,准备边学边写,写一个系列,这是第一篇.学习过程中主要是参考 A Tour of the ...
- QT开发之旅三串口设备调试工具
这里首先说明一下,这个为什么叫串口设备调试工具而不是串口调试工具,是因为这个工具比网络上的串口调试工具多出了一些真实需要的用来调试设备的功能,首先一点就是大部分的串口调试工具收到数据都是立即返回,这样 ...
- Spring学习之旅(三)--装配Bean
装配 Bean 的方式 在 XML 中进行显式配置 在 Java 中进行显式配置 隐式的 Bean 发现机制和自动装配 Spring 提供了以上三种方式进行 Bean 的配置,可以根据自己的需求选择一 ...
随机推荐
- 【转载】Windows上那些值得推荐的良心软件-整理 easybcd 引导工具 easyuefi 引导工具
您查询的关键词是:清理dism知乎 以下是该网页在北京时间 2019年03月17日 21:56:16 的快照: 如果打开速度慢,可以尝试快速版:如果想更新或删除快照,可以投诉快照. 百度和网页 htt ...
- 微软Office Online服务安装部署(三)
现在开始配置两台服务器,两台服务器的IP: Server: 10.1.3.89 Client: 10.1.3.92 1.在Client中,.打开网络属性,找到ipv4的配置,将dns 改成域控制器的 ...
- js、jquery、jsp的区别
1.JSP全称是java server page JS全称是javaScript 2.最主要的区别是运行位置不同. JSP运行在后台服务器上,混合在HTML中的java程序段用于控制HTML的动 ...
- stark组件开发之批量操作
class UserInfoHandler(StartHandler): ....... # 批量操作功能的列表,添加则显示, 使用此功能.需要将StartHandler.display_checkb ...
- (转)Android四大组件——Activity跳转动画、淡出淡入、滑出滑入、自定义退出进入
文章转自:http://blog.csdn.net/qq_30379689/article/details/52494270 Activity跳转动画.淡入淡出.滑入滑出.自定义退出进入 前言: 系统 ...
- Java之IO流总结
IO流·Java流式输入/输出原理·Java流类的分类·输入/输出流类·常见的节点流和处理流·文件流·缓冲流·转换流·数据流·Print流·Object流 ①Java流式输入/输出原理 ...
- oracle 为什么没有权限的用户也可以用sysdba登录
我随便创建了一个用户,create user lisi identified by lisi; 当我用sqlplus登录的时候: cmd -> sqlplus lisi/lisi 进不去 ...
- JSP :使用<%@include%>报Duplicate local variable path 错误
今天在做商城页面,遇到问题: <%@include file="menu.jsp" %> 错误提示: Multiple annotations found at thi ...
- web版ssh的使用
一.web_ssh版本安装使用 web_ssh源码:https://github.com/shellinabox/shellinabox 1)安装依赖包 yum install git openssl ...
- Spring Cloud之踩坑01 -- Eureka高可用配置
转载:https://blog.csdn.net/dear_Alice_moon/article/details/79373955 问题描述: 在进行Eureka高可用配置时,控制台一直出现“.... ...