當前位置:編程學習大全網 - 源碼下載 - scala groupby按什麽分組的

scala groupby按什麽分組的

項目發我幾乎都用Scala集合及些集合操作由於 Scala 集合操作靈變於剛接觸Scala發者選用何種集合及使用何種集合操作顯合理雖部候都解決問題候並沒選擇優式科合理操作Scala集合使我代碼變更加簡潔高效

Mutable Immutable 集合

Scala 集合類系統區變變集合

scala.collection 包所集合類

scala.collection.mutable 所集合類

變集合顧名思義意味著修改移除或者添加元素

scala.collection.immutable 所集合類

變集合相比變集合變集合永遠改變仍像變集合操作(修改添加刪除某集合元素)變集合些操作每種情況都返新集合同原集合發改變由於特性變集合線程安全Scala默認情況采用變集合所使用優先使用變集合變集合適用於數情況

同集合使用場景

其用集合三種:ListSetMap

列表 List

List 繼承至 Seq集合元素重復

e.g.

scala> val l = List(1, 1, 2, 2, 3, 5)

l: List[Int] = List(1, 1, 2, 2, 3, 5)

所集合內元素重復候選擇 List 或者 Seq

集 Set

Set 元素重復

e.g.

scala> val s = Set(1, 1, 2, 2, 3, 5)

s: scala.collection.immutable.Set[Int] = Set(1, 2, 3, 5)

所集合內元素重復候選擇 Set

映射 Map

Map 元素呈現 key -> value 形式其第參數映射鍵第二參數映射值且Map每元素鍵唯

e.g.

scala> val m = Map(1 -> 1, 1 -> 3, 2 -> 3, 3 -> 4, 4 -> 4, 5 -> 7)

m: scala.collection.immutable.Map[Int,Int] = Map(5 -> 7, 1 -> 3, 2 -> 3, 3 -> 4, 4 -> 4)

所集合元素 key -> value 形式且每元素鍵重復候選擇 Map

集合使用

各集合操作間比較

始介紹同使用場景前我先比同操作同集合所產結何異同

map、filter、collect 比較

//定義列表

scala> val l = List(1, 2, 3, 4, 5)

l: List[Int] = List(1, 2, 3, 4, 5)

//map操作

scala> l.map(_ * 2)

res0: List[Int] = List(2, 4, 6, 8, 10)

//filter操作

scala> l.filter(_ > 2)

res3: List[Int] = List(3, 4, 5)

//collect操作

scala> l.collect {case i if i > 2 => i * 2}

res1: List[Int] = List(6, 8, 10)

通結比我看:

map 操作集合除元素數原集合其都

filter 操作集合原集合集

collect 操作集合雖原集合仔細觀察看 collect 操作結 map 操作結集且元素數 filter 操作集合元素數相同

flatten flatMap 比較

//定義列表

scala> val l = List(List(1, 2, 3), List(4, 5, 6), Seq(7, 8, 9))

l: List[Seq[Int]] = List(List(1, 2, 3), List(4, 5, 6), List(7, 8, 9))

//flatten操作

scala> l.flatten

res5: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9)

//flatMap操作

scala> l.flatMap(i => i.map(_ * 2))

res6: List[Int] = List(2, 4, 6, 8, 10, 12, 14, 16, 18)

通結我看flatten flatMap 都嵌套結構扁平化層集合:

flatten 僅僅嵌套結構扁平化並沒改變原集合內層列表元素值

flatMap 僅嵌套結構扁平化且改變原集合內層列表元素值其實 flatMap flatten 再做 map操作

補充:操作返都批量結要查找某特定元素則采用類比:

filter -> find

collect -> collectFirst

同使用場景

通比我集合用操作結致認識接我看看同場景何科選擇相應集合操作

我先定義些要面場景使用數據結構:

case class Student(

name: String,

age: Int,

sex: String

)

val jilen = Student(

name = "Jilen",

age = 30,

sex = "m"

)

val shaw = Student(

name = "Shaw",

age = 18,

sex = "m"

)

val yison = Student(

name = "Yison",

age = 40,

sex = "f"

)

val l = List(jilen, shaw, yison)

l: List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m), Student(Yison,40,f))

我定義組列表

場景:我要些姓名所組列表

析:姓名所組列表原列表(列表)同全新列表所選用 map

val nameList = l.map(_.name)

nameList: List[String] = List(Jilen, Shaw, Yison)

map 集合每元素應用函數返應用元素所組集合通情況map所返集合原集合同類型集合全新集合

場景二:我要所性別男(m)所組列表

析:列表列表並且該列表原列表集附加條件:男性所選用 filter

val maleList = l.filter(_.sex == "m")

maleList: List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m))

filter 般用於移除集合滿足條件元素返滿足條件元素所組集合

用 collect 解決問題:

val maleList = l.collect{case s if s.sex == "m" => s}

maleList: List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m))

比發現filter更加簡潔

場景三: 我要男姓名所組列表

析:要男姓名我首先要男再獲取些姓名所我容易采用:

val maleNameList = l.filter(_.sex == "m").map(_.name)

maleNameList: List[String] = List(Jilen, Shaw)

通我前各集合操作間比較所結論由於男姓名列表原列表(列表)完全同並且該列表姓名列表集所我采用 collect:

val maleNameList = l.collect{case s if s.sex == "m" => s.name}

maleNameList: List[String] = List(Jilen, Shaw)

結面操作結

collect 接受偏函數集合每元素應用該函數返應用元素所組列表 collect 看作先做 filter 操作再做 map 操作:

場景二 collect 操作看作:

l.filter(_.sex == "m").map(s => s)

List[Student] = List(Student(Jilen,30,m), Student(Shaw,18,m))

其用

場景四:現我要每列表位置便給編號

析:我采用 -> 編號 形式組織與編號前關系我采用 zipWithIndex:

l.zipWithIndex

List[(Student, Int)] = List((Student(Jilen,30,m),0), (Student(Shaw,18,m),1),(Student(Yison,40,f),2))

zipWithIndex 集合內元素與該元素集合位置組合起其實集合內元素與該元素位置組元組元組第二值元素集合所處位置

場景五:現要男組男組集合組集合

析:根據場景描述新集合內元素應該:sex -> List[Student]形式我采用:groupBy:

val group = l.groupBy(_.sex)

group: scala.collection.immutable.Map[String,List[Student]] = Map(m -> List(Student(Jilen,30,m), Student(Shaw,18,m)), f -> List(Student(Yison,40,f)))

groupBy 集合按照特定要求進行組返 Map類型

  • 上一篇:網絡直播聊天室源代碼
  • 下一篇:android怎麽獲取網頁數據
  • copyright 2024編程學習大全網