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 的配置,可以根据自己的需求选择一 ...
随机推荐
- 【python深入】获取对象类型及属性
在python中,查看当前的对象所能够调用的所有方法? 查看类型可以通过type,也可以通过isinstance方法,查看属性可以通过dir() 下面是对type的介绍: ————>基本类型的判 ...
- Agile PLM 开发中AgileAPI类型对应控制台分类说明
1) 分类中的一级大类PLM后台管理的控制台中,每个分类中的一级大类都对应AgileAPI中一个类型 IServiceRequest对应产品服务请求,表为:psrIPrice对应价格,表为:pr ...
- 配置apache虚拟域名(phpStudy2016)
以前也一个个的配置过apache.php和mysql,现在嫌麻烦,就用的phpStudy. 装好之后,发现127.0.0.1可以访问,但是localhost就不可以访问.大概是因为apache没有配置 ...
- How Xtuner E3 works for BMW 520d Diagnosis and initialization of CBS service
Using Xtuner E3 to perform BMW 520d Diagnosis and initialization of CBS service in step by step proc ...
- 服务器重新启动,oracle数据库重新连接问题
最近服务器使用期限到了,用户无法登陆,联系了网络的同事,重新开启了服务器,用户可以重新登陆了,但是在使用oracle数据库的时候,发现报了以下的错误: 很明显是数据库服务没有启动,解决这个问题分两步: ...
- 关闭浏览器时提示的javascript事件
onbeforeunload事件 它是这样用的: <script language="javascript"> g_blnCheckUnload = true; fun ...
- Elasticsearch下安装ik分词器
安装ik分词器(必须安装maven) 上传相应jar包 解压到相应目录 unzip elasticsearch-analysis-ik-master.zip(zip包) cp -r elasticse ...
- mui 页面提示:Unable to preventDefault inside passive
页面提示: 点击该事件:页面提示:[8mui.min.js:7 [Intervention] Unable to preventDefault inside passive event listene ...
- Postgresql之VACUUM和VACUUM FULL对比
VACUUM命令存在两种形式,VACUUM和VACUUM FULL,它们之间的区别见如下表格: 无VACUUM VACUUM VACUUM FULL 删除大量数据之后 只是将删除数据的状态置为已删除, ...
- Reading | 《C++ Primer Plus》(未完待续)
目录 一.概述和C++简史 1.早期语言的问题 2.面向对象编程OOP 3.泛型编程 二.入门 1.头文件 2.名称空间 3.cout输出 4.C++语句 5.函数 一.概述和C++简史 C++融合了 ...