Scala教程(十二)List操作高階進階實戰
阿新 • • 發佈:2018-12-25
1 List基本操作
1.1 List組成結構
陣列由head tail兩部分組成:head表示第一個元素,tail表示其它元素。
val bigData = List("Hadoop","Spark") val data = List(1,2,3) // 陣列由head tail兩部分組成:head表示第一個元素,tail表示其它元素 val bigDataCore = "Hadoop" :: ("Spark"::Nil ); val dataInt = 1 :: 2 :: 3 :: Nil // 是否為空 println(data.isEmpty); // 第一個元素: 1 println(data.head) // 其它元素:2,3 println(data.tail); // 提取bigData中元素內容,陣列中的元素長度,必須和List()中引數一致 val List(a,b) = bigData; // 執行結果:a=Hadoop,b=Spark println("a="+a+",b="+b); // 第一個元素,第二個元素,及餘其它的元素及List val x::y::rest = data // 執行結果:x=1,y=2,rest=List(3) println("x="+x+",y="+y+",rest="+rest);
1.2 list模式匹配
def main(args: Array[String]): Unit = { // 模式匹配 val shuffledData = List(6, 3, 5, 6, 2, 9, 1) println(sortList(shuffledData)) // 排序 def sortList(dataSet: List[Int]): List[Int] = dataSet match { case List() => List() case head :: tail => compute(head, sortList(tail)) } def compute(data: Int, dataSet: List[Int]): List[Int] = dataSet match { case List() => List(data); // 如果集合第一個元素值小於data值,data放在第一個位置 case head :: tail => if (data <= head) data :: dataSet // 如果不小於data值,進行下次比較 else head :: compute(data, tail); } }
1.3 :::操作符
連線符:::進行list與list之間連線。
// list與list之間進行連線符::: println(List(1,2,3,4) ::: List(4,5,6,7,8) ::: List (10,11)); println(List(1,2,3,4) :::(List(4,5,6,7,8):::List(10,11))); println(List(1,2,3,4) :::List(4,5,6,7,8):::List(10,11)); // lenght方法特別慢 println(List(1,2,3,4).length)
1.4 List一階函式操作
var bigData = List("Hadoop","Spark","Kaffka")
// 最後一個元素,執行結果:Kaffka
println(bigData.last);
// 除最後一個元素外的元素,執行結果:List(Hadoop, Spark)
println(bigData.init);
// 反轉後的內容,執行結果:List(Kaffka, Spark, Hadoop)
println(bigData.reverse)
// 打印出自己本身,執行結果:List(Hadoop, Spark, Kaffka)
println(bigData)
// 獲取前兩個元素,執行結果:List(Hadoop, Spark)
println(bigData.take(2))
// 刪除前兩2個元素,執行結果:List(Kaffka)
println(bigData.drop(2))
// 折分為,前面兩個為一組,後面元素為一組,執行結果:(List(Hadoop, Spark),List(Kaffka))
println(bigData splitAt(2));
// 通過索引獲得元素:索引從0開始,執行結果:Kaffka
println(bigData apply(2))
println(bigData(2))
// 宣告list
val data = List('a','b','c','d','e','f','g');
// 獲得所有的元素的索引,執行結果:Range(0, 1, 2, 3, 4, 5, 6)
println(data.indices);
// zip配對組合操作,執行結果:Vector((0,a), (1,b), (2,c), (3,d), (4,e), (5,f), (6,g))
println(data.indices zip data);
// zip配對組合操作,執行結果:List((a,0), (b,1), (c,2), (d,3), (e,4), (f,5), (g,6))
println(data.zipWithIndex);
// toString方法,執行結果:List(a, b, c, d, e, f, g)
println(data.toString());
// 返回兩端以中括號開頭、結束,中間以分號隔,執行結果:[a;b;c;d;e;f;g]
println(data.mkString("[",";","]"));
// 格式化輸出字串,執行結果:a b c d e f g
println(data.mkString(" "));
// 無任格式輸出,執行結果:abcdefg
println(data.mkString);
// 將資料操作的結果賦值在buffer物件,執行結果:(a;;b;;c;;d;;e;;f;;g)c
val buffer = new StringBuilder();
data.addString(buffer,"(",";;",")");
println(buffer);
// list和陣列相互轉換
val array =data
println(array.toArray);
println(array.toList);
// copy data物件中的元素到newArray陣列中,copy到3以後的位置
val newArray = new Array[Char](10)
data.copyToArray(newArray,3)
// 執行結果: abcdefg
newArray.foreach(print)
/*
* 能過iterator集合中.next獲取陣列
* a
* b
*/
val iterator = data.toIterator
println(iterator.next())
println(iterator.next())
2 List常用函式
2.1 List函式操作(一)
List的map、flatMap、foreach、filter函式操作。
// list中的元素 * 2 操作,執行結果:List(2, 4, 6, 8, 10, 12)
println(List(1,2,3,4,5,6).map(_*2))
val data = List("Scala","Hadoop","Spark")
// 獲取每個元素的長度,執行結果:List(5, 6, 5)
println(data.map(_.length()))
// 轉為List內容進行反轉,執行結果:List(alacS, poodaH, krapS)
println(data.map(_.toList.reverse.mkString))
// 把元素中的每個元素轉成List,執行結果:List(List(S, c, a, l, a), List(H, a, d, o, o, p), List(S, p, a, r, k))
println(data.map(_.toList));
// 將list元素分成多個list元素,再重新合成新的List元素,執行結果:
println(data.flatMap(_.toList))
/* 1到9不包含10,執行結果:
* List((2,1),
* (3,1), (3,2),
* (4,1), (4,2), (4,3),
* (5,1), (5,2), (5,3), (5,4),
* (6,1), (6,2), (6,3), (6,4), (6,5),
* (7,1), (7,2), (7,3), (7,4), (7,5), (7,6),
* (8,1), (8,2), (8,3), (8,4), (8,5), (8,6), (8,7),
* (9,1), (9,2), (9,3), (9,4), (9,5), (9,6), (9,7), (9,8))
*/
println(List.range(1, 10).flatMap(i => List.range(1, i).map(j => (i,j))))
// list中的元素,1到5連加,執行結果:sum=15
var sum = 0;
List(1,2,3,4,5).foreach(sum+=_);
println("sum="+sum)
// 生成元素list,從1到10,不包含11,過慮出偶數,執行結果:List(2, 4, 6, 8, 10)
println(List.range(1, 11).filter { x => x % 2 == 0});
// 過慮data元素長度為5的元素
println(data.filter { str => str.length() ==5 })
2.2 List函式操作(二)
List的partition、find、takeWhile、dropWhile、span、forall、exsists函式操作。
/*
* 分割槽partition
*/
// 按照是否為偶數,分成兩個List,執行結果:(List(2, 4),List(1, 3, 5))
println(List(1,2,3,4,5).partition(_ %2 == 0))
// 返回Option,返回第一個符合的值,沒有符合的值返回None
println(List(1,2,3,4,5,6).find { x => x%2 == 0 })
println(List(1,2,3,4,5).find { x => x <= 0 })
// 根據條件獲取小於4的元素值,並返回List,執行結果:List(1, 2, 3)
println(List(1,2,3,4,5).takeWhile(_<4));
// 最大程度剪下掉符合條件值
println(List(1,2,3,4,5).dropWhile { x => x <4 })
// 符合條件的一部分,不符條件為別外一部分,執行結果:(List(1, 2, 3),List(4, 5))
println(List(1,2,3,4,5).span { x => x < 4 })
def hastotallyZeroRow(m:List[List[Int]]) =
m.exists{
// forall:如果元素都等於0,那麼返回true,否則返回false
row => row forall{x => x == 0}
}
val m = List(List(1,0,0),List(0,1,0),List(0,0,0))
println(hastotallyZeroRow(m));
2.3 List函式操作(三)
List的foldLeft、foldRight、sort函式操作。
def main(args: Array[String]): Unit = {
// foldLeft初始值為:0,從1加到100,執行結果:5050
println((1.to(100).foldLeft(0)(_ + _)));
// 初始值為:0,1-100組成元素的集合,使用相加的函式做為引數傳遞進行相加
println((0 /: (1 to (100)))(_ + _));
// 初始值為:100,每次都相減,計算過程,(1-(2-(3-(4-(5-100))))),執行結果:-97
println((1.to(5)).foldRight(100)(_ - _));
println(((1.to(5)) :\ 100)(_ - _))
/*
* 排序
* 執行結果:List(-3, 1, 2, 4, 6, 8)
* List(8, 6, 4, 2, 1, -3)
*/
println(List(1, 2, -3, 4, 6, 8).sortWith(_ < _));
println(List(1, 2, -3, 4, 6, 8).sortWith(_ > _));
}
2.4 List函式操作(四)
ListBuffer、ArrayBuffer、Queue、Stack函式操作。
def main(args: Array[String]): Unit = {
import scala.collection.mutable.ListBuffer;
val listBuffer = new ListBuffer[Int]();
// 追加元素
listBuffer += 1;
listBuffer += 2;
// 執行結果:ListBuffer(1, 2)
println(listBuffer);
import scala.collection.mutable.ArrayBuffer;
val arrayBuffer = new ArrayBuffer[Int]();
arrayBuffer += 1;
arrayBuffer += 2;
// 執行結果:ArrayBuffer(1, 2)
println(arrayBuffer);
/**
* immutable包中的不可變Queue
*/
import scala.collection.immutable.Queue
val empty = Queue[Int]();
// 加一個元素,Queue本身是不可變的,每次操作都會生成一個新的Queue
val queue1 = empty.enqueue(1);
val queue2 = queue1.enqueue(List(2,3,4,5))
// 執行結果:Queue(1, 2, 3, 4, 5)
println(queue2);
// 將quenue2拆分成兩部分:第一個元素,和剩下的一個元素組成Queue兩部分
val(element,left) = queue2.dequeue
// 執行結果:1:Queue(2, 3, 4, 5)
println(element +":"+left);
/**
* mutable包中的可變Queue
*/
import scala.collection.mutable.Queue
val queue = scala.collection.mutable.Queue[String]();
queue += "a";
// 追加List
queue ++=List("b","c");
// 執行結果:Queue(a, b, c)
println(queue);
// 與不可變的Queue不同,可變的Queue只返回第一個元素,並且把第一個元素從Queue中刪除,執行結果:a
println(queue.dequeue())
// 執行結果:Queue(b, c)
println(queue);
/**
* mutable包中Stack
*/
import scala.collection.mutable.Stack;
val stack = new Stack[Int]();
stack.push(1);
stack.push(2);
stack.push(3);
stack.push(10);
// 返回stack頂元素:10,執行結果:10
println(stack.top);
// 執行結果:Stack(10, 3, 2, 1)
println(stack);
// 返回stack頂元素,且將返stack頂元素進行刪除,執行結果:10
println(stack.pop);
// 執行結果:Stack(3, 2, 1)
println(stack);
}
2.5 List伴生物件函式操作
def main(args: Array[String]): Unit = {
// 生成List物件,執行結果:List(1, 2, 3, 4, 5)
println(List.apply(1, 2, 3, 4, 5))
// 生成1-4List,包前,不包後,執行結果:List(1, 2, 3, 4)
println(List.range(1, 5));
// 生成9-1List,每次步長為-2,執行結果:List(9, 7, 5, 3)
println(List.range(9, 1, -2));
/*
* zip操作與反zip操作,執行結果:
* List((a,1), (b,2), (c,3), (d,4), (e,5), (f,6))
* (List(a, b, c, d, e, f),List(1, 2, 3, 4, 5, 6))
*/
val zipped = "abcdef".toList.zip("123456789").toList
println(zipped);
println(zipped.unzip)
// 將所有的集合中的元素,合成一個大集合,執行結果:List(a, b, c, d, e, f)
println(List(List('a', 'b'), List('c', 'd'), List('e', 'f')).flatten);
// 將集合內容合併,執行結果:List(b, c)
println(List.concat(List(), List('b'), List('c')))
}
--以上為List操作高階進階實戰內容,謝謝大家對我的關注。
——厚積薄發(yuanxw)