【Dart學習】--Dart之數組(List)的相關方法總結


一,初始化List

  • 非固定長度list
    var testList = List();
    print(testList.length);//輸出0
  • 固定長度List
    var testList2 = List(2);
    print(testList2.length);//輸出2
  • 元素類型固定:
    var testList3 = List<String>();
    testList3.add("哈哈哈");
    //testList3.add(1);//報錯,1不是String類型
  • 直接賦值
    var testList4 = [123,2312];
    print(testList4.length);
    
    var testList5 = [true,"嘎嘎嘎",1];
    testList5.add(1.6);//可以添加

二,常用字段

  • length屬性,返回隊列長度
    var testList6 = [1,"2",3,34532,555];
    //length屬性,返回隊列長度
    print(testList6.length);
  • isEmpty屬性,返回列表是否為空
    //isEmpty屬性,返回列表是否為空
    print(testList6.isEmpty);
  • isNotEmpty屬性,返回列表是否有元素
    //isNotEmpty屬性,返回列表是否有元素
    print(testList6.isNotEmpty);
  • first獲取List中的第一個元素
    //獲取List中的第一個元素
    print("獲取list中的第一個元素${testList6.first}");
  • last獲取List中的最后一個元素
       //獲取List中最后一個元素
        var testList = [1,2,3,4];
        testList.add(14);
        testList.add('111');
        print(testList.last); 
  • [index] 獲取List中某個位置上的元素(index為位置索引)
      //獲取List中某個位置上的元素
        var testList = [1,2,3,4];
        testList.add(14);
        testList.add('111');
        print(testList[2]); 

三,數組(List)增,刪,改,查

  • 添加數據
    • 添加一條數據  
       //添加一條數據
       var testList = List();
           testList.add(14);
           testList.add('111');
    • 向規定長度的數組添加數據
      • 錯誤的方法
         //下面的程序會報錯“Unsupported operation: Cannot add to a fixed-length list”固定長度的list不能通過add添加數據
         var testList = List(3);
            testList.add(14);
            testList.add('111');
      • 正確的添加方法

        //固定長度的List使用以下方式可以設置數據
            var testList = new List(3);
            testList[0] = '雷鋒';
            testList[1] = '18';
            testList[2] = '好人';
            print(testList[2]);  
    • 添加全部元素
         //把一個數組元素全部添加到另外一個數組里
          var testList1 = new List();
          var testList2 = ['雷鋒','18','好人'];
          testList1.addAll(testList2);
          print(testList1.length);
    • 向指定位置添加元素
       //向指定位置添加元素,如果位置越界就會報錯
          var testList = ['雷鋒','18'];
          testList.insert(2,'好人');
          print(testList.length);
    • 向指定位置添加一個新的List,第二個參數為實現了Iterable接口的對象均可

       //向指定位置添加一個新的List,第二個參數為實現了Iterable接口的對象均可
          var testList1 = ['雷鋒','18'];
          var testList2 = ['焦裕祿','45'];
          testList1.insertAll(2,testList2);
          print(testList1.length);

       

    • 將另外一個實現了iterabe接口的數據拼接到當前的List后面

      //將另外一個實現了iterabe接口的數據拼接到當前的List后面 
      Set testSet = Set();
      testSet.add(123);
      testSet.add(123);
      testSet.add(123); 
      var testFollowedBy = testList6.followedBy(testSet);
      print("testFollowedBy ${testFollowedBy}");
  • 刪除數據
    • 刪除指定元素
      //刪除指定元素
      testList.remove("哈哈哈");
      print(testList);

 

    • 刪除最后一個元素
      //刪除最后一個元素
      testList.removeLast();
      print(testList);
    • 刪除指定位置的元素

      //刪除指定位置的元素
      testList.removeAt(testList.length - 1);
      print(testList);
    • 刪除指定區域的元素

      //刪除指定區域的元素
      testList.removeRange(0,1);
      print(testList);
    • 下面這個方法是將列表List中的toString之后的字符串的長度等於3的元素全部刪除

      //下面這個方法是將列表List中的toString之后的字符串的長度等於3的元素全部刪除
      testList6.removeWhere((item) => item.toString().length == 3);
      print("刪除列表中toString后長度為3的元素:==> $testList6");
  • 修改數據
    • 設置元素,下面的方法將testList6中的第一個和第二個元素設置為testList中的元素
      //設置元素,下面的方法將testList6中的第一個和第二個元素設置為testList中的元素
      //如果testList中的元素個數不夠需要替換的元素個數,會報錯
      //如果testList中的元素個數大於需要替換的元素個數,可以通過設置第四個參數,表示跳過testList的前面幾個元素,默認為0
      //如果設置了第四個參數之后testList中的元素個數不夠需要替換的元素個數,會報錯
      testList6.setRange(0, 2, testList,1);
      print("testList===>${testList}");
    • 替換列表中的元素
      //替換列表中的元素
      //前兩個參數表示要替換列表中的元素的位置,如下面的表示將列表中第三個到第十個元素替換為testList5中的元素
      //第二個參數<=列表的長度
      //第一個參數<=第二個參數,否則會報錯
      //就是list會首先刪除第一個參數到第二個參數之前的元素,然后將需要替換的list添加在第一個參數的位置。
      print(testList6.length);
      testList6.replaceRange(10, 10, testList7);
      print(testList6);
    • 使用一個值替換List中的指定位置的全部值
      //使用一個值替換List中的指定位置的全部值
      //比如下面的操作結果就是將List中第三個和第四個元素使用item的值替換
      var item ="哼哼哼";
      testList6.fillRange(3, 5,item);
      print("fillRange item ===>$item");
      print(testList6);
    • 設置list列表中的元素
      //設置list列表中的元素
      //第一個參數表示從第幾個元素開始
      //下面的例子表示從第二個位置開始將后面的tetsList7.length個元素替換為testList7中的元素
      //如果第一個參數+第二個參數.length大於要修改的list的length會報錯
      print(testList6);
      testList6.setAll(2, testList7);
      print("setAll() ===> $testList6");
  • 查詢操作
    • 截取一個List中的其中幾個元素,第一個參數表示開始的位置,第二個參數為可選參數,表示結束的位置 
      //截取一個List中的其中幾個元素,第一個參數表示開始的位置,第二個參數為可選參數,表示結束的位置
      //如果第二個參數大於被截取List的長度,會報錯。
      var subList = testList6.sublist(0,3);
      print("截取到新的List==> ${subList}");
    • 獲取指定位置區間的元素,並返回一個新的list,和subList的區別是subList返回一個新的List,而getRange返回一個實現了Iterable接口的對象

      //獲取指定位置區間的元素,並返回一個新的list,和subList的區別是subList返回一個新的List,而getRange返回一個實現了Iterable接口的對象
      //返回一個實現了Iterable接口的對象
      var rangeList = testList6.getRange(5,10);
      print("rangeList===>${rangeList}");
      print(testList6);
    • 將滿足條件的元素保留下來,不滿足條件的元素刪除
      //將滿足條件的元素保留下來,不滿足條件的元素刪除
      //如下面的例子是將元素中字符長度=3的元素保存下來
      testList6.retainWhere((obj) => obj.toString().length == 3);
      print(testList6);
    • 查看元素最后一次出現的位置
      //查看元素最后一次出現的位置
      //第二個參數為可選參數,表示查找的位置
      //如果不傳,默認查找全部的List
      //如果傳遞了第二個值,則從0查找到第二個值所指定的位置
      //沒有查找到的話返回-1
      //第二個值可以大於List的length
      //第二個參數用start來命名,可以認為這個方法是從后向前開始查找,這樣就很好理解start表示的是開始位置了。
      testList6.insert(4, "嘻嘻嘻");
      testList6.add("哼哼哼");
      print(testList6);
      var testPosition = testList6.lastIndexOf("哼哼哼",testList6.length + 100);
      print("testPosition ====> $testPosition");
    • 元素的索引,沒有找到元素會返回-1
      //元素的索引,沒有找到元素會返回-1
      //可以和上面的lastIndexof形成對比,
      //第二個參數可以指定查找的范圍
      print(testList6.indexOf("哼哼哼",5));
    • 遍歷查詢有沒有滿足條件的數據,如果有就返回true,沒有就返回false
      //遍歷查詢有沒有滿足條件的數據,如果有就返回true,沒有就返回false
      //參數傳入一個返回bool的函數
      var testExit = testList6.any((item) => checkData(item));
      print("textExit==>$testExit");
    • 遍歷查詢是不是所有的數據都滿足這個條件,如果有不滿足的數據,直接返回false
      //遍歷查詢是不是所有的數據都滿足這個條件,如果有不滿足的數據,直接返回false
      bool testEvery = testList6.every((item) => checkData(item));
      print("testEvey ===> $testEvery");  
  •  對比anyevery方法:
    checkData()用來查看傳入的參數是否為空,如果參數為空,就返回true,如果參數不為空,就返回false
    • 結合any和every方法的源碼
       any方法的源碼中,遍歷查詢是否有滿足條件的元素,如果找到滿足條件的元素,那么直接返回true,
       every方法的源碼中遍歷查詢有沒有不滿足條件的元素,如果發現有不滿足的元素,直接返回false
    • 針對checkData()方法來說
      any在遍歷的時候會將每一個元素傳入checkData中,如果有一個元素是空的,此時就會直接返回true,目前返回了false,說明在testList6中沒有為空的元素
      every在遍歷的時候將每一個元素傳入checkData中,查看是否全部元素都是空的,如果其中有一個元素不是空的,就直接返回false,因此在checkData中由於第一個元素就不是空的,所以不滿足每一個元素都是空的條件,直接返回false
    • 這個方法相當於查看List中的數據類型是不是都是指定的數據類型,如果發現List中存在不是<>中指定的數據類型就會報錯
      //這個方法相當於查看List中的數據類型是不是都是指定的數據類型,
      //如果發現List中存在不是<>中指定的數據類型就會報錯 
      print(testList6);
      List<String> testStringList = testList6.cast<String>();
      print("testIntList ===> $testStringList");
    • 查看List中是否存在指定元素

      //查看List中是否存在指定元素
      print("是否存在哼哼哼${testList6.contains("哼哼哼")}");
    • 查找指定位置的元素

      //查找指定位置的元素
      //傳入的參數必須是合法的,也就是必須在是int類型,然后必須在0到list.length之間
      //從源碼也可以看出:會首先判斷傳入的蠶食是否是int類型,然后會判斷參數是否小於0,接着執行循環,開始遍歷,如果遍歷完了還沒找到指定的位置
      //就說明這個指定的位置有問題。
      var position = testList6.elementAt(testList6.length - 1);
      print("position ====> $position");
    • 可以理解為將一個一維數組擴展為二維數組

      //可以理解為將一個一維數組擴展為二維數組
      var testList9 = testList2.expand((item) => [item,item.toString() + "啊"].toList());
      print("test expand ===> $testList9");
      //同時也可已經一個二維數組解封,解封時需要數組里面的ietm仍然是一個list
      var testList10 = [[12,12],[22,44]];
      var testList11 = testList10.expand((item) => item.toSet());
      print("test expand ===> $testList11");

       

    • 滿足條件的第一個元素

      //滿足條件的第一個元素
      //從源碼可以看出,firstWhere方法會首先從列表中查找有沒有滿足條件的item,如果沒有找到,會判斷有沒有
      //傳入第二個參數,如果第二個參數不為空,就執行第二個參數的方法,如果第二個參數為空,就直接出錯。
      var testFirstWhere = testList6.firstWhere((item) => checkExitHa(item),orElse: getHi);
      print("滿足條件的第一個元素:$testFirstWhere");

       

    • 有條件地查詢所需數據的位置

      //有條件地查詢所需數據的位置
      //第一個參數是返回bool值的函數,第二個參數是起始位置
      //下面的例子是找出列表中元素toString之后長度是2的元素出現的位置
      testList6.insert(1, 23);
      testList6.add(34);
      int testIndexWhere1 = testList6.indexWhere((item) => getLength2(item.toString()));
      int testIndexWhere2 = testList6.indexWhere((item) => getLength2(item.toString()),3);
      print("testIndexWhere1 ${testIndexWhere1}");//輸出1
      print("testIndexWhere2 ${testIndexWhere2}");//輸出10

       

    • 有條件的查詢需要查詢的數據最后一次出現的位置

      //有條件的查詢需要查詢的數據最后一次出現的位置
      //這個方法具體的執行可以理解為倒序執行,從最后一個元素向前開始查找符合要求的數據
      //第二個參數就是指定開始執行的位置
      int testLastIndexWhere1 = testList6.lastIndexWhere((item) => getLength2(item.toString()));//輸出10
      int testLastIndexWhere2 = testList6.lastIndexWhere((item) => getLength2(item.toString()),testList6.length - 2); //輸出1
      print("testLastIndexWhere ${testLastIndexWhere1}");
      print("testLastIndexWhere ${testLastIndexWhere2}");
    • 返回滿足條件的元素,第一個參數指定需要滿足的條件,第二個參數為可選參數,指定不滿足條件的時候需要執行的操作

      //返回滿足條件的元素,第一個參數指定需要滿足的條件,第二個參數為可選參數,指定不滿足條件的時候需要執行的操作
      print("\n ${testList6}");
      var testLastWhere1 = testList6.lastWhere((item) => item.toString().length == 2 ? true : false);//沒有找到符合要求的數據就會報出異常,程序會Crash
      var testLastWhere2 = testList6.lastWhere((item) => item.toString().length == 1 ? true : false,orElse: getHi);//沒有找到符合要求的數據就會去執行getHi方法,返回getHi方法執行結果
      print("testLastWhere: ${testLastWhere1}");
      print("testLastWhere: ${testLastWhere2}");

       

    • 檢查List中是否只有一個元素,如果只有一個元素會輸出這個元素,如果沒有元素會拋出沒有數據的異常,如果多於一個元素,會拋出too many elemets異常

      //檢查List中是否只有一個元素,如果只有一個元素會輸出這個元素,如果沒有元素會拋出沒有數據的異常,如果多於一個元素,會拋出too many elemets異常
      List testList13 = List();
      testList13.add(123);
      print("\n testSingle:${testList13.single}");

       

    • 有條件的查詢滿足條件的元素是否只出現了一次

      //有條件的查詢滿足條件的元素是否只出現了一次
      //第二個參數是可選參數,用於當第一個條件不滿足時執行的操作
      //具體執行的邏輯如下:
      //在List中查找滿足條件的元素
      //如果沒有找到滿足條件的元素,查看orElse是否設置,如果設置,就執行orElse設置的函數
      //如果找到了滿足條件的元素,並且滿足條件的元素只有一個,輸出這個元素的值
      //如果找到了滿足條件的元素,但是滿足條件元素的數量大於一個,就會拋出too many elements 異常,此時程序會直接crash,不會執行orElse設置的函數
      testList6.add(1);
      var testSingleWhere = testList6.singleWhere((item) => item.toString().length == 1,orElse: getHi);
      print("\ntestSingleWhere ${testSingleWhere}, type is ${testSingleWhere.runtimeType} \n");

       

    • 取出前面多少個元素放在新的list中

      //取出前面多少個元素放在新的list中
      var testTake = testList6.take(3);
      print("\ntestTake:${testTake},and type is ${testTake.runtimeType}\n");

       

    • 返回List中滿足條件的元素的惰性迭代

      //返回List中滿足條件的元素的惰性迭代
      //從第一個元素開始查找符合條件的元素,一直查找到不符合條件的元素結束
      //注意這里是惰性迭代,也就是說如果滿足條件的元素並不是按順序排列的,分布在列表的任何位置,那么
      //這個方法查找只會查找處前面符合條件的元素,中間發現有元素不符合條件就會停止查找,即使后面還有符合條件的元素也不會再去查找了
      print(testList6);
      var testTakeWhile = testList6.takeWhile((item) => item.toString().length == 3);
      print("\ntestTakeWhile:${testTakeWhile},and type is ${testTakeWhile.runtimeType}\n");

       

    • 創建一個可包含此列表的新的列表

      //創建一個可包含此列表的新的列表
      //growable是一個可選參數,默認為true,表示創建一個可變長度的列表
      //如果傳入false,則是一個固定長度的列表
      var testToList = testList6.toList(growable: true);
      var testToList1 = testList6.toList(growable: false);
      //testToList1.add("123");//異常:testToList是一個固定長度的列表,無法進行添加數據的操作
      //testToList1.removeAt(0);//異常:固定列表無法進行刪除數據的操作
      print("\ntestToList: ${testToList},and type id ${testToList.runtimeType}\n");
      print("\ntestToList1: ${testToList1},and type id ${testToList1.runtimeType}\n");
    • 查找列表中滿足條件的數據,條件由傳入的函數參數決定

      //查找列表中滿足條件的數據,條件由傳入的函數參數決定
      var testWhere = testList6.where((item) => item.toString().length == 3);
      print("\ntestWhere:${testWhere} and type is ${testWhere.runtimeType}\n");

       

    • 取出List列表中指定類型的元素,並放入新的列表中

      //取出List列表中指定類型的元素,並放入新的列表中
      //如下面是將List中數據類型為String的元素全部取出放入到新的List中
      print(testList6);
      var testWhereType= testList6.whereType<String>();
      print("\ntestWhereType:${testWhereType},and type is ${testWhereType.runtimeType}\n");  

四,其它操作方法

  • 排序
    //排序
    testList6.sort((a,b) => a.toString().length.compareTo((b.toString().length)));
    print("根據字符的長度排序:${testList6}");
  • 將List倒序排列之后賦給一個新的list,
    //將List倒序排列之后賦給一個新的list,
    var testList8 = testList6.reversed;
    print("倒序排列List===> $testList8");
  • 根據position將list轉換為對應的map Map<int,Element>
    //根據position將list轉換為對應的map Map<int,Element>
    //也就是[0:element ......]
    var testMap = testList6.asMap();
    print("testMap ====> $testMap");
  • 將List列表中的順序打亂
    //將List列表中的順序打亂
    //可以傳入一個Random對象作為可選參數
    print(testList6);
    testList6.shuffle();
    print("shuffle ===> $testList6");
  • 對列表中的數據做指定的操作
    //對列表中的數據做指定的操作
    //下面的操作是在列表開始的時候加上“哈哈哈”這個字符串然后將后面的元素都拼接起來
    print(testList6);
    String str = testList6.fold("哈哈哈",(pre,item) => pre + item );
    print("test fold ====> $str");
  • List循環輸出數據
    //List循環輸出數據
    testList6.forEach((item) => print(item));
  • 將List作為Iterator進行使用
    //將List作為Iterator進行使用
    print(testList6);
    var testIterator = testList6.iterator;
    while(testIterator.moveNext()){
    print("testIterator: ${testIterator.current}");//輸出當前值
    }
  • 使用join中的指定的字符串分隔List中的每個元素,並將其作為字符串返回
    //使用join中的指定的字符串分隔List中的每個元素,並將其作為字符串返回
    //通過源碼可以看出,首先會將List作為Iterator來使用
    //如果Iterator中沒有元素,就直接返回一個空的字符串,注意不是null,而是 ""
    //接着判斷join()中的參數如果為空或者為 "",直接將Iterator中的元素拼接然后返回
    //如果join()中有參數,就是用join中的參數作為分隔符拼接Iterator中的元素然后返回
    String testJoin1 = testList6.join();
    String testJoin2 = testList6.join(",");
    String testJoin3 = testList6.join("噠噠噠");
    print("join中無參數:${testJoin1}");
    print("使用,作為分隔符${testJoin2}");
    print("想要在最后一個元素之前的元素后面都添加一個字符串然后返回${testJoin3}");
  • 下面的map方法和Map沒有任何關系,執行結果和match更像
    //下面的map方法和Map沒有任何關系,執行結果和match更像
    //這個方法的執行邏輯是將List中的每個元素拿出來和map(f)中傳入的f函數條件進行比較
    //如果符合條件就會返回true,否則就會返回false
    //同時返回的數據也是實現了Iterable的接口,注意是Iterable而不一定是List
    var testMap1 = testList6.map((item) => item.toString().length == 2);
    print("\ntestMap1:${testMap1}");
    print("testMap1: ${testMap1.runtimeType} \n");
  • 這個方法可以用,但是不知道具體的應用實例
    //這個方法可以用,但是不知道具體的應用實例
    //這個方法首先會傳入列表的第一個和第二個數據,對這兩個數據進行傳入的函數操作,然后會將函數的返回值作為下一次操作的第一個參數
    print("${testList6}");
    var testReduce = testList6.reduce((value,element) => checkReduce(value.toString(), element.toString()));
    print("\ntestReduce ${testReduce} type is ${testReduce.runtimeType}\n");
  • 跳過前面多少個元素,返回一個SubListIterable,和subList的操作相似
    //跳過前面多少個元素,返回一個SubListIterable,和subList的操作相似
    print(testList6);
    var testSkip = testList6.skip(2);
    print("\ntestSkip: ${testSkip}, and type is ${testSkip.runtimeType}\n");
  • 跳過列表中滿足條件的前面的元素,從第一個元素開始查找,一直查找到不滿足條件的元素為止
    //跳過列表中滿足條件的前面的元素,從第一個元素開始查找,一直查找到不滿足條件的元素為止
    //條件由傳入的函數參數決定
    testList6.insert(0, "呸呸呸");
    var testSkipWhile = testList6.skipWhile((item) => item.toString().length == 3);
    print("\ntestSkipWhile:${testSkipWhile},and type is ${testSkipWhile.runtimeType}\n");
  • 注意Set為沒有順序且不可重復的列表,數據轉換到set之后圓List中的重復的數據會被刪掉
    //注意Set為沒有順序且不可重復的列表,數據轉換到set之后圓List中的重復的數據會被刪掉
    print(testList6);
    Set testSet1 = testList6.toSet();
    print("\ntestSet1:${testSet1} and type is ${testSet1.runtimeType}\n");

     

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM