zoukankan      html  css  js  c++  java
  • dart之旅(三)- list

    list, 在 js 中被称为数组, 但是和 js 中的数组还是有不少不同的地方,我们来看一个例子:

      // 声明一个长度不可变的 list
      List<int> fixedLengthList = new List(5); // 声明一个长度为 5 的数组
      fixedLengthList.length = 0;  // 不能修改数组长度
      fixedLengthList.add(499);    // 由于声明的数组长度已经给定,不能在数组尾部添加新元素
      fixedLengthList[1] = 4; // 改变已有索引的值 ok
      
      // 声明一个长度可变的 list
      List<int> growableList = [1, 2];
      growableList.length = 0;
      print(growableList); // []
      growableList.add(499);
      print(growableList); // [499]
      growableList[0] = 87;
    

    从上面的例子中我们可以看出,当使用 new List 并传递一个长度参数来初始化一个 list 时,这个 list 的长度在之后是不可变的。所有改变 list 长度的操作都会报错;

    当使用字面量来初始化一个 list 时,则不会有这个问题,可以在 list 尾部新增元素

    list 的构造方法

    除了字面量以外,你可以使用以下方法来构造一个 list:

    List
    var l = new List(3)// 长度不可变
    l.length = 4 // error
    
    new List()// 长度可变
    l.length = 6 // OK
    
    List.filled

    这个方法接受一个长度数字,和一个要填充的元素, 使用 fill 方法需要 ** 注意 ** 的一点是,当用来填充的元素不是原始类型(number,string,boolean)等时,list 的每一个元素都是对填充元素的一个引用,当修改填充元素时,list 的所有元素都会发生变化。如果希望消除这个问题,可以使用 List.generate

      new List<int>.filled(3, 0); // [0, 0, 0]
      
      var l = new List.filled(3, '1'); // ['1', '1', '1']
      l[1] = '3';
      print(l);//['1', '3', '1']
      
      var l2 = new List.filled(3, []); // [[], [], []]
      l2[1].add(3);
      print(l2);// [[3], [3], [3]]
    
    
    List.generate

    List.generate 同样接受一个长度参数,此外,还接受一个函数,用来生成相应索引下的元素:

    new List<int>.generate(3, (int index) => index);// [1,2,3]
    
    List.from

    这个方法接受一个可迭代对象,并将它转换为一个 list, 此外还接受一个可选的布尔值参数,用来控制这个 list 的长度是否可变。

      var map = {'a': 1, 'b': 2, 'c': 3};
      print(map.keys);//iterable
      var l3 = List.from(map.keys);
      print(l3);
    

    此外,还有 List.of 和 List.unmodifiable 等方法可以构造一个 list。

    list 的属性

    var list = [1,2,3,4];
    
    list.first // 1
    list.last // 4
    list.length // 4
    list.reversed //iterable 对象 (4, 3, 2, 1)
    
    list.from(list.reversed) // [4,3,2,1]
    

    list 实例的方法

    list 方法可以按照增,删,改,查,转换分类,满足了我们对 list 的常用操作

    • list.add 在list尾部增加一个元素
    • list.addAll 在list尾部增加一队元素
    • list.insert 在list中间插入一个元素
    • list.insertAll 在list中间插入一队元素

    看下面的例子:

    
    var li = [];
    li.add(1); // [1]
    li.addAll([1,2,3,'x']); // [1,1,2,3,'x']
    li = li + [3];
    
    li.insert(2, 'm');
    li.insertAll(2, ['mmm', 'mmmm']);
    

    • list.clear 清空list
    • list.remove(e) 删掉e元素
    • list.removeAt(x) 删掉索引为x的某个元素
    • list.removeLast 删掉最后一个元素
    • list.removeWhere 删掉满足某些条件的元素
    
      var del = List.generate(40, (index) => index);// [0..39]
      del.removeLast();//[0..38]
      del.removeAt(5);// 去掉 del[5]
      del.remove(10);// 去掉值为 10 的元素
      del.removeRange(20, 30);// 去掉索引为 20 到 29 的元素
      print(del);
      del.removeWhere((item) => item % 2 == 0);// 去掉偶数
      del.retainWhere((item) => item % 2 != 0);// 保留奇数
      print(del);
      del.clear();// 清空 list
      print(del);
    

    list.setAll, 接受两个参数,开始被替换的索引,和用于替换的 iterable 对象

    List<String> list = ['a', 'b', 'c'];
    list.setAll(1, ['bee', 'sea']);
    list.join(','); // 'a, bee, sea'
    

    list.setRange 可接受四个参数,其中第四个参数表示从第三个参数(一个可迭代对象)中的第几个元素开始替换前一个 list

    List<int> list1 = [1, 2, 3, 4];
    List<int> list2 = [5, 6, 7, 8, 9];
    // 将 list2 中的从第三个元素开始替换 list1 中的索引为 1,2 的元素
    list1.setRange(1, 3, list2, 3);
    list1.join(','); // '1, 8, 9, 4'
    

    list.replaceRange, 接受一个 start,end 索引,以及一个用来替换的 iterable 对象,方法将根据 start,end 清除 strat 到 end 的元素,并插入 iterable 对象

    List<int> list = [1, 2, 3, 4, 5];
    list.replaceRange(1, 4, [6, 7]);
    list.join(','); // '1, 6, 7, 5'
    

    • list.indexOf
    • list.lastIndexOf
    • list.indexWhere
    • list.lastWhere

    这四个方法都可接受一个数字作为第二个可选参数,表示从哪里开始搜索。of 和 where 的区别在于 of 接受一个元素,而 where 接受一个函数作为参数,所以 where 更加灵活。

    
      var list = [1,2,3,4,5,2,1];
      print(list.indexOf(2)); // 1
      print(list.lastIndexOf(2)); // 5
      print(list.lastIndexWhere((e) => e % 3 == 0)); // 2
    
    

    排序和打乱

    list.sort 用来对 list 排序, list.shuffle 可以打乱 list。

    var list = [8, 7, 5, 1, 4, 3, 8, 9];
    list.sort((a, b ) => b-a);//[9, 8, 8, 7, 5, 4, 3, 1]
    list.shuffle(); // 打乱这个 list[3, 8, 5, 9, 7, 8, 1, 4]
    

    本节完。

  • 相关阅读:
    Delphi 之Copyrect的使用
    Delphi GDI对象之脱屏位图(Offscreen Bitmaps),也叫内存位图
    1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise
    Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
    每一个JavaScript开发者都应该知道的10道面试题
    【HDOJ 5407】 CRB and Candies (大犇推导
    Wireshark默认不抓取本地包的解决方式
    Android LaunchMode案例篇
    使用ViewPager实现广告滑动效果
    剑指offer面试题26-复杂链表的复制
  • 原文地址:https://www.cnblogs.com/imgss/p/10061283.html
Copyright © 2011-2022 走看看