天天看點

Dart核心基礎List概述

Dart核心基礎List概述

題記:不到最後時刻,千萬别輕言放棄,無論結局成功與否,隻要你拼博過,盡力過,一切問心無愧

List 可描述為數組或者是集合,用來儲存一組資料,與 Java中的 Set、List 、Array,OC中的 NSArray、NSMutableArray 類似,本文章 将從 增、删、改、查的角度來綜合分析List的使用。

1 Dart 中的 List 的建立

在這裡将 List 的類型分為兩類,一類是可變大小的 List,一類是固定長度的List,如下代碼清單 1-1 所示:

///代碼清單 1-1 
  createst(){
    // 不限定長度,不限定類型,可添加任意類型的資料
    var list1 = List();
    dynamic list2 = List();
    dynamic list3 =[];
    
    // 不限定長度,不限定類型,可添加任意類型的資料
    List list4 = List();
    List list5 = [];
    
    //限定了長度為2  越界會報錯,不限定類型,可添加任意類型的資料
    List list6 = List(2);

    // 不限定長度,限定類型,使用 <> 泛型來指定 List 中儲存的資料類型
    List<int> list7 = List();
  }           

2 List 資料添加

List中儲存的資料添加分為兩種,一種是在初始化建立時就給 List 指派,一種是 随後添加進去的,在代碼清單 1-1 中,建立的全部是 空的 List 。

Tips
  • 這裡提到的空 List 是指建立的 List中是無資料的,List對象是存在的,而不是指 null

如下代碼清單 2-1 中所示,在建立List時就向List中添加了資料,如下:

///代碼清單 2-1
    ///建立一個 List 并添加初始化資料
    List<int> list = [1,2,3,4];           

在代碼清單 2-1 中所示,在實際項目開發中适用于已有确定資料的情況下來建立List,當無确定資料時,可先建立一個空的List,然後再通過 add方法或者insert方法向List中添加元素,需要注意的是 add方法每次是向 List的尾部添加元素,而 insert方法是可以指定位置添加元素,如下代碼清單2-2所示:

///代碼清單 2-2
    ///建立一個 空的 Lsit
    List<int> list2 = [];

    ///動态 添加一個元素
    list2.add(1);
    list2.add(2);
    list2.add(3);

    print(list2);//[1,2,3]

    ///向 0 号位添加一個元素 5
    list2.insert(0, 5);
    print(list2);//[5,1,2,3]           

List的add與insert方法每次隻是添加一個元素資料,如下代碼清單2-3 所示是添加一組資料:

///代碼清單 2-3
    ///建立一個 List 并添加初始化資料
    List<int> list = [1,2,3,4];

    ///建立一個  List并添加初始化資料
    List<int> list2 = [2,3,4,5];

    ///動态 添加一組資料
    list2.addAll(list);
    print(list2);//[2, 3, 4, 5, 1, 2, 3, 4]           

在代碼清單 2-3 中是将 list 中的資料全部拼接在了 list2的尾部,可通過 insertAll 方法将 list 中的資料 插入 在指定位置,如下代碼清單2-4

///代碼清單 2-4
    ///建立一個 List 并添加初始化資料
    List<int> list = [1,2,3,4];

    ///建立一個  List并添加初始化資料
    List<int> list2 = [2,3,4,5];

    ///在 1 号位 插入 list 中的資料
    list2.insertAll(1,list);
    print(list2);//[2, 1, 2, 3, 4, 3, 4, 5]           
Dart核心基礎List概述

3 List 中資料删除

删除 List中1個元素,如下代碼清單3-1 所示:

///代碼清單 3-1 
    ///建立一個 List 并添加初始化資料
    List<String> list = ["test1", "xioming", "張三", "李四"];

    ///移除最後一個元素
    list.removeLast();

    ///移除指定索引位置的元素 如這裡指定的 2号位置
    list.removeAt(2);

    ///移除List 中指定的元素
    list.remove("張三");           

通過 removeRange 方法可删除 List 中指定範圍的多個元素,這個範圍是連續的,如下代碼清單3-2所示:

///代碼清單 3-2 
    ///建立一個 List 并添加初始化資料
    List<String> list = ["test1", "xioming", "張三", "李四"];

    print("list: " + list.toString()); //list: [test1, xioming, 張三, 李四]

    ///移除指定 索引區域的元素
    ///如這裡移除索引範圍為 [0,2) 也就是移除了 0号位與1号位上的元素
    list.removeRange(0, 2);

    print("list: " + list.toString()); //list: [張三, 李四]           

通過 removeWhere 方法可删除滿足一定條件的元素資料,如下代碼清單3-3所示:

///代碼清單 3-3 
    ///建立一個 List 并添加初始化資料
    List<String> list = ["test1", "xioming", "張三", "李四"];

    print("list: " + list.toString()); //list: [test1, xioming, 張三, 李四]

    // 從List中中删除滿足條件的所有對象。
    list.removeWhere((item){
      ///在這裡 張三, 李四 的 length 分别為2 ,滿足條件 是以會被删除
      return item.length == 2;
    });
    print("list: " + list.toString()); //list: [test1, xioming]           

通過 clear 方法可清空 List,也就是删除List中的所有的資料。

list.clear();           

4 List 中資料修改

List中的資料修改操作方法就比較簡單,如下代碼清單 4-1所示:

///代碼清單 4-1 
    List<String> list = ["test1", "xioming", "張三", "李四"];

    print("list: " + list.toString()); //list: [test1, xioming, 張三, 李四]

    ///修改資料
    list[0] = "測試資料";
    
    print("list: " + list.toString()); //list: [測試資料, xioming, 張三, 李四]           

通過 setRange 方法批量修改一定範圍的資料,如下代碼清單 4-2 所示:

///代碼清單 4-2
    List<String> list = ["test1", "xioming", "張三", "李四"];

    print("list: " + list.toString()); //list: [test1, xioming, 張三, 李四]
    ///修改 索引範圍為 [0,2) 也就是修改了 0号位與1号位上的元素
    list.setRange(0, 2, list2);

    print("list: " + list.toString()); //list: [223, 35, 張三, 李四]           

5 List 中資料 讀取

5.1 擷取 List 中指定位置的值
///直接根據索引擷取 0 号位置上的資料
    String  value = list[0];
    /// 等效于 elementAt 方法擷取
    String value1 = list.elementAt(0);           
5.2 查找 List 中的元素
List<String> list = ["test1", "xioming", "張三","xioming", "張三","李四"];

    ///從索引0處開始查找指定元素,傳回指定元素的索引
    int index = list.indexOf("張三"); ///index 2
    ///
    ///從索引0處開始查找指定元素,如果存在傳回元素索引,否則傳回-1
    int index2 = list.indexOf("張三",3); ///  4
    ///  
    ///從後往前查找,傳回查找到的第一個元素的索引
    int index4 = list.lastIndexOf("張三");/// 4           
5.3 循環周遊 List 中的資料
///代碼清單 5-3-1
List<String> testList = ["test1", "xioming", "張三", "xioming", "張三", "李四"];

///方式一 周遊擷取List中的所有資料
testList.forEach((value) {
  //value 就是List中對應的值
});

///方式二 周遊擷取List中的所有的資料
for(int i=0;i<testList.length;i++){
  ///根據索引擷取List中的資料
  var value = testList[i];
}

//方式三
//while+iterator疊代器周遊,類似Java中的iteator       
while(testList.iterator.moveNext()) {
  //擷取對應的值
  var value = testList.iterator.current;
  
}

//方式四 增強for循環
//for-in周遊       
for (var value in testList) {
  //value 就是List中對應的值
}

           

在代碼清單 5-3-1 中所示的周遊方法均可快速的擷取 List中所有的元素,Dart中還提供了許多周遊篩選的方法,如下代碼清單 5-3-2 所示:

///代碼清單 5-3-1
///方式五 周遊現有List的每個元素,并做處理,傳回一個新的Iterable
 Iterable<String> iterable = testList.map((e){
   ///将 List 中的 String 長度為 2 的元素資料規制
   return e.length==2?"a":e;
 });//用指定方法對每個元素做操作,将結果組成一個新的Iterable
 print(iterable);//(test1, xioming, a, xioming, a, a)
 ///再周遊 Iterable 就可取出資料
 iterable.forEach((element) {
   print(element);
 });           
///從0開始取count個元素,并傳回結果
 ///如這裡的取 3 個元素
 Iterable<String> takeIterable = testList.take(3);
 print(takeIterable);//(test1, xioming, 張三)


 ///從0開始取,直至第一個不符合函數的元素,将其前面的元素都傳回。
 Iterable<String> takeIterable2 = testList.takeWhile((element){
   ///實際上可了解為這裡傳回的為 false 就停止周遊
   return element.length >2;
 });
 print(takeIterable2);//(test1, xioming)           
///根據指定參數函數篩選每個元素,符合條件的元素組成一個新的Iterable
 Iterable<String> takeIterable3 = testList.where((element){
   ///實際上可了解為這裡傳回的為 false 就停止周遊
   return element.length >2;
 });
 print(takeIterable3);//(test1, xioming, xioming)           
///建立一個 List 并添加初始化資料 List 中資料類型不定
    List<dynamic> testList = ["test1",2, true, "xioming", 3, "李四"];
    
    //從混合類型的List中,篩選出指定類型的資料
    //如這裡篩選出 List 中所有 int類型 資料
    Iterable<int> iterable = testList.whereType();
    print(iterable);//(2, 3)           
List<String> testList = ["A", "D",  "F", "F","B", "C",];
    print(testList); //[A, D, F, F, B, C]

    ///截取 [0,3) 範圍中的元素
    List<String> sublist = testList.sublist(0,3);

    print(sublist);///[A, D, F]           
List<String> testList = ["A", "D",  "F", "F","B", "C",];
    print(testList); //[A, D, F, F, B, C]
    
   //截取 [0,3) 範圍中的元素
   Iterable<String> sublist2 = testList.getRange(0,3);

   print(sublist2);///(A, D, F)           
5.4 擷取 List 中滿足條件的資料
///建立一個 List 并添加初始化資料
    List<String> list = ["test1", "xioming", "張三","xioming", "張三","李四"];

    ///擷取第一個滿足條件的元素
    String value = list.firstWhere((element){
      return element.length==2;
    });
    print("value: " + value.toString()); //value: 張三

    ///擷取第一個滿足條件的元素
    String value2 = list.lastWhere((element){
      return element.length==2;
    });
    print("value2: " + value2.toString()); //value2: 李四

    ///從後向前找 傳回第一個滿足條件的元素的 索引位置
    int index = list.lastIndexWhere((element){
      return element.length==2;
    });
    print("index: " + index.toString()); //index: 5
           

6 List 的其他方法使用概述

6.1 去重複

在 List 中儲存的資料是允許重複的,通過 toSet 方法 将List轉為Set ,可去除後面重複的元素,如下所示:

List<String> testList = ["test1", "xioming", "張三", "xioming", "張三", "李四"];
    print(testList); //[test1, xioming, 張三, xioming, 張三, 李四]
    //将list轉為set,将後面重複的都去掉
    Set<String> set = testList.toSet();
    print(set); //{test1, xioming, 張三, 李四}           
6.2 List 資料轉 Map 資料
List<String> testList = ["test1", "xioming", "張三", "xioming", "張三", "李四"];
    print(testList); //[test1, xioming, 張三, xioming, 張三, 李四]
    //将list轉為set,将後面重複的都去掉
    Map<int,String> map = testList.asMap();
    print(map); //{0: test1, 1: xioming, 2: 張三, 3: xioming, 4: 張三, 5: 李四}           
6.3 随機排列 List中的資料順序
List<String> testList = ["test1", "xioming", "張三", "xioming", "張三", "李四"];
    print(testList); //[test1, xioming, 張三, xioming, 張三, 李四]
    
    //将list中資料 重新随機排列
    testList.shuffle();
    print(testList); //[test1, xioming, xioming, 李四, 張三, 張三]           
6.4 升序排列 List 中的資料
List<String> testList = ["A", "D",  "F", "F","B", "C",];
    print(testList); //[A, D, F, F, B, C]

    ///升序排列
    testList.sort();
    print(testList);//[A, B, C, D, F, F]
           
6.5 連接配接 List 中的資料
List<String> testList = ["A", "D",  "F", "F","B", "C",];
    print(testList); //[A, D, F, F, B, C]

    ///用指定的字元将List中每個元素都連接配接起來,傳回一個字元串
    /// 如這裡将 List 中的資料 使用 , 号來連接配接
    String value = testList.join(",");

    print(value);///A,D,F,F,B,C           
6.6合并 List 中的資料

通過 List 的 followedBy 方法,可以合并 多個 List中的資料至一個 Iterable中,如下代碼所示:

///建立一個 List 并添加初始化資料
    List<int> list = [1,2,3,4];

    ///建立一個  List并添加初始化資料
    List<int> list2 = [2,3,4,5];

    ///将兩個 List 中的資料合并成一個 Iterable
    Iterable<int> lsit3=list2.followedBy(list);
    print("list: "+list.toString());//list: [1, 2, 3, 4]
    print("list2: "+list2.toString());//list2: [2, 3, 4, 5]
    print("list3: "+lsit3.toString());//list3: (2, 3, 4, 5, 1, 2, 3, 4)           

完畢

Dart核心基礎List概述