1. 程式人生 > 其它 >272. 最長公共上升子序列

272. 最長公共上升子序列

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
  }
}