272. 最長公共上升子序列
阿新 • • 發佈:2022-03-02
Scala集合
目錄list: 有序不唯一(有序:指的是插入順序)
set : 無序唯一
map: kv結構
tuple: 固定長度的集合
一、List集合
scala中的list 相對於Java,提供了很多實用的方法
list set map array 都有以下方法 * map * flatMap * filter * foreach * groupBy set 集合不能排序, set map 不能反轉
1、不可變List
不可變List:不能夠對原集合增刪元素
List集合的基礎方法
package com.shujia.scala object Demo19List { def main(args: Array[String]): Unit = { //定義一個list集合 val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9) //獲取第一個元素 println(list.head) //1 //獲取不包含第一個元素的所有元素 println(list.tail) //List(2, 3, 4, 5, 6, 7, 8, 9) //獲取最後一個元素 println(list.last) //9 //獲取前三個元素(從左邊取topn) println(list.take(3)) // List(1, 2, 3) //獲取後三個元素(從右邊取topn) println(list.takeRight(3)) //List(7, 8, 9) //通過下標獲取元素 println(list(2)) //3 //通過一個分隔符將集合拼接成一個字串(與split功能相反) println(list.mkString("|")) // 1|2|3|4|5|6|7|8|9 println(list.sum) //求和 println(list.max) //獲取最大值 println(list.min) //獲取最小值 //獲取平均值(要轉換為double型別) println(list.sum / list.length.toDouble) //5.0 val list2 = List(1, 2, 3, 4, 5, 3, 2, 1) //去重,返回一個新的集合 println(list2.distinct) //List(1, 2, 3, 4, 5) //反轉集合 println(list.reverse) //List(9, 8, 7, 6, 5, 4, 3, 2, 1) //刪除一個元素,不改變原集合 println(list.drop(1)) //List(2, 3, 4, 5, 6, 7, 8, 9) } }
List集合的高階方法:foreach、map、sort、flatMap
- foreach
package com.shujia.scala object Demo19List { def main(args: Array[String]): Unit = { //定義一個list集合 val list = List(1, 2, 3, 4, 5, 6, 7, 8, 9) /** * foreach: 迴圈集合中元素,一個一個傳遞給後面的函式 */ var sum = 0 list.foreach(i => { sum += i }) println(sum) //45 } }
- map
/**
* map :迴圈集合中的元素一個一個傳遞給後面的函式,
* 最後將函式的返回值構建成一個新的集合返回
*/
val list2: List[Int] = list.map((i: Int) => i + 2)
println(list2) //List(3, 4, 5, 6, 7, 8, 9, 10, 11)
//改變集合中所有元素的型別
//將集合中元素的型別轉換為String型別(有返回值)
val strs: List[String] = list.map((i: Int) => i.toString + "a")
println(strs) //List(1a, 2a, 3a, 4a, 5a, 6a, 7a, 8a, 9a)
- sort
/**
* sort排序(預設是升序)
* (1)sortBy: 通過一個欄位進行排序(引數是個函式)
* (2)sortWith: 指定一個排序規則(引數是指定規則),返回一個集合
*/
val list3 = List(2, 5, 1, 6, 2, 1, 3, 4)
//將集合元素排序
val sortList: List[Int] = list3.sortBy((i: Int) => i)
println(sortList) //List(1, 1, 2, 2, 3, 4, 5, 6)
//sortWith: 指定一個排序規則(引數是指定規則),返回一個集合
//升序
val sortList2: List[Int] = list.sortWith((i: Int, j: Int) => i < j)
println(sortList2) //List(1, 2, 3, 4, 5, 6, 7, 8, 9)
//降序
val sortList3: List[Int] = list.sortWith((i: Int, j: Int) => i > j)
println(sortList3) //List(9, 8, 7, 6, 5, 4, 3, 2, 1)
sortBy應用舉例
/**
* 讀取學生資料,按照年齡排序
*/
//讀取檔案.獲取行資料.轉成集合
val students: List[String] = Source.fromFile("data/students.txt").getLines().toList
println(students)
//List(1500100001,施笑槐,22,女,文科六班, 1500100002,呂金鵬,24,男,文科六班...)
//按年齡排序(預設是升序)
//stu.split(",")(2).toInt:按照逗號切分,獲取年齡並轉換為Int型別
val studentSort: List[String] = students.sortBy((stu: String) => stu.split(",")(2).toInt)
studentSort.foreach(println)
//執行結果:
...
1500100985,申飛珍,21,女,文科一班
1500100993,衡從蕾,21,女,理科二班
1500100997,陶敬曦,21,男,理科六班
1500100001,施笑槐,22,女,文科六班
1500100003,單樂蕊,22,女,理科六班
1500100005,宣谷芹,22,女,理科五班
1500100008,符半雙,22,女,理科六班
1500100021,連鴻暉,22,男,理科六班
1500100024,湛慕卉,22,女,文科二班
...
//如果想要排序為降序,-stu.split(",")(2).toInt,前面加個負號即可
-
flatMap
map:進來一行,返回一行
flatMap:進來一行,返回多行(炸開後返回)
//定義一個集合
val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")
println(lines)
//List(java,spark, java,hadoop, java,scala,hive, bhase,hadoop,scala)
lines.foreach(println)
//結果
java,spark
java,hadoop
java,scala,hive
bhase,hadoop,scala
獲取集合中的每一個單詞,一個單詞一行(Java的方式)
//Java的方式
for (line <- lines) {
val arr: Array[String] = line.split(",") //逗號分隔,返回一個數組
//遍歷陣列
for (word <- arr) {
println(word)
}
}
//執行結果:
java
spark
java
hadoop
java
scala
hive
bhase
hadoop
scala
獲取集合中的每一個單詞,一個單詞一行(陣列形式)
//定義一個集合
val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")
//建立一個數組
val words = new util.ArrayList[String]()
for (line <- lines) {
val split: Array[String] = line.split(",")
for (word <- split) {
words.add(word) //將遍歷出來的單詞新增到陣列
}
}
println(words)
//[java, spark, java, hadoop, java, scala, hive, bhase, hadoop, scala]
獲取集合中的每一個單詞,一個單詞一行(Scala形式)
flatMap: 將集合中的元素一個一個傳遞給後面的函式,傳入一行返回多行
flatMap 分兩步
1、先進行一次map操作
2、將函式返回的陣列拆分出來,構建成一個新的集合
//定義一個集合
val lines = List("java,spark", "java,hadoop", "java,scala,hive", "bhase,hadoop,scala")
val words2: List[String] = lines.flatMap((line: String) => line.split(","))
println(words2)
//List(java, spark, java, hadoop, java, scala, hive, bhase, hadoop, scala)
2、可變List----ListBuffer
object Demo19List {
def main(args: Array[String]): Unit = {
//建立一個可變的List集合(ListBuffer)
val listBuffer = new ListBuffer[String]()
//增加元素
listBuffer += "java"
println(listBuffer) //ListBuffer(java)
//增加多個元素
listBuffer ++= List("scala", "hadoop", "java")
println(listBuffer)//ListBuffer(java, scala, hadoop, java)
//刪除一個元素
listBuffer -= "java"
println(listBuffer)//ListBuffer(scala, hadoop, java)
//刪除多個元素
listBuffer --= List("hadoop", "scala")
println(listBuffer)//ListBuffer(java)
//通過下標修改元素
listBuffer.update(0, "hadoop")
println(listBuffer)//ListBuffer(hadoop)
//通過下標刪除元素
listBuffer.remove(0)
println(listBuffer)//ListBuffer()
}
}
二、Set集合
1、不可變set
package com.shujia.scala
object Demo20 {
def main(args: Array[String]): Unit = {
//定義一個set集合
val set = Set(1, 2, 3, 4, 5, 6, 7, 8, 1, 2)
println(set) //Set(5, 1, 6, 2, 7, 3, 8, 4),自動去重,排列無序
//常用方法(Set集合沒有元素反轉方法,List集合有)
println(set.head) //5
println(set.tail) //Set(1, 6, 2, 7, 3, 8, 4)
println(set.last) //4
println(set.sum) //36
println(set.max) //8
println(set.min) //1
/**
* filter: 過濾
* 將集合中的元素一個一個傳遞給後面的函式,
* 函式返回true保留資料,函式返回false過濾資料。
* (這個方法List集合也有)
*/
//取出集合中的奇數
val filterSet: Set[Int] = set.filter((i: Int) => i % 2 == 1)
println(filterSet) //Set(5, 1, 7, 3)
/**
* 交集 &
* 並集 |
* 差集 &~
* List集合無該方法
*/
val s1 = Set(1, 2, 3, 4, 5, 6)
val s2 = Set(3, 4, 5, 6, 7, 8, 9)
println(s1 & s2) //Set(5, 6, 3, 4)
println(s1 | s2) //Set(5, 1, 6, 9, 2, 7, 3, 8, 4)
println(s1 &~ s2) //Set(1, 2)
}
}
2、可變set----HashSet
可變set:可以對原集合裡的元素進行增刪改
object Demo20 {
def main(args: Array[String]): Unit = {
//建立一個可變的set集合(HashSet)
val hashSet = new mutable.HashSet[String]()
//增加元素的兩種方式
hashSet.add("java")
hashSet += "scala"
println(hashSet) //Set(java, scala)
//移除元素的兩種方式
hashSet.remove("java")
hashSet -= "scala"
println(hashSet) //Set()
//可變集合轉換成不可變集合
val set2: Set[String] = hashSet.toSet
}
}