前言
List是一种内置的数据结构,表示有序的集合,允许存储多个元素
- List是有有序的,可以通过索引访问每一个元素
- List 是可变的,可以添加、删除、修改元素
- 长度是动态的,添加、删除元素,其长度会跟着变换
- filled(length, item) 创建的集合 长度固定,不能扩容,只能修改元素
下文中 会简称为 列表|数组
创建数组
dart
// 1.构造函数创建
List<String> list1 = List<String>.empty();
// 2. filled 长度5 用0 填充
List<int> list2 = List<int>.filled(5, 0);
// 3. 字面量
List<int> list3 = [1, 2, 3, 4, 5];
// 4. from 将set\map\List转换为list
List<String> list4 = List.from(['apple', 'banana', 'orange']);
List<String> list5 = List.from({'apple', 'banana', 'orange'});
Map<String, int> map = {'apple': 1, 'banana': 2, 'orange': 3};
List<int> list6 = List.from(map.values);
List<String> list7 = List.from(map.keys);
// 5. generate 通过指定数量的重复操作来生成列表中的元素
List<int> numbers = List.generate(5, (index) => index * 3); // 生成 1 到 5 的数字列表
print(numbers); // [0, 3, 6, 9, 12]
print(list1); // []
print(list2); // [0, 0, 0, 0, 0]
print(list3); // [1, 2, 3, 4, 5]
print(list4); // [apple, banana, orange]
print(list5); // [apple, banana, orange]
print(list6); // [1, 2, 3]
print(list7); // [apple, banana, orange]
创建斐波那契数列
- 规律:下一项是前两项的和, 第一项和第二项分别是0 1
dart
var fibonacciList = List<int>.filled(10, 0);
for (var i = 0; i < fibonacciList.length; i++) {
if (i == 0 || i == 1) {
fibonacciList[i] = i;
} else {
fibonacciList[i] = fibonacciList[i - 1] + fibonacciList[i - 2];
}
}
print(fibonacciList); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
常用属性
dart
List<Object> mixedList = [1, 'two', 3.0, 'four', 5];
print(mixedList.length); // 5 数组的长度
print(mixedList.first); // 1 数组的第一项
print(mixedList[0]); // 1 数组的第一项
print(mixedList.last); // 5 数组的最后一项
print(mixedList[mixedList.length - 1]); // 5 数组的最后一项
print(mixedList.isEmpty); // false 数组是否为空
print(mixedList.isNotEmpty); // true 数组是否不为空
print(mixedList.firstOrNull); // 1 数组第一项,不存在返回null
常用方法
添加元素
dart
List<int> list1 = [1, 2];
list1.add(11);
// list1.add('22'); 报错
list1.addAll([22, 33]);
print(list1); // [1, 2, 11, 22, 33]
删除元素
remove(item):删除指定元素(匹配上的第一个)
dart
List<int> list1 = [1, 2, 11, 22, 33];
// 2.1 删除指定元素(只删除匹配上的第一个)
list1.remove(1);
print(list1); // [2, 11, 22, 33]
list1.add(22); // [2, 11, 22, 33, 22]
list1.remove(22); // 现在是有两个22
print(list1); // [2, 11, 33, 22] 删除了第一个22
removeAt(int):删除指定位置元素
dart
list1.removeAt(1);
print(list1); // [2, 33, 22] 删除指定索引的元素
// list1.removeAt(10); 索引越界会报错
removeLast():删除列表最后一个
dart
list1.removeLast(); // 删除最后一个
print(list1); // [2, 33]
removeRange(start, end):删除指定区间元素
dart
list1.removeRange(0, 1); // 删除指定区间元素
print(list1); // [33]
removeWhere((item) => item == 33):删除满足条件的元素
dart
// 2.5 删除满足条件的元素
list1.removeWhere((item) => item == 33); // 删除满足条件的元素
print(list1); // []
clear():清空数组
dart
// 2.6 清空列表
list1.clear(); // 等价于 list1.length = 0
print(list1); // []
修改元素
dart
// 3.1 使用索引直接复制
List<String> fruits = ['apple', 'banana', 'orange'];
fruits[1] = 'grape'; // 将索引为 1 的元素修改为 'grape'
print(fruits); // [apple, grape, orange]
// 3.2 使用 replaceRange 方法:
fruits.replaceRange(1, 2, ['grape', 'kiwi']); // 从索引 1 开始,删除 1 个元素,然后插入 'grape' 和 'kiwi'
print(fruits); // [apple, grape, kiwi, orange]
sort排序-会改变原数组
- sort 方法对列表进行排序,会改变原数组
- 想不改变原数组可以先复制原数组,再对新数组排序
dart
List<int> numbers = [3, 1, 4, 11, 5, 9, 2, 6, 5, 3, 5];
numbers.sort(); // 升序
print(numbers); // [1, 2, 3, 3, 4, 5, 5, 5, 6, 9, 11]
numbers.sort((a, b) => b.compareTo(a)); // 降序
print(numbers); // [11, 9, 6, 5, 5, 5, 4, 3, 3, 2, 1]
// 不改变原数组的排序
List<int> sortedNumbers = List.from(numbers); // 复制原始数组
sortedNumbers.sort(); // 对复制的数组进行排序
print(numbers); // [11, 9, 6, 5, 5, 5, 4, 3, 3, 2, 1]
print(sortedNumbers); // [1, 2, 3, 3, 4, 5, 5, 5, 6, 9, 11]
join拼成字符串,不改原数组
dart
/**
* join([string]); 数组根据链接符号拼接成字符串,不会改变原数组
*/
void List_join() {
List<Object> mixedList = ['xiao', 'yi'];
String str = mixedList.join('-');
print(str); // "xiao-yi"
print(mixedList); // [xiao, yi]
}
查找某个元素
- 1.使用 contains 方法可以检查列表是否包含指定的元素,返回一个布尔值。
- 2.使用 indexOf 方法可以查找指定元素在列表中的索引,如果找到则返回索引,否则返回 -1。
- 3.使用 lastIndexOf 方法可以查找指定元素在列表中的最后一个出现的索引,如果找到则返回索引,否则返回 -1
dart
List<int> numbers = [1, 2, 3, 4, 5, 1];
bool has2 = numbers.contains(2); // true
bool has6 = numbers.contains(6); // false
int index1 = numbers.indexOf(1); // 0 找到第一个就返回 找不到返回-1
int index2 = numbers.lastIndexOf(1); // 5 从后往前找找到第一个就返回 找不到返回-1
int index3 = numbers.indexOf(111); // -1
final elementAt = numbers.elementAt(4); // 5
常用的遍历数组方法
for循环
dart
List<int> numbers = [1, 2, 3, 4];
for (var i = 0, len = numbers.length; i < len; i++) {
print(numbers[i]); // 1 2 3 4
}
forEach
dart
List<int> numbers = [1, 2, 3, 4];
numbers.forEach(print); // 1 2 3 4
numbers.forEach((item) => print(item)); // 1 2 3 4
for in
dart
List<int> numbers = [1, 2, 3, 4];
for (var item in numbers) {
print(item); // 1 2 3 4
}
map
- map是返回新的可迭代对象,不影响原数组
dart
List<int> numbers = [1, 2, 3, 4];
Iterable<int> obj = numbers.map((e) => e * 2);
obj.forEach(print); // 2 4 6 8
print(numbers); //[1, 2, 3, 4]
where
- 条件遍历返回可迭代对象, 不影响原数组
dart
List<int> numbers = [1, 2, 3, 4];
Iterable<int> evenNumbers = numbers.where((number) => number % 2 == 0);
evenNumbers.forEach(print); // 2 4
every
- 条件遍历返回bool, 每一项都满足条件才会返回true,否则返回false
dart
List<int> numbers = [1, 2, 3, 4];
bool b1 = numbers.every((item) => item % 2 == 0); // false
bool b2 = numbers.every((item) => item > 0); // true
firstWhere
- 查找并返回第一个满足条件的元素,orElse 找不到返回 指定值 -1
dart
List<int> numbers = [1, 2, 3, 4];
var result = numbers.firstWhere((element) => element < 5); // 1
result = numbers.firstWhere((element) => element > 3); // 3
result = numbers.firstWhere((element) => element > 10, orElse: () => -1); // -1
lastWhere
- 查找并返回最后一个满足条件的元素, orElse 找不到返回 指定值 -1
dart
List<int> numbers = [1, 2, 3, 4];
var result1 = numbers.lastWhere((element) => element < 5); // 4
result1 = numbers.lastWhere((element) => element > 3); // 4
result1 =
numbers.lastWhere((element) => element > 10, orElse: () => -2); // -2
any
- 条件遍历返回bool, 任意一项都满足条件才会返回true,否则返回false
dart
List<int> numbers = [1, 2, 3, 4];
bool b3 = numbers.any((item) => item % 2 == 0); // true
bool b4 = numbers.any((item) => item < 0); // false
fold
- initialValue: 初始值
- combine(T previousValue,E element) 拿到上一次迭代的结果进行这次计算
- 类似js 中的reduce
- 返回最终计算结果,不会改变原数组
dart
List<int> numbers = [1, 2, 3, 4];
// T fold<T>(T initialValue,T combine(T previousValue,E element))
final res =
numbers.fold(0, (previousValue, element) => previousValue + element);
print(res); // 10
reduce
- 和fold 类似,区别点是 没有初始值
dart
List<int> numbers = [1, 2, 3, 4];
final num = numbers.reduce((value, element) => value + element); // 10
final num1 = numbers.reduce((value, element) => value * element); // 24
skip
- skip 是用于跳过列表(List)中的前几个元素并返回剩余元素的方法。这个方法不会修改原始的列表,而是返回一个包含剩余元素的新迭代对象。
- skip(num) num: 跳过的元素数量
dart
List<int> numbers = [1, 2, 3, 4, 5, 6];
final result = numbers.skip(2); // (3, 4, 5, 6)
final skipAll = numbers.skip(100); // ()
skipWhile
- skipWhile 找到第一个不满足条件的元素开始 返回剩余元素组成的可迭代对象
- skipWhile((item) => item > 0)
dart
List<int> numbers = [1, 2, 3, 4, 5, 6];
// 第一个满足,第二个不满足,所以从第二个开始 剩下的 所以元素被发返回
final result2 = numbers.skipWhile((x) => x != 2); // (2, 3, 4, 5, 6)
final skipAl2 = numbers.skipWhile((x) => x > 0); // () 都比0大,所以没有不满足项