
題記:不到最後時刻,千萬别輕言放棄,無論結局成功與否,隻要你拼博過,盡力過,一切問心無愧
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]
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)
完畢