Scala入門學習筆記【list練習題】
阿新 • • 發佈:2018-12-25
object Hello_List { def main(args: Array[String]): Unit = { //建立一個List val lst0 = List(1,7,9,8,0,3,5,4,6,2) // 1.將lst0中每個元素乘以10後生成一個新的集合 val list1=lst0.map(_*10) //map是一個方法,裡邊傳一個簡化的函式 println(list1) // 2.將lst0中的偶數取出來生成一個新的集合 val list2=lst0.filter(_%2==0) //符合條件的留下 println(list2) // 3.將lst0排序後生成一個新的集合 val list3=lst0.sorted println(list3) // 4.反轉順序 val list4=lst0.sorted.reverse println(list4) // 5. 將lst0中的元素4個一組,型別為Iterator[List[Int]] val list5=lst0.grouped(4) println(list5)//list5是一個型別為Iterator[List[Int]]的迭代器 值為:non-empty iterator /* 把一個迭代器執行toList時候就相當於把迭代器的指標指向末尾了 */ //println(list5.toList) //List(List(1, 7, 9, 8), List(0, 3, 5, 4), List(6, 2)) println(list5.toList) println(list5)//empty iterator // 6.將Iterator轉換成List val list6=lst0.grouped(4) println(list6.toList) //List(List(1, 7, 9, 8), List(0, 3, 5, 4), List(6, 2)) //7. map 和foreach區別 /* map和foreach都是可以對每一個元素操作,但是map是對每一個元素操作完了還會返回一個新的集合 而foreach則不會返回任何值 */ val arr=Array(1,2,3,4) print(arr.map(println )) print(arr.foreach(x=>println(x))) //8.將List壓平 意思是說List裡邊套著很多List,壓平之後就剩下外邊的一個List //8.1首先準備一個list套list的資料結構 val list8=lst0.grouped(4) println(list8) //non-empty iterator val list8_1=list8.toList println(list8_1) //List(List(1, 7, 9, 8), List(0, 3, 5, 4), List(6, 2)) //8.2壓平 val list8_2=list8_1.flatten println(list8_2) //List(1, 7, 9, 8, 0, 3, 5, 4, 6, 2) //map是輸出結果再儲存到一個集合裡邊 //foreach是對每一個元素進行操作並輸出 //將多個list壓扁成一個List val lines = List("hello tom hello jerry", "hello jerry", "hello kitty") println(lines.flatMap(_.split(" "))) //List(hello, tom, hello, jerry, hello, jerry, hello, kitty) //flatMap中的_表示一行內容 hello tom hello jerry 一共有三行 即對每行操作 //flatMap(_.split(" ")) 中的_.split(" ") 就相當於"hello tom hello jerry".split(" ") println(lines.flatMap(_.split(" ")).map((_ ,1))) //List((hello,1), (tom,1), (hello,1), (jerry,1), (hello,1), (jerry,1), (hello,1), (kitty,1)) //返回的List集合,集合裡邊每一個元素為元組 訪問元組的第一個元素為_._1 //例如:println((""hello",1)._1) 結果為hello //lines.flatMap(_.split(" ")).map((_ ,1))中的map((_ ,1) _表示每一個單詞,1表示每出現一次計數為1 println(lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1)) //Map(tom -> List((tom,1)), kitty -> List((kitty,1)), jerry -> List((jerry,1), (jerry,1)), hello -> List((hello,1), (hello,1), (hello,1), (hello,1))) // lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1)中的groupBy(_._1)表示按照list中每個元組中的第一個欄位分組即拿第一個欄位作為key,返回結果是一個大Map //groupBy(_._1)中的第一個_表示list中的每一個元組,而 ._1 表示取每一個元組中的第一個元素 println(lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2))) //Map(tom -> 1, kitty -> 1, jerry -> 2, hello -> 4) // lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1).mapValues()中的mapValues()僅僅會對value處理,處理完了把key 結合起來 // mapValues()中的第一個_表示map裡邊的value ,而value是一個list //lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)) 中的foldLeft(0)是給一個初始值 // (_+_._2)中的第一個_表示初始值或者累加過的值,第二個_表示List裡邊的元組,._2表示拿到元組中的第二個欄位 println(lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)).toList) // List((tom,1), (kitty,1), (jerry,2), (hello,4)) // 轉化為List println(lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)).toList.sortBy(_._2)) //List((tom,1), (kitty,1), (jerry,2), (hello,4)) //sortBy(_._2)中的第一個_ 表示每一個元組,第二個._2 每個元組中的第二個欄位 println(lines.flatMap(_.split(" ")).map((_ ,1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)).toList.sortBy(_._2).reverse) //List((hello,4), (jerry,2), (kitty,1), (tom,1)) //reverse表示降序排序 //先按空格切分,在壓平 //平行計算求和 println(lst0.par.sum)//45 並行求和 println(lst0.par.reduce(_+_))//45 並行求和 //lst0.par表示並行,根據CPU合數決定 //化簡:reduce //將非特定順序的二元操作應用到所有元素 //安裝特點的順序 //摺疊:有初始值(無特定順序) println(lst0.par.fold(0)(_+_)) //45 println(lst0.par.fold(10)(_+_))//125 //摺疊:有初始值(有特定順序) println(lst0.foldLeft(0)(_+_)) //聚合 aggregate val arr1 = List(List(1, 2, 3), List(3, 4, 5), List(2), List(0)) println(arr1.aggregate(0)(_+_.sum,_+_))// 先區域性求和,在整體求和 val l1 = List(5,6,4,7) val l2 = List(1,2,3,4) //求並集 println(ll.union(l2)) //求交集 println(ll.intersect(l2)) // //求差集 println(ll.diff(l2)) //println(r3) /*val lines = List("hello tom hello jerry", "hello jerry", "hello kitty") lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).mapValues(_.foldLeft(0)(_+_._2)) lines.flatMap(_.split(" ")).map((_, 1)).groupBy(_._1).map(t=>(t._1, t._2.size)).toList.sortBy(_._2).reverse*/ } }