Skip to content

第6章:Dart 集合类型

6.1 集合概述

Dart 提供了三种常用的集合类型:

  1. List:有序集合,允许重复元素
  2. Set:无序集合,不允许重复元素
  3. 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)}'); // true

6.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); // 15

6.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

© 2026 编程马·菜鸟教程 版权所有