[Flutter学习之Dart基础] - 集合(List, Set,Map)

Dart 中的集合主要包含三种类型,List,Set,Map。这个在Java语言中其实也有,只是没有Java中那么丰富。

Lists

这是一个使用频率非常高的集合。它有很多创建方式。

直接创建

dart 复制代码
var grains = <String>[] //声明一个String类型的数组
var fruits = ['apples', 'oranges'];//也是声明一个String类型的数组

前者是直接确定类型。第二种方式是用类类型推断,间接的声明了数组元素的类型。它还可以直接通过一些构造方法来创建。如:

dart 复制代码
var vegetables = List.filled(99, 'broccoli');

其实list的操作和Java很类似,基本上的方法都是支持的

dart 复制代码
fruits.add('kiwis'); //添加单个元素
fruits.addAll(['grapes', 'bananas']); //添加多个元素
print(fruits[1]); // 输出下标为1的元素
var appleIndex = fruits.indexOf('apples');//查找元素的下标
fruits.clear();//清楚所有元素
Sets

Set是一个无序的集合。因为它是无序的,所以不能通过index下标来获取其中的元素。创建方式的话,也是有很多种。

dart 复制代码
var ingredients = <String>{} // 注意,这里和list不一样,list是[],而Set是{}
var atomicNumbers = Set.from([79, 22, 54]);// 通过构造函数的方式创建
var ingredients = Set<String>(); // 通过默认构造函数创建

添加,删除,以及判断该元素是否已存在等部分数组通用操作都是支持的。

dart 复制代码
ingredients.add('gold'); //添加单个元素
ingredients.addAll(['gold', 'titanium', 'xenon']); // 添加多个元素
ingredients.remove('gold'); // 删除某个元素
assert(ingredients.contains('titanium'));// 判断是否包含某个元素
print(intersection.length) // 获取数组元素个数

从set里取值相对有点麻烦,尤其是取某个特定的值。所以如果需要频繁的存、取操作的时候,就不是很适合使用Set。

dart 复制代码
  print(ingredients.toList()[0]) // 直接转化成list然后通过下标的方式获取它的某个值,这是一种方式。

但因为它是无序的,所以你存的顺序不确定,所以在你想取它的值的时候,你是不知道下标的。所以使用场景非常有限。

dart 复制代码
  var iterator = ingredients.iterator;
  if (iterator.moveNext()) { // 先移动到第一个元素
    var randomElement2 = iterator.current; // 然后获取当前元素
    print(randomElement2);
  }

所以我们大多数情况下去使用Set之后,取值都是通过迭代器的方式去遍历获取你想要的值。

Maps

Map也是一个使用非常频繁的集合了。它和list以及set有点不太一样,它是key-value的形式存值的。

创建Map的方式有多种

  1. 直接使用字面量创建

    dart 复制代码
    //
    // 定义一个存储学生信息的Map
    Map<String, dynamic> student = {
      'name': 'Alice',
      'age': 20,
      'scores': {'math': 90, 'english': 85} // 嵌套Map
    };
    
    print(student); 
    // 输出: {name: Alice, age: 20, scores: {math: 90, english: 85}}
  2. 使用构造函数Map()

    dart 复制代码
    Map<String, int> scores = Map();
    scores['math'] = 90;
    scores['english'] = 85;
    
    print(scores); // 输出: {math: 90, english: 85}
  3. 通过Map.from()复制现有Map

    dart 复制代码
    Map<String, int> original = {'a': 1, 'b': 2};
    Map<String, int> copied = Map.from(original);
    copied['c'] = 3;
    
    print(copied); // 输出: {a: 1, b: 2, c: 3}
  4. 使用Map.of创建不可变Map

    dart 复制代码
    Map<String, int> immutableMap = Map.of({'x': 10, 'y': 20});
    // 尝试修改会报错:immutableMap['z'] = 30; // 抛出异常

Map的常用方法和属性

  1. 添加/修改/访问元素

    dart 复制代码
    Map<String, int> scores = {'math': 90};
    scores['english'] = 85; // 添加新键
    scores['math'] = (scores['math'] ?? 0) + 5; //访问并且修改现有键的值
    
    print(scores); // 输出: {math: 95, english: 85}
  2. 遍历Map

    dart 复制代码
    scores.forEach((key, value) { // 应为Map也是一个集合,集合都支持forEach这个方法来遍历其中的元素
      print('$key: $value');
    });
    
    for (var entry in scores.entries) { // 也可以通过for循环,当然,还有while。do...while都可以。
      print('${entry.key}: ${entry.value}');
    }
    // 他们的输出都是:
    // math: 95
    // english: 85
  3. 获取所有Key或者value

    dart 复制代码
    var keys = scores.keys; // Iterable<String>
    var values = scores.values; // Iterable<int>
    
    print(keys); // 输出: (math, english)
    print(values); // 输出: (95, 85)
  4. 检查Key或者value是否存在

    dart 复制代码
    bool hasMath = scores.containsKey('math'); // true
    bool hasScore90 = scores.containsValue(90); // false(当前值是95)
    
    print(hasMath); // true
  5. 合并Map

    dart 复制代码
    Map<String, int> moreScores = {'science': 88};
    scores.addAll(moreScores);
    
    print(scores); // 输出: {math: 95, english: 85, science: 88}
  6. 删除元素

    dart 复制代码
    scores.remove('english'); // 移除键"english"
    scores.clear(); // 清空所有元素

初期先了解一下这些常用的方法。方便后面学UI组件的时候能直接使用的的上,不用再去翻文档吧。

相关推荐
2603_9494621012 分钟前
Flutter for OpenHarmony社团管理App实战:预算管理实现
android·javascript·flutter
2601_949975792 小时前
Flutter for OpenHarmony艺考真题题库+帮助中心实现
flutter
王泰虎2 小时前
安卓开发日记,因为JCenter 关闭导致加载不了三方库应该怎么办
android
子春一4 小时前
Flutter for OpenHarmony:构建一个 Flutter 井字棋游戏,深入解析状态驱动逻辑、胜利判定与极简交互设计
flutter·游戏·交互
雨季6665 小时前
Flutter 三端应用实战:OpenHarmony “极简手势轨迹球”——指尖与屏幕的诗意对话
开发语言·javascript·flutter
ujainu5 小时前
Flutter + OpenHarmony 游戏开发进阶:CustomPainter 手绘游戏世界——从球体到轨道
flutter·游戏·信息可视化·openharmony
雨季6665 小时前
Flutter 三端应用实战:OpenHarmony “专注时光盒”——在碎片洪流中守护心流的数字容器
开发语言·前端·安全·flutter·交互
kirk_wang5 小时前
Flutter艺术探索-Flutter相机与相册:camera库与image_picker集成
flutter·移动开发·flutter教程·移动开发教程
子春一6 小时前
Flutter for OpenHarmony:构建一个 Flutter 贪吃蛇游戏,深入解析状态机、碰撞检测与响应式游戏循环
flutter·游戏
2601_949543016 小时前
Flutter for OpenHarmony垃圾分类指南App实战:主题配置实现
android·flutter