【Dart 教程系列第 4 篇】Dart 中 List 数组的常用方法

这是【Dart 教程系列第 4 篇】,如果觉得有用的话,欢迎关注专栏。

Dart 中 List 数组的方法还是比较多的,这里我按照 CRUD 对这些方法进行分类汇总。

其中 CRUD 指的是增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。

一:"增加"数据的方法(4 个)

add 添加一个元素到数组末尾 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  l1.add("周四");
  l1.add("周五");
  print(l1); // [周一, 周二, 周三, 周四, 周五]

addAll 合并两个数组 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  List<String> l2 = ["周四", "周五", "周六","周日"];
  l1.addAll(l2);
  print(l1); // [周一, 周二, 周三, 周四, 周五, 周六, 周日]

insert 在指定索引处插入一个值 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  l1.insert(3, "周四");
  print(l1); // [周一, 周二, 周三, 周四]
  l1.insert(0, "周日");
  print(l1); // [周日, 周一, 周二, 周三, 周四]

insertAll 在指定索引处插入一个数组 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  List<String> l2 = ["周四", "周五", "周六", "周日"];
  l1.insertAll(0, l2);
  print(l1); // [周四, 周五, 周六, 周日, 周一, 周二, 周三]

二:"删除"数据的方法(6 个)

remove 删除指定元素 查看更多

  List<String> l1 = ["周一", "周二", "周三","周一"];
  l1.remove("周一");
  print(l1); // [周二, 周三, 周一]

removeAt 删除指定索引位置处的元素 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  l1.removeAt(0);
  print(l1); // [周二, 周三]

removeLast 删除数组的最后一个元素 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  l1.removeLast();
  print(l1); // [周一, 周二]

clear 清空数组 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  l1.clear();
  print(l1); // []

removeWhere 根据指定条件删除元素 查看更多

  List<String> l1 = ["周一", "周二", "周三"];
  l1.removeWhere((e) => e == "周二");
  print(l1); // [周一, 周三]
  
  List<String> l2 = ["周一", "周二", "周三","星期四"];
  l2.removeWhere((e) => e.contains("周"));
  print(l2); // [星期四]

关于以上删除元素的方法

  • 如果数组中有该数据或者满足删除的条件,则删除,原数组发生改动。
  • 如果要删除的数据不在数组中,或者删除元素的条件不成立,也不会报错,返回原数组。

removeRange 删除指定索引范围内的元素(含头不含尾) 查看更多

  List<String> l1 = ["周一", "周二", "周三","周四", "周五", "周六", "周日"];
  l1.removeRange(2, 5);
  print(l1); // [周一, 周二, 周六, 周日]

三:"修改"数据的方法(5 个)

List [index] 修改指定索引位置元素的值

  List<String> l1 = ["周一", "周二", "周三", "星期四"];
  l1[3] = "周四";
  print(l1); // [周一, 周二, 周三, 周四]

fillRange 用相同的值替换指定索引范围内的所有元素(含头不含尾)

  List<String> l1 = ["周一", "周二", "周三", "周四", "周五"];
  l1.fillRange(1, 4, "AllenSu");
  print(l1); // [周一, AllenSu, AllenSu, AllenSu, 周五]

replaceRange 用某一数组替换指定索引范围内的所有元素(含头不含尾)

  List<String> l1 = ["周一", "周二", "周三"];
  l1.replaceRange(1, 2, ["周四", "周五", "周六", "周日"]);
  print(l1); // [周一, 周四, 周五, 周六, 周日, 周三]
  
  List<String> l2 = ["周一", "周二", "周三", "周四", "周五"];
  l2.replaceRange(0, 4, ["周六", "周日"]);
  print(l2); // [周六, 周日, 周五]

setRange 范围替换数组中的值(含头不含尾)

  List<String> l1 = ["11", "22", "33"];
  List<String> l2 = ["aa", "bb", "cc"];
  l1.setRange(0, 2, l2); // 用 l2 数组中索引为 0 1 位置处元素的值,替换掉 l1 数组中索引 0 1 位置处元素的值
  print(l1); // [aa, bb, 33]

setAll 从指定索引位置开始,使用第二个数组内的元素依次替换掉第一个数组中的元素

  List<String> l1 = ["周一", "周二", "周三", "周四"];
  List<String> l2 = ["周五", "周六", "周日"];
  l1.setAll(1, l2);
  print(l1); // [周一, 周五, 周六, 周日]

注意: index + l2.length <= l1.length ,否则会报错。

四:"查询"数据的方法(20 个)

elementAt 获取指定索引位置处的元素 查看更多

  List<String> l1 = ["周一", "周二", "周三", "周四"];
  String str = l1.elementAt(2);
  print(str); // 周三

contains 判断数组中是否含有指定元素 查看更多

  List<String> l1 = ["周一", "周二", "周三", "周四"];
  bool a = l1.contains("周一");
  bool b = l1.contains("周日");
  print(a); // true
  print(b); // false

indexOf 获取指定元素在数组中的索引 查看更多

  List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
  int a = l1.indexOf("周三"); // 获取数组中第一次出现"周三"元素的索引
  int b = l1.indexOf("周三", 3); // 从索引为3开始,查找第一次出现"周三"元素的索引
  int c = l1.indexOf("周日");
  print(a); // 2
  print(b); // 4
  print(c); // -1,数组中不存在指定元素,返回 -1

lastIndexOf 从后向前查找指定元素在数组中的索引 查看更多

  List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
  int a = l1.lastIndexOf("周三");
  int b = l1.lastIndexOf("周三", 3);
  int c = l1.lastIndexOf("周日");
  print(a); // 4
  print(b); // 2
  print(c); // -1

indexWhere 返回第一个满足条件的元素的索引 查看更多

  List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
  int a = l1.indexWhere((e) => e == "周三");
  print(a); // 2

lastIndexWhere 从后向前找,返回第一个满足条件的元素的索引 查看更多

  List<String> l1 = ["周一", "周二", "周三", "周四", "周三"];
  int a = l1.lastIndexWhere((e) => e == "周三");
  print(a); // 4

where 根据指定条件,函数筛选每个元素,符合条件的元素组成一个新的 Iterable 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  Iterable<int> l2 = l1.where((e) => e > 10);
  print(l2); // (12, 17, 33)
  
  List<int> l3 = l1.where((e) => e >= 10).toList();
  print(l3); // [12, 17, 33]

firstWhere 返回第一个满足条件的元素 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  int a = l1.firstWhere((e) => e > 10);
  print(a); // 12

lastWhere 从后向前查找第一个满足条件的元素 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  int a = l1.lastWhere((e) => e > 10);
  print(a); // 33

singleWhere 获取满足指定条件的唯一元素 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  int a = l1.singleWhere((e) => e > 30);
  int b = l1.singleWhere((e) => e > 33, orElse: () => -1);
  int c = l1.singleWhere((e) => e > 10, orElse: () => null);
  print(a); // 33
  print(b); // -1。数组中没有满足条件的元素,返回 orElse 方法指定的返回值(-1是自己填的,你也可以设置为其它值)
  print(c); // 报错。当数组中有多个满足条件的元素时,即使你设置了 orElse 的返回值,用 singleWhere 也会报错

retainWhere 保留满足条件的元素(改变了原数组) 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  l1.retainWhere((e) => e > 10);
  print(l1); // [12, 17, 33]

any 判断数组中是否有满足指定条件的元素 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  bool a = l1.any((e) => e > 30);
  print(a); // true

every 判断数组中是否每个元素都满足指定的条件 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  bool a = l1.every((e) => e > 1);
  print(a); // false

take 从索引 0 位置处,取指定个数的元素 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  Iterable<int> l2 = l1.take(3);
  print(l2); // (8, 12, 4)

takeWhile 从索引 0 位置处,查询满足指定条件的元素,直到出现第一个不符合条件的元素,然后返回前面符合条件的元素 查看更多

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  Iterable<int> l2 = l1.takeWhile((e) => e > 1);
  print(l2); // (8, 12, 4)

skip 跳过指定个数的元素,返回后面的元素

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  Iterable<int> l2 = l1.skip(4);
  print(l2); // (17, 33, 10)

skipWhile 根据指定条件,找到第一个不符合条件的元素,然后将该元素后面的所有元素返回

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  Iterable<int> l2 = l1.skipWhile((e) => e < 17);
  print(l2); // (17, 33, 10)

sublist 从指定索引处截取数组

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  List<int> l2 = l1.sublist(5);
  print(l2); // [33, 10]
  
  List<int> l3 = l1.sublist(2, 5);
  print(l3); // [4, 1, 17] 含头不含尾

getRange 截取指定索引范围内的元素

  List<int> l1 = [8, 12, 4, 1, 17, 33, 10];
  Iterable<int> l2 = l1.getRange(2,5);
  print(l2); // (4, 1, 17)

whereType 从混合类型的数组中,筛选出指定类型的元素


  List l1 = ["a", 15, "b", false, true, 20, "c",{"name":"AllenSu"}];
  Iterable<String> l2 = l1.whereType();
  Iterable<int> l3 = l1.whereType();
  Iterable<bool> l4 = l1.whereType();
  Iterable<Map> l5 = l1.whereType();
  print(l2); // (a, b, c)
  print(l3); // (15, 20)
  print(l4); // (false, true)
  print(l5); // ({name: AllenSu})

五:"常用"的方法(12 个)

forEach 遍历数组中的元素

  List<int> l1 = [8, 12, 4, 1];
  l1.forEach((e) => print(e)); // 8 12 4 1

map 遍历数组中的所有元素,可以对元素进行处理,并返回新的 Iterable

  List<int> l1 = [8, 12, 4, 6, 22, 34, 10];
  Iterable<bool> l2 = l1.map((e) => e > 10);
  Iterable<String> l3 = l1.map((e) => e > 10 ? "大" : "小");
  Iterable<num> l4 = l1.map((e) => e > 12 ? e / 2 : e * 2);
  print(l2); // (false, true, false, false, true, true, false)
  print(l3); // (小, 大, 小, 小, 大, 大, 小)
  print(l4); // (16, 24, 8, 12, 11.0, 17.0, 20)

toSet 将 List 转换为 Set,得到去重后的元素

  List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
  Set<int> l2 = l1.toSet();
  print(l2); // {8, 12, 6, 22, 10}

asMap 将 List 转换为 Map,key 为原数组的索引,value 为原数组的元素

  List<String> l1 = ["周一", "周二", "周三", "周四", "周五", "周六", "周日"];
  Map map = l1.asMap();
  print(map); // {0: 周一, 1: 周二, 2: 周三, 3: 周四, 4: 周五, 5: 周六, 6: 周日}

sort 数组排序(原数组发生改变)

  List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
  l1.sort();
  List<String> l2 = ["f","d","b","c","a","e"];
  l2.sort();
  print(l1); // [6, 8, 8, 10, 12, 12, 22]
  print(l2); // [a, b, c, d, e, f]

join 用指定字符连接数组中每个元素,返回 String

  List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
  String str1 = l1.join();
  String str2 = l1.join("");
  String str3 = l1.join(" ");
  String str4 = l1.join(",");
  String str5 = l1.join("-");
  print(str1); // 81286221210
  print(str2); // 81286221210
  print(str3); // 8 12 8 6 22 12 10
  print(str4); // 8,12,8,6,22,12,10
  print(str5); // 8-12-8-6-22-12-10

cast 将一个数组的类型传递给未指定数据类型的数组

  List<int> l1 = [8, 12, 8];
  var l2 = l1.cast(); // 指定 l2 的数据类型和 l1 的一样,都是 int 类型
  l2.add(6);
  print(l1); // [8, 12, 8, 6]
  l2.add("ddd");
  print(l1); // 报错,提示无法将 String 类型的数添加到 int 类型的数组中

List.generate 快速生产 Flutter 中的 Widget

List<int> l1 = [8, 12, 8, 6, 22, 12, 10];
...
children: List.generate(l1.length, (index){
    return Text("$index");
 })

reduce 用指定的函数方式对数组中的所有元素做连续操作,并将结果返回

  List<int> l1 = [1, 2, 3, 4];
  int res1 = l1.reduce((a, b) => (a * b)); // 元素依次相乘
  int res2 = l1.reduce((a, b) => (a + b)); // 元素依次相加
  print(res1); // 1*2*3*4 = 24
  print(res2); // 1+2+3+4 = 10

fold 根据一个现有数组和一个初始参数值 initValue,指定参数条件操作现有数组的所有元素,并返回处理的结果

  List<int> l1 = [1, 2, 3, 4];
  // 2 为初始参数值,后面定义的方法为该初始值和原数组之间的处理方式
  int res1 = l1.fold(2, (a, b) => (a * b)); // 相乘
  int res2 = l1.fold(2, (a, b) => (a + b)); // 相加
  print(res1); // 2*(1*2*3*4) = 48
  print(res2); // 2+(1+2+3+4) = 12

expand 根据现有数组,指定一个处理方式,返回一个 Iterable

  List<int> l1 = [1, 2, 3, 4];
  // 将 l1 数组内的每一个元素都和指定的表达式组相操作
  Iterable<int> l2 = l1.expand((e) => [e + 1]);
  Iterable<int> l3 = l1.expand((e) => [e + 1, e + 2]);
  Iterable<int> l4 = l1.expand((e) => [e + 2, e * 2]);
  Iterable<num> l5 = l1.expand((e) => [e * 2, e / 2]);
  Iterable<int> l6 = l1.expand((e) => [e, e + 1, e + 2]);
  print(l2); // (2, 3, 4, 5)
  print(l3); // (2, 3, 3, 4, 4, 5, 5, 6)
  print(l4); // (3, 2, 4, 4, 5, 6, 6, 8)
  print(l5); // (2, 0.5, 4, 1.0, 6, 1.5, 8, 2.0)
  print(l6); // (1, 2, 3, 2, 3, 4, 3, 4, 5, 4, 5, 6)

shuffle 随机排列指定数组(修改了原数组)

  List<int> l1 = [1, 2, 3, 4];
  l1.shuffle();
  print(l1); // [1, 4, 2, 3]
  l1.shuffle();
  print(l1); // [2, 1, 3, 4]

终于写完了,属实不易,可以看到 Dart 中 List 数组中的方法还是比较多的,其中关于查询数据的居多,虽然每个方法都举了一个或者多个例子,不过我觉得还是缺一张总览表,用来记载每个方法的名称和作用,也给大家整理好了,就是下面这几张表了

汇总

"添加"数据的方法
方法名作用
add添加一个元素到数组末尾
addAll合并两个数组
insert在指定索引处插入一个值
insertAll在指定索引处插入一个数组
"删除"数据的方法
方法名作用
remove删除指定元素
removeAt删除指定索引位置处的元素
removeLast删除数组的最后一个元素
clear清空数组
removeWhere根据指定条件删除元素
removeRange删除指定索引范围内的元素(含头不含尾)
"修改"数据的方法
方法名作用
List [index]修改指定索引位置元素的值
fillRange用相同的值替换指定索引范围内的所有元素(含头不含尾)
replaceRange用某一数组替换指定索引范围内的所有元素(含头不含尾)
setRange范围替换数组中的值(含头不含尾)
setAll从指定索引位置开始,使用第二个数组内的元素依次替换掉第一个数组中的元素
"查询"数据的方法
方法名作用
elementAt获取指定索引位置处的元素
contains判断数组中是否含有指定元素
indexOf获取指定元素在数组中的索引
lastIndexOf从后向前查找指定元素在数组中的索引
indexWhere返回第一个满足条件的元素的索引
lastIndexWhere从后向前找,返回第一个满足条件的元素的索引
where根据指定条件,函数筛选每个元素,符合条件的元素组成一个新的 Iterable
firstWhere返回第一个满足条件的元素
lastWhere从后向前查找第一个满足条件的元素
singleWhere获取满足指定条件的唯一元素
retainWhere根据指定条件筛选元素(改变了原数组)
any判断数组中是否有满足指定条件的元素
every判断数组中是否每个元素都满足指定的条件
take从索引 0 位置处,取指定个数的元素
takeWhile从索引 0 位置处,查询满足指定条件的元素,直到出现第一个不符合条件的元素,然后返回前面符合条件的元素
skip跳过指定个数的元素,返回后面的元素
skipWhile根据指定条件,找到第一个不符合条件的元素,然后将该元素后面的所有元素返回
sublist从指定索引处截取数组
getRange截取指定索引范围内的元素
whereType从混合类型的数组中,筛选出指定类型的元素
"常用"的方法
方法名作用
forEach遍历数组中的元素
map遍历数组中的所有元素,可以对元素进行处理,并返回新的 Iterable
toSet将 List 转换为 Set,得到去重后的元素
asMap将 List 转换为 Map,key 为原数组的索引,value 为原数组的元素
sort数组排序(原数组发生改变)
join用指定字符连接数组中每个元素,返回 String
cast将一个数组的类型传递给未指定数据类型的数组
List.generate快速生产 Flutter 中的 Widget
reduce用指定的函数方式对数组中的所有元素做连续操作,并将结果返回
fold根据一个现有数组和一个初始参数值 initValue,指定参数条件操作现有数组的所有元素,并返回处理的结果
expand根据现有数组,指定一个处理方式,返回一个 Iterable
shuffle随机排列指定数组(修改了原数组)

至此,关于 Dart 中 List 数组的常用方法已经总结完毕,显示已接近一万字,这篇文章实在是太肝了,不过整理下来自己也掌握了很多,也相信可以帮助很多人。

你的问题得到解决了吗?欢迎在评论区留言。

赠人玫瑰,手有余香,如果觉得文章不错,希望可以给个一键三连,感谢。


结束语

技术是一点一点积累的,大神也不是一天就可以达到的。原地不动就是退步,所以每天进步一点点。

最后,附上一句格言:"好学若饥,谦卑若愚",望共勉。
### 回答1: 在 Dart ,可以使用 `ByteData` 来将 int 转换为 byte 数组。例如: ``` int myInt = 42; ByteData byteData = ByteData(4); // 4 bytes byteData.setInt32(0, myInt); List<int> byteArray = byteData.buffer.asUint8List(); ``` 上面的代码,我们首先将 int 值 42 赋值给变量 myInt。然后,我们创建了一个 `ByteData` 对象,其指定了 4 个字节的空间。我们使用 `setInt32` 方法将 myInt 的值存储到第 0 个字节。最后,我们使用 `asUint8List` 方法将字节数据转换为字节数组。 ### 回答2: 在Dart将int转换为byte数组可以使用位运算来完成。首先,我们需要确定int值的字节大小,如果是32位的整数,则需要将其转换为4个字节的byte数组。接下来,我们可以使用位运算符(>>和&)来将int的每个字节提取出来,并存储到byte数组。 下面是一个示例代码: ```dart void main() { int value = 12345678; // 要转换的整数值 // 将int值转换为byte数组 List<int> bytes = List<int>.filled(4, 0); // 创建一个有4个元素的List用于存储byte for (int i = 0; i < 4; i++) { bytes[i] = (value >> (i * 8)) & 0xFF; // 提取int值的每个字节并存储到byte数组 } // 输出byte数组的值 print('byte数组:$bytes'); // 输出 [78, 230, 1, 0] } ``` 在上述代码,我们使用一个for循环来遍历int值的每个字节。每次迭代时,我们使用位移运算符(>>)将int值向右移动相应的位数,然后使用与运算符(&)和0xFF来提取最低8位的字节值,并将其存储到byte数组的对应位置。 运行上述代码,将输出byte数组的值为[78, 230, 1, 0],这表示整数12345678在byte数组的表示形式。 ### 回答3: 在Dart,我们可以使用typed_data库的Uint8List类来将int类型转换为byte数组。Uint8List是一个无符号8位整数的固定长度列表,可以用来表示字节数据。 下面是一个简单的示例代码,展示了如何将int类型转换为byte数组: ``` import 'dart:typed_data'; void main() { int number = 255; // 输入的整数 Uint8List byteData = Uint8List.fromList([number]); // 将整数转换为byte数组 print("Byte array: $byteData"); // 打印byte数组 } ``` 在上面的例子,我们首先定义了一个整数变量number,然后使用Uint8List.fromList()方法将该整数转换为byte数组。这里需要注意的是,传递给Uint8List.fromList()方法的参数必须是一个列表类型,所以我们将整数number放入一个List。 通过运行上面的代码,我们可以看到输出结果是一个byte数组:[255]。这表示整数255已成功转换为byte数组。 需要注意的是,如果输入的整数超出了0-255的范围,在转换为byte数组时会导致溢出。所以在将整数转换为byte数组之前,需要明确整数取值范围。
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Allen Su

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值