Dart-集合类型

Dart核心库提供了List(列表)、Map(映射)、Set(集)三种集合类型

列表(List)

固定长度的列表,一旦定义就无法改变长度

    List<int> fixedLengthList = new List(5);
    fixedLengthList[0] = 87;
    print(fixedLengthList);
    print(fixedLengthList[0]);

输出:
[87, null, null, null, null]
87

可改变长度的列表,可以根据需要改变长度

    List<int> growableList = [1, 2];
    print(growableList);

    growableList.length = 0;
    print(growableList);

    growableList.add(499);
    print(growableList);

    growableList[0] = 87;
    print(growableList);

输出:
[1, 2]
[]
[499]
[87]

几种构造函数

    List([int length])
   // 创建固定长度的列表
    List fixedLengthList = new List(3);
    print(fixedLengthList.length);

    // 创建可改变长度的列表
    List growableListA = new List();
    print(growableListA.length);
    growableListA.length = 3;
    print(growableListA.length);

    // 创建可在固定范围内改变长度的列表
    List growableListB = new List()..length = 500;
    List.unmodifiable(Iterable elements)

    // 创建包含所有元素的固定长度列表
    List fixedLengthListB = new List.unmodifiable([1, 2, 3]);
    print(fixedLengthListB.length);
    List.from(Iterable elements, {bool growable: true})

     // 创建包含所有元素的可改变长度列表
    List growableListC = new List.from([1, 2, 3]);
    print(growableListC.length);
    growableListC.add(4);
    print(growableListC.length);
    List.filled(int length, E fill, {bool growable: false})

    // 为所有元素统一赋值
    List fixedLengthList = new List<int>.filled(3, 0);
    print(fixedLengthList);
    List.generate(int length, E generator(int index), {bool growable: true})

   // 用生成器给所有元素赋初始值
    List fixedLengthList = new List<int>.generate(4, (int index) {
        return index * index;
    });
    print(fixedLengthList);

所有属性

    List fixedLengthList = new List<int>.generate(4, (int index) {
        return index * index;
    });
    // 返回第一个元素
    print(fixedLengthList.first);
    // 返回最后一个元素
    print(fixedLengthList.last);
    // 返回列表的哈希码
    print(fixedLengthList.hashCode);
    // 列表是否为空
    print(fixedLengthList.isEmpty);
    // 列表是否不为空
    print(fixedLengthList.isNotEmpty);
    // 返回一个新的迭代器
    print(fixedLengthList.iterator);
    // 列表中多少个元素
    print(fixedLengthList.length);
    // 返回相反顺序的列表
    print(fixedLengthList.reversed);
    // 返回对象运行时的类型
    print(fixedLengthList.runtimeType);
    // 列表是否只有一个元素,则否报错
    print(fixedLengthList.single);

常用方法

返回多种类型的输出
    List growableList = new List.from([1, 2, 3]);
    // 返回列表的字符串表示
    print(growableList.toString());
    // 返回列表的集表示
    print(growableList.toSet());
    // 返回列表的列表表示
    print(growableList.toList());
    // 用指定字符连接列表元素
    print(growableList.join(","));

给列表增加元素
    List growableList = new List();
    // 增加一个元素到列表末尾
    growableList.add(10);
    print(growableList);
    // 增加一个元素到指定下标
    growableList.insert(1, 20);
    print(growableList);
    // 增加一个列表到列表末尾
    growableList.addAll([30, 60]);
    print(growableList);
    // 增加一个列表到指定下标
    growableList.insertAll(3, [40, 50]);
    print(growableList);

各种删除操作的方法
    List growableList = new List.from([1, 2, 3, 3, 3, 4]);
    // 移除列表中匹配的第一个元素,为什么参数是3
    growableList.remove(3);
    print(growableList);
    // 移除列表中第几个元素
    growableList.removeAt(0);
    print(growableList);
    // 移除列表中最后一个元素
    growableList.removeLast();
    print(growableList);
    // 移除列表的所有元素
    growableList.clear();
    print(growableList);

    List<int> listB = [1, 2, 3, 4, 5];
    // 移除开始下标(包括)至结束下标(不包括)内的元素
    listB.removeRange(1, 4);
    print(listB);

    List<int> listA = [1, 2, 3, 4, 5];
    // 移除并替换开始下标(包括)至结束下标(不包括)内的元素
    listA.replaceRange(1, 4, [6, 7]);
    print(listA);

    List<String> numbersA = ['one', 'two', 'three', 'four'];
    /*  移除所有满足条件的元素,此为Dart的一种速写语法
        numbersA.removeWhere((item) => item.length == 3);   */
    numbersA.removeWhere((item){
        return item.length == 3;
    });
    print(numbersA);

    List<String> numbersB = ['one', 'two', 'three', 'four'];
    /*  移除所有不满足条件的元素,此为Dart的一种速写语法
        numbersB.retainWhere((item) => item.length == 3);   */
    numbersB.retainWhere((item){
        return item.length == 3;
    });
    print(numbersB);

//这两个移除方法相比较于Java少了很多逻辑,简单清晰

按顺序迭代列表
    List<String> names = ["Alice", "Daphne", "Elizabeth", "Joanna"];
    names.forEach((name){
        print(name);
    });

各种查询输出方法
    List<String> names = ['Abbey', 'Fallon', 'Xenia', 'Callie', 'Callie'];
    // 列表中是否包含指定元素
    print(names.contains('Fallon'));
    // 返回列表中的第几个元素
    print(names.elementAt(2));
    // 返回列表中第一个匹配元素的下标
    print(names.indexOf('Callie'));
    // 返回列表中最后一个匹配元素的下标
    print(names.lastIndexOf('Callie'));

    List<String> colors = ['red', 'green', 'blue', 'orange', 'pink'];
    // 返回从开始下标(包括)到结束下标(不包括)元素的列表
    print(colors.sublist(1, 3));
    // 返回从开始下标(包括)到最后一个元素的列表
    print(colors.sublist(1));

对列表元素做一些改动
    List<String> listA = ['a', 'b', 'c'];
    // 从第几个元素开始覆盖原列表
    listA.setAll(1, ['bee', 'sea']);
    print(listA);

    List<int> listB = [1, 2, 3, 4, 5];
    // 对列表进行随机排序
    listB.shuffle();
    print(listB);

    List<int> listC = [1, 2, 3, 4, 5];
    // 对列表进行顺序排序
    listC.sort();
    print(listC);

映射(Map)

映射也就是键值对,每个键都有与之相关联的一个值

几种构造函数

Map()
    Map<String, int> map = {"a":1, "b":2, "c":3};
    print(map["a"]);

Map.fromIterable(Iterable iterable, {K key(element), V value(element)})
    List<int> list = [1, 2, 3];
    Map<String, int> map = new Map.fromIterable(list,key: (item) => item.toString(),value: (item) => item * item);
    // 1 + 4 = 5
    print(map['1'] + map['2']);
    // 9 - 4 = 5
    print(map['3'] - map['2']);

Map.fromIterables(Iterable keys, Iterable values)
    List<String> letters = ['b', 'c'];
    List<String> words = ['bad', 'cat'];
    Map<String, String> map = new Map.fromIterables(letters, words);
    // bad + cat = badcat
    print(map['b'] + map['c']);

所有属性

 Map<String, int> map = {"a":1, "b":2, "c":3};
    // 返回映射的哈希码
    print(map.hashCode);
    // 映射上是否没有键值对
    print(map.isEmpty);
    // 映射上是否有键值对
    print(map.isNotEmpty);
    // 返回映射的所有键
    print(map.keys);
    // 返回映射的所有值
    print(map.values);
    // 返回映射上键值对的数目
    print(map.length);
    // 返回对象运行时的类型
    print(map.runtimeType);

常用方法

 Map<String, int> map = {"a":1, "b":2, "c":3};
    // 返回映射的字符串表示
    print(map.toString());
    // 按顺序迭代映射
    map.forEach((key, value){
        print(key + " : " + value.toString());
    });
    // 添加其他键值对到映射中
    map.addAll({"d":4, "e":5});
    // 映射是否包含指定键
    print(map.containsKey("d"));
    // 映射是否包含指定值
    print(map.containsValue(5));
    // 删除指定键值对
    map.remove("a");
    // 删除所有键值对
    map.clear();

    Map<String, int> scores = {'Bob': 36};
    for (var key in ['Bob', 'Rohan', 'Sophena']) {
        // 查找指定键,如果不存在就添加
        scores.putIfAbsent(key, () => key.length);
    }
    print(scores['Bob']);
    print(scores['Rohan']);
    print(scores['Sophena']);

集(Set)

集的每个对象只能出现一次,不能重复

    Set villains = new Set();
    villains.add('Joker');
    villains.addAll( ['Lex Luther', 'Voldemort'] );
    print(villains);

所有属性

 Set villains = new Set.from(['Joker', 'Lex Luther', 'Voldemort']);
    // 返回第一个元素
    print(villains.first);
    // 返回最后一个元素
    print(villains.last);
    // 返回元素的数量
    print(villains.length);
    // 集只有一个元素就返回元素,否则异常
    //print(villains.single);
    // 集是否没有元素
    print(villains.isEmpty);
    // 集是否有元素
    print(villains.isNotEmpty);
    // 返回集的哈希码
    print(villains.hashCode);
    // 返回对象运行时的类型
    print(villains.runtimeType);
    // 返回集的可迭代对象
    print(villains.iterator);

常用方法

   Set villains = new Set.from(["A", "B", "C"]);
    // 添加一个值
    villains.add("D");
    print(villains);
    // 添加一些值
    villains.addAll(["E", "F"]);
    print(villains);
    // 以字符串输出集
    print(villains.toString());
    // 将集的值用指定字符连接,以字符串输出
    print(villains.join(","));
    // 集是否包含指定值
    print(villains.contains("C"));
    // 集是否包含一些值
    print(villains.containsAll(["E", "F"]));
    // 返回集的第几个值
    print(villains.elementAt(1));
    // 删除集的指定值,成功则返回true
    print(villains.remove("A"));
    // 删除集的一些值
    villains.removeAll(["B", "C"]);
    // 删除集的所有值
    villains.clear();
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353