Dart基本语法2 <列表与集合>

发布于 16 天前  29 次阅读


1. List(列表)

列表是有序且可重复的集合,类似 C++ 的 vector

常用方法

添加元素

var fruits = ['苹果', '香蕉'];

// 在末尾添加单个元素
fruits.add('橙子');           // ['苹果', '香蕉', '橙子']

// 在末尾添加多个元素
fruits.addAll(['葡萄', '西瓜']);  // ['苹果', '香蕉', '橙子', '葡萄', '西瓜']

// 在指定位置插入
fruits.insert(1, '草莓');     // ['苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']

// 在指定位置插入多个
fruits.insertAll(0, ['芒果', '猕猴桃']);  // ['芒果', '猕猴桃', '苹果', '草莓', '香蕉', '橙子', '葡萄', '西瓜']

删除元素

var fruits = ['苹果', '香蕉', '橙子', '香蕉'];

// 删除指定元素(只删除第一个)
fruits.remove('香蕉');        // ['苹果', '橙子', '香蕉']

// 删除指定位置的元素
fruits.removeAt(1);          // ['苹果', '香蕉'] 返回被删除的元素

// 删除最后一个元素
fruits.removeLast();          // ['苹果', '香蕉'] 返回被删除的元素

// 删除符合条件的元素
fruits.removeWhere((item) => item.length > 2);  // 删除长度大于2的

// 清空列表
fruits.clear();              // []

查找元素

var fruits = ['苹果', '香蕉', '橙子', '香蕉'];

// 查找元素位置(从前往后)
fruits.indexOf('香蕉');       // 1

// 查找元素位置(从后往前)
fruits.lastIndexOf('香蕉');   // 3

// 检查是否包含元素
fruits.contains('苹果');     // true

修改元素

var fruits = ['苹果', '香蕉', '橙子'];

// 修改指定位置元素
fruits[1] = '草莓';          // ['苹果', '草莓', '橙子']

// 替换一个元素
fruits.replaceRange(0, 1, ['芒果']);  // ['芒果', '草莓', '橙子']

// 随机打乱顺序
fruits.shuffle();            // 随机排序

遍历与转换

var numbers = [1, 2, 3, 4, 5];

// for 循环
for (var i = 0; i < numbers.length; i++) {
  print(numbers[i]);
}

// for-in 循环
for (var num in numbers) {
  print(num);
}

// forEach 方法
numbers.forEach((num) => print(num));

// map 转换
var doubled = numbers.map((n) => n * 2).toList();  // [2, 4, 6, 8, 10]

// where 过滤
var evens = numbers.where((n) => n % 2 == 0).toList();  // [2, 4]

// reduce 聚合
var sum = numbers.reduce((a, b) => a + b);  // 15

// any 和 every 判断
numbers.any((n) => n > 3);   // true(是否有大于3的元素)
numbers.every((n) => n > 0); // true(是否所有元素都大于0)

排序

var numbers = [3, 1, 4, 1, 5, 9, 2];

// 升序排序
numbers.sort();             // [1, 1, 2, 3, 4, 5, 9]

// 自定义排序(降序)
numbers.sort((a, b) => b.compareTo(a));  // [9, 5, 4, 3, 2, 1, 1]

2. Set(集合)

集合是无序且不重复的集合,类似 C++ 的 unordered_set

创建方式

// 使用类型
var colors = <String>{'红色', '绿色', '蓝色'};

// 类型推断
var numbers = {1, 2, 3, 4, 5};

// 空集合(注意:{} 会默认创建 Map,而不是 Set)
var emptySet = <int>{};

常用方法

添加与删除

var fruits = {'苹果', '香蕉'};

// 添加单个元素
fruits.add('橙子');          // {'苹果', '香蕉', '橙子'}
// 如果已存在,不会添加(无重复)

// 添加多个元素
fruits.addAll(['葡萄', '西瓜']);  // {'苹果', '香蕉', '橙子', '葡萄', '西瓜'}

// 删除元素
fruits.remove('香蕉');        // {'苹果', '橙子', '葡萄', '西瓜'}

// 删除符合条件的
fruits.removeWhere((item) => item.length > 2);

// 清空集合
fruits.clear();

集合运算

var setA = {1, 2, 3, 4};
var setB = {3, 4, 5, 6};

// 交集
var intersection = setA.intersection(setB);     // {3, 4}

// 并集
var union = setA.union(setB);                    // {1, 2, 3, 4, 5, 6}

// 差集(A有B没有的)
var difference = setA.difference(setB);          // {1, 2}

// 检查是否包含
setA.contains(1);                               // true
setA.containsAll([1, 2]);                       // true(是否包含所有)

遍历

var fruits = {'苹果', '香蕉', '橙子'};

for (var fruit in fruits) {
  print(fruit);
}

fruits.forEach((fruit) => print(fruit));

3. List vs Set 核心区别

特性 List(列表) Set(集合)
有序性 ✅ 有序(按索引) ❌ 无序
重复元素 ✅ 允许 ❌ 不允许
索引访问 ✅ 支持 [index] ❌ 不支持
适用场景 需要按顺序访问数据 需要去重或检查存在性
性能 查找较慢 O(n) 查找快 O(1)

示例对比

// List - 有序可重复
var list = ['A', 'B', 'A', 'C'];
print(list[0]);  // 'A' - 可以用索引访问
print(list);     // [A, B, A, C]

// Set - 无序不重复
var set = {'A', 'B', 'A', 'C'};
// print(set[0]);  // 错误!不能索引访问
print(set);      // {A, B, C} - 自动去重

4. 快速记忆

🎯 列表:有序有重复,需要索引访问 → 用 List

🎯 集合:无需去重,快速查找 → 用 Set

🎯 常用操作
- 添加:add() / addAll()
- 删除:remove() / removeLast() / clear()
- 查找:indexOf() / contains()
- 遍历:for-in / forEach() / map()