dart 语言中的列表(List)

简介: 本文介绍 dart 语言中的列表(List)

dart 语言中的列表(List)


李俊才(jcLee95)的个人博客

已入驻阿里云设u去

邮箱 :291148484@163.com
本文地址
- https://developer.aliyun.com/article/1213112
- https://blog.csdn.net/qq_28550263/article/details/123322685

相关文章推荐:


目 录


1. 概述

2. 定长列表(Fixed-length list)

3. 可增长列表(Growable list)

4. 不可变列表(unmodifiable list)

5. 其它创建列表的方式

6. 常用属性

7. 常用方法

8. 列表的遍历


1. 概述

List是一种序列,即元素的有序集合。List中的数据可以重复,索引从0开始递增,且索引和值之间是一一对应的关系,这和其它语言类似。

在Dart语言中,列表(List)分为 定长列表可增长列表不可变列表。前者长度是固定的,也就是说一旦定义当你尝试使用可以更改列表长度的操作时,将发生错误。最后一个所谓不可变列表指的该列表一经创建不再能够改变。

2. 定长列表(Fixed-length list)

定长列表是长度固定的列表,若尝试更改其长度则会发生错误。列表的构造函数提供了filled方法,用于创建一个给定长度的列表。

定长列表由List.filled方法创建:

List<E>.filled(
  int length,
  E fill,
  {bool growable = false}
)

例如:

final fixedLengthList = List<int>.filled(5, 0); // Creates fixed-length list.
print(fixedLengthList); // [0, 0, 0, 0, 0]
fixedLengthList[0] = 87;
fixedLengthList.setAll(1, [1, 2, 3]);
print(fixedLengthList); // [87, 1, 2, 3, 0]
// Fixed length list length can't be changed or increased
fixedLengthList.length = 0;  // Throws
fixedLengthList.add(499);    // Throws

3. 可增长列表(Growable list)

创建的默认可增长列表[]保留一个内部缓冲区,并在必要时增长该缓冲区。这保证了一系列加法操作都将在摊销的常数时间内执行。直接设置长度可能会花费与新长度成正比的时间,并且可能会改变内部容量,因此随后的添加操作将需要立即增加缓冲区容量。

例如:

final growableList = <String>['A', 'B']; // Creates growable list.

4. 不可变列表(unmodifiable list)

使用List.unmodifiable方法可以创建不可变列表。不可变列表的列表不能改变其长度或元素。如果元素本身是不可变的,那么结果列表也是不可变的。

List<E>.unmodifiable(
    Iterable elements
)

例如:

final numbers = <int>[1, 2, 3];
final unmodifiableList = List.unmodifiable(numbers); // [1, 2, 3]
unmodifiableList[1] = 87; // Throws.

5. 其它创建列表的方式

5.1 使用List.empty构造空列表

例如:

final growableList = List.empty(growable: true); // []
growableList.add(1); // [1]
final fixedLengthList = List.empty(growable: false);
fixedLengthList.add(1); // error

5.2 使用List.from构造列表

格式为:

List<E>.from(
  Iterable elements,     // 从一个可迭代对象创建
  {bool growable = true} // 是否可创建为增长列表
)

例如:

final numbers = <num>[1, 2, 3];
final listFrom = List<int>.from(numbers);
print(listFrom); // [1, 2, 3]

5.3 使用List.generate构造列表

格式为:

List<E>.generate(
    int length,
    E generator(
        int index
    ),
    {bool growable = true}
)

该方法创建一个具有长度位置的列表,并用调用生成器为范围0内的每个索引创建的值填充该列表…长度- 1,按升序排列。

例如:

final growableList =
    List<int>.generate(3, (int index) => index * index, growable: true);
print(growableList); // [0, 1, 4]
final fixedLengthList =
    List<int>.generate(3, (int index) => index * index, growable: false);
print(fixedLengthList); // [0, 1, 4]

5.4 使用List.of构造列表

格式为:

List<E>.of(
    Iterable<E> elements,  // 从一个可迭代对象创建
    {bool growable = true} // 是否可创建为增长列表
)

例如:

final numbers = <int>[1, 2, 3];
final listOf = List<num>.of(numbers);
print(listOf); // [1, 2, 3]

6. 常用属性

属性 描述
length 获取列表的长度
isEmpty 判断列表是否为空
isNotEmpty 判断列表是否非空
reversed 列表数据反序后的可迭代对象( Iterable<E>),不改变原列表序列
first 返回列表的第一个元素
last 返回列表的最后一个元素

例子:

void main() {
  List a = [];
  List b = [1, 2, 3, 4, 5];
  print('列表 a 的长度为 ${a.length}');
  print('列表 b 的长度为 ${b.length}');
  print('列表 a 是否为空: ${a.isEmpty}');
  print('列表 b 是否非空: ${b.isNotEmpty}');
  print('列表 b 反序: ${b.reversed}');
  print('列表 b : ${b}');
}

其运行结果为:

列表 a 的长度为 0
列表 b 的长度为 5
列表 a 是否为空: true
列表 b 是否非空: true
列表 b 反序: (5, 4, 3, 2, 1)
列表 b : [1, 2, 3, 4, 5]

6666666666666.png

7. 常用方法

方法 描述
add 增加一个元素
clear 从列表中删除所有对象;列表的长度变为零。
addAll 拼接列表
indexOf 返回元素的索引,没有则返回-1
lastIndexOf 列表中元素的最后一个索引。
indexWhere 返回列表中满足所提供测试的第一个索引。
lastIndexWhere 返回列表中满足所提供测试的最后一个索引。
remove 根据传入的值删除元素
removeAt 根据传入的索引删除元素
insert(index, value) 在索引的位置插入元素
insertAll(index, list) 在索引的位置插入一个列表中所有的元素
removeRange(int start, int end) 从列表中移除一定范围的元素
toList 将其它可迭代对象转换为列表
join() 将List元素按指定元素拼接
map 将List中的每个元素依次和map(f)中传入的函数条件f进行比较,如果满足条件则返回true,否则返回false
fillRange(int start, int end, [E? fillValue]) 用 fillValue 覆盖一段元素。
getRange(int start, int end, [E? fillValue]) 创建迭代一定范围元素的可迭代对象。
shuffle([Random? random]) 洗牌函数,也就是随机打乱列表中的元素。
sort([int compare(E a, E b)?]) 就地排序,根据compare函数指定的顺序对列表进行排序。
getRange(int start, int end]) 创建迭代一定范围元素的Iterable
sublist(int start, [int? end]) 索引,返回包含开始和结束之间的元素的新列表。

【例】:

void main() {
  List a = [0, 1, 2, 3, 4, 5];
  a.add(6); // 尾部插入一个元素 6
  print(a);
  print('a.indexOf(3) = ${a.indexOf(3)}');
  print('a.indexOf(9) = ${a.indexOf(9)}');
  a.remove(0); // 移除索引为 0 处的元素
  print(a);
  a.insert(5, 6); // 在索引为 5 元素后插入元素6
  print(a);
  // 在索引为 7 元素后插入一个列表中的所有元素
  a.insertAll(7, [1, 2, 3, 4, 5]);
  print(a);
}

输出为:

[0, 1, 2, 3, 4, 5, 6]
a.indexOf(3) = 3
a.indexOf(9) = -1
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6, 6]
[1, 2, 3, 4, 5, 6, 6, 1, 2, 3, 4, 5]

【例】:fillRange

final words = List.filled(5, 'old');
print(words); // [old, old, old, old, old]
words.fillRange(1, 3, 'new');
print(words); // [old, new, new, old, old]

【例】:fillRange

final words = List.filled(5, 'old');
print(words); // [old, old, old, old, old]
words.fillRange(1, 3, 'new');
print(words); // [old, new, new, old, old]

【例】:sort

final a = <String>['two', 'three', 'four'];
// Sort from shortest to longest.
a.sort((a, b) => a.length.compareTo(b.length));
print(a); // [two, four, three]
final b = <int>[13, 2, -11, 0];
b.sort();
print(b); // [-11, 0, 2, 13]

【例】:getRange与sublist

// getRange
final colors = <String>['red', 'green', 'blue', 'orange', 'pink'];
final firstRange = colors.getRange(0, 3);
print(firstRange.join(', ')); // red, green, blue
final secondRange = colors.getRange(2, 5);
print(secondRange.join(', ')); // blue, orange, pink
// sublist
final colors = <String>['red', 'green', 'blue', 'orange', 'pink'];
print(colors.sublist(1, 3)); // [green, blue]
final colors = <String>['red', 'green', 'blue', 'orange', 'pink'];
print(colors.sublist(3)); // [orange, pink]

【例】:map

var products = jsonDecode('''
[
  {"name": "Screwdriver", "price": 42.00},
  {"name": "Wingnut", "price": 0.50}
]
''');
var values = products.map((product) => product['price'] as double);
var totalPrice = values.fold(0.0, (a, b) => a + b); // 42.5.

8. 列表的遍历

8.1 使用 for 语句遍历列表

void main() {
  List a = [1, 2, 3, 4, 5];
  for (var i = 0; i < a.length; i++) {
    print(a[i]);
  }
}

8.2 使用 for…in 语句遍历列表

void main() {
  List a = [1, 2, 3, 4, 5];
  // for in 语句
  for (var i in a) {
    print(i);
  }
}

8.3 使用 List.forEach 方法遍历列表

void main() {
  List a = [1, 2, 3, 4, 5];
  // List 的 forEach 方法
  a.forEach((elem) {
    print(elem);
  });
}

或者也可以写成 箭头函数的形式

void main() {
  List a = [1, 2, 3, 4, 5];
  a.forEach((elem) => {print(elem)});
}

其中箭头函数是一种简写模式,与JavaScript/TypeScript中的箭头函数不同的是,dart语言中的箭头函数目不支持果条语句。也就是说,如果你想写多条语句,则不可以使用 箭头函数的写法。由于只有一条语句,往往这对代表代码块的花括号{}也是可以省去的。

目录
相关文章
|
5天前
|
C语言 Python
[oeasy]python054_python有哪些关键字_keyword_list_列表_reserved_words
本文介绍了Python的关键字列表及其使用规则。通过回顾`hello world`示例,解释了Python中的标识符命名规则,并探讨了关键字如`if`、`for`、`in`等不能作为变量名的原因。最后,通过`import keyword`和`print(keyword.kwlist)`展示了Python的所有关键字,并总结了关键字不能用作标识符的规则。
24 9
|
13天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
25 14
|
15天前
|
数据挖掘 大数据 数据处理
python--列表list切分(超详细)
通过这些思维导图和分析说明表,您可以更直观地理解Python列表切分的概念、用法和实际应用。希望本文能帮助您更高效地使用Python进行数据处理和分析。
29 10
|
1月前
|
索引 Python
List(列表)
List(列表)。
47 4
|
2月前
|
测试技术 开发者 Python
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
在 Python 中,创建列表有两种方法:使用方括号 `[]` 和调用 `list()` 函数。虽然两者都能创建空列表,但 `[]` 更简洁、高效。性能测试显示,`[]` 的创建速度比 `list()` 快约一倍。此外,`list()` 可以接受一个可迭代对象作为参数并将其转换为列表,而 `[]` 则需要逐一列举元素。综上,`[]` 适合创建空列表,`list()` 适合转换可迭代对象。
在 Python 中创建列表时,应该写 `[]` 还是 `list()`?
|
1月前
|
JavaScript 数据管理 虚拟化
ArkTS List组件基础:掌握列表渲染与动态数据管理
在HarmonyOS应用开发中,ArkTS的List组件是构建动态列表视图的核心。本文深入探讨了List组件的基础,包括数据展示、性能优化和用户交互,以及如何在实际开发中应用这些知识,提升开发效率和应用性能。通过定义数据源、渲染列表项和动态数据管理,结合虚拟化列表和条件渲染等技术,帮助开发者构建高效、响应式的用户界面。
204 2
|
2月前
|
NoSQL 关系型数据库 MySQL
Redis 列表(List)
10月更文挑战第16天
31 2
|
6月前
|
安全 Java
java线程之List集合并发安全问题及解决方案
java线程之List集合并发安全问题及解决方案
1034 1
|
5月前
|
Java API Apache
怎么在在 Java 中对List进行分区
本文介绍了如何将列表拆分为给定大小的子列表。尽管标准Java集合API未直接支持此功能,但Guava和Apache Commons Collections提供了相关API。
|
5月前
|
运维 关系型数据库 Java
PolarDB产品使用问题之使用List或Range分区表时,Java代码是否需要进行改动
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。