Appearance
第6章:Dart 集合类型
6.1 集合概述
Dart 提供了三种常用的集合类型:
- List:有序集合,允许重复元素
- Set:无序集合,不允许重复元素
- Map:键值对集合,通过键访问值
6.2 List(列表)
List 声明与初始化
固定长度列表:
dart
List<int> fixedList = List.filled(5, 0); // 创建长度为5的列表,所有元素初始化为0
print(fixedList); // [0, 0, 0, 0, 0]可变长度列表:
dart
// 方式1:使用构造函数
List<String> fruits = List<String>();
fruits.add('苹果');
fruits.add('香蕉');
// 方式2:使用字面量
List<String> colors = ['红色', '绿色', '蓝色'];
// 方式3:使用 List.from()
List<int> numbers = List.from([1, 2, 3, 4, 5]);
// 方式4:使用扩展运算符
List<int> moreNumbers = [...numbers, 6, 7, 8];List 常用操作
添加元素:
dart
List<String> fruits = ['苹果', '香蕉'];
fruits.add('橙子'); // 添加单个元素
print(fruits); // [苹果, 香蕉, 橙子]
fruits.addAll(['葡萄', '西瓜']); // 添加多个元素
print(fruits); // [苹果, 香蕉, 橙子, 葡萄, 西瓜]
fruits.insert(1, '梨'); // 在指定位置插入元素
print(fruits); // [苹果, 梨, 香蕉, 橙子, 葡萄, 西瓜]删除元素:
dart
List<String> fruits = ['苹果', '梨', '香蕉', '橙子', '葡萄', '西瓜'];
fruits.remove('香蕉'); // 删除指定元素
print(fruits); // [苹果, 梨, 橙子, 葡萄, 西瓜]
fruits.removeAt(1); // 删除指定位置的元素
print(fruits); // [苹果, 橙子, 葡萄, 西瓜]
fruits.removeLast(); // 删除最后一个元素
print(fruits); // [苹果, 橙子, 葡萄]
fruits.clear(); // 清空列表
print(fruits); // []修改元素:
dart
List<String> fruits = ['苹果', '香蕉', '橙子'];
fruits[1] = '梨'; // 修改指定位置的元素
print(fruits); // [苹果, 梨, 橙子]查询元素:
dart
List<String> fruits = ['苹果', '梨', '橙子'];
print(fruits[0]); // 访问指定位置的元素
print(fruits.first); // 第一个元素
print(fruits.last); // 最后一个元素
print(fruits.indexOf('梨')); // 查找元素的位置
print(fruits.contains('橙子')); // 检查元素是否存在遍历元素:
dart
List<String> fruits = ['苹果', '梨', '橙子'];
// 使用 for 循环
for (int i = 0; i < fruits.length; i++) {
print(fruits[i]);
}
// 使用 for-in 循环
for (var fruit in fruits) {
print(fruit);
}
// 使用 forEach 方法
fruits.forEach((fruit) {
print(fruit);
});List 常用方法
| 方法 | 描述 |
|---|---|
length | 获取列表长度 |
isEmpty | 检查列表是否为空 |
isNotEmpty | 检查列表是否非空 |
contains() | 检查列表是否包含指定元素 |
indexOf() | 获取元素在列表中的位置 |
lastIndexOf() | 获取元素在列表中最后出现的位置 |
sort() | 对列表进行排序 |
reversed | 获取列表的逆序视图 |
sublist() | 获取列表的子列表 |
join() | 将列表元素连接成字符串 |
示例:
dart
List<int> numbers = [3, 1, 4, 1, 5, 9, 2, 6];
print('长度: ${numbers.length}'); // 8
print('是否为空: ${numbers.isEmpty}'); // false
print('是否非空: ${numbers.isNotEmpty}'); // true
print('包含 5: ${numbers.contains(5)}'); // true
print('5 的位置: ${numbers.indexOf(5)}'); // 4
print('1 最后出现的位置: ${numbers.lastIndexOf(1)}'); // 3
// 排序
numbers.sort();
print('排序后: $numbers'); // [1, 1, 2, 3, 4, 5, 6, 9]
// 逆序
print('逆序: ${numbers.reversed.toList()}'); // [9, 6, 5, 4, 3, 2, 1, 1]
// 子列表
print('子列表: ${numbers.sublist(2, 5)}'); // [2, 3, 4]
// 连接
List<String> fruits = ['苹果', '梨', '橙子'];
print('连接: ${fruits.join(', ')}'); // 苹果, 梨, 橙子6.3 Set(集合)
Set 声明与初始化
dart
// 方式1:使用构造函数
Set<String> fruits = Set<String>();
fruits.add('苹果');
fruits.add('香蕉');
// 方式2:使用字面量
Set<String> colors = {'红色', '绿色', '蓝色'};
// 方式3:使用 Set.from()
Set<int> numbers = Set.from([1, 2, 3, 4, 5]);
// 方式4:使用扩展运算符
Set<int> moreNumbers = {...numbers, 6, 7, 8};Set 常用操作
添加元素:
dart
Set<String> fruits = {'苹果', '香蕉'};
fruits.add('橙子'); // 添加单个元素
print(fruits); // {苹果, 香蕉, 橙子}
fruits.addAll(['葡萄', '西瓜']); // 添加多个元素
print(fruits); // {苹果, 香蕉, 橙子, 葡萄, 西瓜}
// 注意:添加重复元素不会有效果
fruits.add('苹果');
print(fruits); // {苹果, 香蕉, 橙子, 葡萄, 西瓜}(没有变化)删除元素:
dart
Set<String> fruits = {'苹果', '香蕉', '橙子', '葡萄', '西瓜'};
fruits.remove('香蕉'); // 删除指定元素
print(fruits); // {苹果, 橙子, 葡萄, 西瓜}
fruits.clear(); // 清空集合
print(fruits); // {}集合操作:
dart
Set<int> set1 = {1, 2, 3, 4, 5};
Set<int> set2 = {4, 5, 6, 7, 8};
// 交集
print('交集: ${set1.intersection(set2)}'); // {4, 5}
// 并集
print('并集: ${set1.union(set2)}'); // {1, 2, 3, 4, 5, 6, 7, 8}
// 差集
print('差集: ${set1.difference(set2)}'); // {1, 2, 3}遍历元素:
dart
Set<String> fruits = {'苹果', '香蕉', '橙子'};
// 使用 for-in 循环
for (var fruit in fruits) {
print(fruit);
}
// 使用 forEach 方法
fruits.forEach((fruit) {
print(fruit);
});6.4 Map(映射)
Map 声明与初始化
dart
// 方式1:使用构造函数
Map<String, int> scores = Map<String, int>();
scores['Alice'] = 95;
scores['Bob'] = 88;
// 方式2:使用字面量
Map<String, String> capitals = {
'China': 'Beijing',
'USA': 'Washington',
'Japan': 'Tokyo'
};
// 方式3:使用 Map.from()
Map<String, int> copyScores = Map.from(scores);
// 方式4:使用扩展运算符
Map<String, int> moreScores = {...scores, 'Charlie': 92};Map 常用操作
添加/修改键值对:
dart
Map<String, int> scores = {'Alice': 95, 'Bob': 88};
scores['Charlie'] = 92; // 添加新键值对
print(scores); // {Alice: 95, Bob: 88, Charlie: 92}
scores['Bob'] = 90; // 修改现有键值对
print(scores); // {Alice: 95, Bob: 90, Charlie: 92}删除键值对:
dart
Map<String, int> scores = {'Alice': 95, 'Bob': 90, 'Charlie': 92};
scores.remove('Bob'); // 删除指定键的键值对
print(scores); // {Alice: 95, Charlie: 92}
scores.clear(); // 清空Map
print(scores); // {}查询键值对:
dart
Map<String, int> scores = {'Alice': 95, 'Bob': 90, 'Charlie': 92};
print(scores['Alice']); // 访问指定键的值
print(scores.containsKey('Bob')); // 检查键是否存在
print(scores.containsValue(92)); // 检查值是否存在遍历键值对:
dart
Map<String, int> scores = {'Alice': 95, 'Bob': 90, 'Charlie': 92};
// 遍历键
for (var key in scores.keys) {
print('键: $key, 值: ${scores[key]}');
}
// 遍历值
for (var value in scores.values) {
print('值: $value');
}
// 遍历键值对
for (var entry in scores.entries) {
print('键: ${entry.key}, 值: ${entry.value}');
}
// 使用 forEach 方法
scores.forEach((key, value) {
print('键: $key, 值: $value');
});Map 常用方法
| 方法 | 描述 |
|---|---|
length | 获取Map的长度 |
isEmpty | 检查Map是否为空 |
isNotEmpty | 检查Map是否非空 |
keys | 获取所有键的集合 |
values | 获取所有值的集合 |
entries | 获取所有键值对的集合 |
containsKey() | 检查Map是否包含指定键 |
containsValue() | 检查Map是否包含指定值 |
remove() | 删除指定键的键值对 |
clear() | 清空Map |
示例:
dart
Map<String, int> scores = {'Alice': 95, 'Bob': 90, 'Charlie': 92};
print('长度: ${scores.length}'); // 3
print('是否为空: ${scores.isEmpty}'); // false
print('是否非空: ${scores.isNotEmpty}'); // true
print('所有键: ${scores.keys}'); // {Alice, Bob, Charlie}
print('所有值: ${scores.values}'); // {95, 90, 92}
print('所有键值对: ${scores.entries}'); // (Alice:95, Bob:90, Charlie:92)
print('包含键 Bob: ${scores.containsKey('Bob')}'); // true
print('包含值 95: ${scores.containsValue(95)}'); // true6.5 集合遍历技巧
使用 for-in 循环
dart
List<String> fruits = ['苹果', '香蕉', '橙子'];
for (var fruit in fruits) {
print(fruit);
}使用 forEach 方法
dart
List<String> fruits = ['苹果', '香蕉', '橙子'];
fruits.forEach((fruit) {
print(fruit);
});使用 where 方法
dart
List<int> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
List<int> evenNumbers = numbers.where((number) => number % 2 == 0).toList();
print(evenNumbers); // [2, 4, 6, 8, 10]使用 map 方法
dart
List<int> numbers = [1, 2, 3, 4, 5];
List<int> squaredNumbers = numbers.map((number) => number * number).toList();
print(squaredNumbers); // [1, 4, 9, 16, 25]使用 reduce 方法
dart
List<int> numbers = [1, 2, 3, 4, 5];
int sum = numbers.reduce((a, b) => a + b);
print(sum); // 156.6 实操案例
用集合存储数据、实现数据筛选与遍历:
学生成绩管理
dart
void main() {
// 使用Map存储学生成绩
Map<String, Map<String, int>> studentScores = {
'Alice': {
'Math': 95,
'English': 92,
'Science': 88
},
'Bob': {
'Math': 85,
'English': 89,
'Science': 91
},
'Charlie': {
'Math': 90,
'English': 87,
'Science': 93
}
};
// 遍历所有学生成绩
print('所有学生成绩:');
studentScores.forEach((name, scores) {
print('\n$name:');
scores.forEach((subject, score) {
print('$subject: $score');
});
});
// 计算每个学生的平均成绩
print('\n学生平均成绩:');
studentScores.forEach((name, scores) {
int sum = scores.values.reduce((a, b) => a + b);
double average = sum / scores.length;
print('$name: ${average.toStringAsFixed(2)}');
});
// 筛选数学成绩大于90的学生
print('\n数学成绩大于90的学生:');
studentScores.forEach((name, scores) {
if (scores['Math']! > 90) {
print('$name: ${scores['Math']}');
}
});
// 使用List存储所有学生的英语成绩
List<Map<String, dynamic>> englishScores = [];
studentScores.forEach((name, scores) {
englishScores.add({
'name': name,
'score': scores['English']
});
});
// 按英语成绩排序
englishScores.sort((a, b) => b['score'].compareTo(a['score']));
print('\n英语成绩排名:');
for (int i = 0; i < englishScores.length; i++) {
print('${i + 1}. ${englishScores[i]['name']}: ${englishScores[i]['score']}');
}
}运行结果:
所有学生成绩:
Alice:
Math: 95
English: 92
Science: 88
Bob:
Math: 85
English: 89
Science: 91
Charlie:
Math: 90
English: 87
Science: 93
学生平均成绩:
Alice: 91.67
Bob: 88.33
Charlie: 90.00
数学成绩大于90的学生:
Alice: 95
英语成绩排名:
1. Alice: 92
2. Bob: 89
3. Charlie: 87