Scala學習進擊Spark(五): Scala集合
陣列
不可變陣列:
object ArrayApp extends App { val a = new Array[String](5) println(a.length) a(1) = "hello" foreachList(a) println() val b = Array("hadoop","spark","hive") foreachList(b) val c = Array(1,2,3,4,5,6,7,8) println("max="+c.max+ " min="+c.min+ " sum="+c.sum) println(c.mkString(" ")) println(c.mkString("<"," ",">")) def foreachList(list: Array[String]): Unit ={ for (i <- list){ print(i+ " ") } } }
可變陣列
val d = scala.collection.mutable.ArrayBuffer[Int]() d+=1 d+=2 d+=(3,4,5)//可以加多個 d++=Array(6,7,8)//兩個+加一個數組 d.insert(0,0)//指定位置插入 d.remove(1)//移除索引資料 d.trimEnd(2)//倒敘刪除 println(d) for(i <- 0.until(d.length)){ print(i+" ") } println() for(ele <-d){ print(ele+" ") } println() for(i <- 0.until(d.length).reverse){//反序遍歷 print(i+" ") }
list
NIL為不可變的list
object ListApp extends App { val list = List(1,2,3,4,5) println(list) //List(1, 2, 3, 4, 5) println(list.head)//1,第一個元素 println(list.tail)//List(2, 3, 4, 5),除第一個外都是tail val list1 = 1::Nil //為定長的list println(list1) val list2 = scala.collection.mutable.ListBuffer[Int]()//可變list list2+=1 list2+=(2,3,4,5) list2++=List(6,6,7) list2-=2 list2--=List(5,6) list2.toArray //轉成陣列 list2.toList //轉成定長list list2.isEmpty //是否為空 list2.head //頭元素 } //遞迴求和 def sum(nums:Int*):Int={ if(nums.length==0){ 0 }else{ nums.head + sum(nums.tail:_*) } } println(sum()) println(sum(1,2,3,4))
set
可變set:scala.collection.mutable.Set
用法與list一樣 資料不重複
Map
Map(對映)是一種可迭代的鍵值對(key/value)結構。
所有的值都可以通過鍵來獲取。
Map 中的鍵都是唯一的。
Map 也叫雜湊表(Hash tables)。
Map 有兩種型別,可變與不可變,區別在於可變物件可以修改它,而不可變物件不可以。
預設情況下 Scala 使用不可變 Map。如果你需要使用可變集合,你需要顯式的引入 import scala.collection.mutable.Map 類
在 Scala 中 你可以同時使用可變與不可變 Map,不可變的直接使用 Map,可變的使用 mutable.Map。以下例項演示了不可變 Map 的應用:
// 空雜湊表,鍵為字串,值為整型
var A:Map[Char,Int] = Map()
// Map 鍵值對演示
val colors = Map(“red” -> “#FF0000”, “azure” -> “#F0FFFF”)
定義 Map 時,需要為鍵值對定義型別。如果需要新增 key-value 對,可以使用 + 號,如下所示:
A += (‘I’ -> 1)
A += (‘J’ -> 5)
A += (‘K’ -> 10)
A += (‘L’ -> 100)
object Test {
def main(args: Array[String]) {
val colors = Map("red" -> "#FF0000",
"azure" -> "#F0FFFF",
"peru" -> "#CD853F")
val nums: Map[Int, Int] = Map()
println( "colors 中的鍵為 : " + colors.keys )
println( "colors 中的值為 : " + colors.values )
println( "檢測 colors 是否為空 : " + colors.isEmpty )
println( "檢測 nums 是否為空 : " + nums.isEmpty )
}
}
keys 返回 Map 所有的鍵(key)
values 返回 Map 所有的值(value)
isEmpty 在 Map 為空時返回true
Map 合併
你可以使用 ++ 運算子或 Map.++() 方法來連線兩個 Map,Map 合併時會移除重複的 key。以下演示了兩個 Map 合併的例項:
object Test {
def main(args: Array[String]) {
val colors1 = Map(“red” -> “#FF0000”,
“azure” -> “#F0FFFF”,
“peru” -> “#CD853F”)
val colors2 = Map(“blue” -> “#0033FF”,
“yellow” -> “#FFFF00”,
“red” -> “#FF0000”)
// ++ 作為運算子
var colors = colors1 ++ colors2
println( "colors1 ++ colors2 : " + colors )
// ++ 作為方法
colors = colors1.++(colors2)
println( "colors1.++(colors2)) : " + colors )
}
}
執行以上程式碼,輸出結果為:
$ scalac Test.scala
$ scala Test
colors1 ++ colors2 : Map(blue -> #0033FF, azure -> #F0FFFF, peru -> #CD853F, yellow -> #FFFF00, red -> #FF0000)
colors1.++(colors2)) : Map(blue -> #0033FF, azure -> #F0FFFF, peru -> #CD853F, yellow -> #FFFF00, red -> #FF0000)
輸出 Map 的 keys 和 values
以下通過 foreach 迴圈輸出 Map 中的 keys 和 values:
sites.keys.foreach{ i =>
print( "Key = " + i )
println(" Value = " + sites(i) )}
}
}
檢視 Map 中是否存在指定的 Key
你可以使用 Map.contains 方法來檢視 Map 中是否存在指定的 Key。例項如下:
if( sites.contains( "runoob" )){
println("runoob 鍵存在,對應的值為 :" + sites("runoob"))
}else{
println("runoob 鍵不存在")
}
if( sites.contains( "baidu" )){
println("baidu 鍵存在,對應的值為 :" + sites("baidu"))
}else{
println("baidu 鍵不存在")
}
if( sites.contains( "google" )){
println("google 鍵存在,對應的值為 :" + sites("google"))
}else{
println("google 鍵不存在")
}
}
}
執行以上程式碼,輸出結果為:
$ scalac Test.scala
$ scala Test
runoob 鍵存在,對應的值為 :http://www.runoob.com
baidu 鍵存在,對應的值為 :http://www.baidu.com
google 鍵不存在
option&Some&None
Option型別代表任意的值,多用在集合操作中,它可以儲存任意型別的值,Option例項就是Some或者None物件例項,Some和None都是它的子類,他們都是final類,所以不能再有派生子類了
Option型別資料可以使用大部分的集合操作,可參考 Array(集合、序列)
Option資料存取其實是對Some物件的操作,看下面程式碼
val a = Array(10,20,"30","40")
val b = a.lastOption
println(b) // Some(40)
a是一個集合,lastOption返回最後一個Option型別物件,lastOption的程式碼在TraversableLike.scala中
def lastOption: Option[A] = if (isEmpty) None else Some(last)
last方法
def last: A = {
var lst = head
for (x <- this)
lst = x
lst
}
head方法
def head: A = {
var result: () => A = () => throw new NoSuchElementException
breakable {
for (x <- this) {
result = () => x
break
}
}
result()
}
lastOption方法中將通過last取到的最後一個元素轉換為Some型別了,Some是Option的子類,所以返回結果是Option型別,那看看Some的程式碼
final case class Some[+A](x: A) extends Option[A] {
def isEmpty = false
def get = x
}
它實現了Option的get介面
def get: A
返回了傳入的引數 x,所以如果我們遇到Option型別物件,就可以通過它的get方法取得實際元素的值,如:
a.lastOption.get
除了Some型別外,如果集合中是空的,那麼操作返回None型別
case object None extends Option[Nothing] {
def isEmpty = true
def get = throw new NoSuchElementException("None.get")
}
比如Option中的map方法
@inline final def map[B](f: A => B): Option[B] =
if (isEmpty) None else Some(f(this.get))
也就是Option型別只會返回Some或None型別物件
Tuple
object MapTest {
def main(args: Array[String]): Unit = {
// 元組:Tuple,就是由()包起來,和資料庫中一條記錄概念類似
val t1 = (1,2)
println(t1)
println(t1._1) // 獲取tuple第一個元素
println(t1._2) // 獲取tuple第二個元素
val t2 = (1,"xiaoming","男",23,"高新區")
println(t2)
val a = List(1,2,3,4)
// Tuple舉列:求List中a的長度,元素求和,元素的平方和
// 設計成一個tuple(長度, 元素求和, 元素平方和)
def sumSq(in:List[Int]):(Int,Int,Int) = in.foldLeft((0,0,0))((t,v) => (t._1+1,t._2+v,t._3+v*v))
println(sumSq(a))
// Map<K,V>
val map1 = Map(1 -> "david", 3 -> "lisa")
println(map1(1)) // 根據key獲取value
println(map1(3)) // 根據key獲取value
println(map1.contains(1)) // 判斷Map中包含某個元素
println(map1.keys) // 獲取map中所有的key
println(map1.values) // 獲取map中所有的values
map1 + (2 -> "xiaoming") // 向map中新增一個元素
map1 - 3 // 向map中刪除一個元素
map1 ++ List(4 -> "xiaohuang",5 -> "xiaoliu") // 向map新增多個元素
map1 -- List(1,2) // 向map刪除多個元素
}
相關推薦
Scala學習進擊Spark(五): Scala集合
陣列 不可變陣列: object ArrayApp extends App { val a = new Array[String](5) println(a.length) a(1) = "hello" foreachList(a) pr
Scala學習進擊Spark(二):Scala入門
一:val vs var val :為一個值,不能重新賦值 與java中 final修飾的變數相同 使用方法: val 值名稱:型別 = xxx (:型別可以省略) var 為一個變數 var 值名稱:型別 = xxx 日常使用中優先使用val 二
Scala學習筆記(五)—— 對映、元祖、集合
1. 對映 對映Java中的Map,即Key/Value的資料形式 對映的建立,有以下兩種方法 1 scala> val map =Map("Lisa" -> 90 , "Hellen" -> 89) 2 map: scala.collection.immutabl
Scala 學習 進擊大資料Spark生態圈----個人筆記
學習Scala 進擊大資料Spark生態圈 總結: 第一章: 簡單講解了一下Scala的優劣勢 第二章: val:常量(值) 會自動生成get方法 var: 變數 自動生成get/set方法 lazy屬性是遇到Action
Scala學習第十五天 Scala多重繼承、多重繼承構造器執行順序及AOP實現
1、這講內容對做大型專案十分重要,trait本身可以有方法的實現,這樣做大型工程的具體模組時,可以讓這個模組混入很多不同trait,以實現這個模組功能的不同方面。 2、 PianoTeacher的構造順序是由左往右構造的,但是已經構造了父類,後面子類的父類不會
python學習筆記(五)集合(set)
set 擁有類似 dict 的特點:可以用{}花括號來定義;其中的元素沒有序列,也就是是非序列型別的資料;而且,set 中的元素不可重複,這就類似 dict 的鍵. set 也有一點 list 的特點:有一種集合可以原處修改. 下面通過實驗,進一步理解建立 set 的方法:
Scala學習(九)Scala的泛型、上界、下屆
一、泛型(1)泛型的介紹泛型用於指定方法或類可以接受任意型別引數,引數在實際使用時才被確定,泛型可以有效地增強程式的適用性,使用泛型可以使得類或方法具有更強的通用性。泛型的典型應用場景是集合及集合中的方法引數,可以說同java一樣,scala中泛型無處不在,具體可以檢視sca
Spark基礎-scala學習(五、集合)
cti dset 函數式 hashset trees 不可變 buffer you als 集合 scala的集合體系結構 List LinkedList Set 集合的函數式編程 函數式編程綜合案例:統計多個文本內的單詞總數 scala的集合體系結構 scala中的
學習Scala 進擊大資料Spark生態圈 進擊Spark生態圈必備視訊教程
大資料如火如荼,如果你想深入學習大資料,Scala是你必學必會的內容,這將是你成為“高薪”程式設計師的起點,關於Scala的介紹、課程很多,但能做到如此聚焦生產真實應用的課程鳳毛麟角,所以,你千萬不能錯過 ----------------------課程目錄---------------
Scala 學習筆記之集合(2)
元素 student cnblogs cti 使用 shanghai 列表 學習筆記 brush class StudentTT extends StudentT{ def sayBye(name: String, age: Int)(address: String)
Scala 學習筆記之集合(7) Option
bject fin pre object c cti abc collect 結果 == object CollectionDemo8 { def main(args: Array[String]): Unit = { //Option集合的使用,可以用來安全
Scala 學習筆記之集合(9) 集合常用操作匯總
lis cti ring 結果 ray 常用操作 light logs bject object CollectionDemo10 { def main(args: Array[String]): Unit = { var ls = List[Int](1,
Scala學習筆記一之基礎語法,條件控制,循環控制,函數,數組,集合
new 增強 指定位置 因此 手動 tex class break 減少 前言:Scala的安裝教程:http://www.cnblogs.com/biehongli/p/8065679.html 1:Scala之基礎語法學習筆記: 1:聲明val變量:可以使用va
Scala學習之路 (一)Spark初識
海量 處理 apache .org 流式 height 計算平臺 提高 結構化數據 一、官網介紹 官網地址:http://spark.apache.org/ Apache Spark™是用於大規模數據處理的統一分析引擎。 從右側最後一條新聞看,Spar
Scala學習(三)——集合
創建 trait while unit some otto 快捷 對象 theme 基本數據結構 Scala提供了一些不錯的集合。 數組 Array 數組是有序的,可以包含重復項,並且可變。 val numbers = Array(1, 2, 3, 4
[scala]學習筆記三——集合
一、Array 1.定長陣列的定義: ①一種方式:給出長度 scala> val a=new Array[String](5) a: Array[String] = Array(null, null, null, null, null) //null是String型別的預
[Scala]學習筆記五——隱式轉換
隱式轉換:為一個已經存在的東西,新增一個功能需求(比如:為一個已經存在的類新增一個新的方法) 滿足上述需求,Java使用的是動態管理,Scala使用的是隱式轉換 一個例子: //定義了兩個類Man和Superman,現在的需求是Man的物件也可以擁有fly()方法 object I
Scala學習 --------- Scala中集合體系總結
A、集合體系總結 a、集合是一種用來儲存各種物件和資料的容器 b、Scala 集合分為可變的和不可變的集合。 可變集合可以在適當的地方被更新或擴充套件。這意味著你可以修改,新增,移除一個集合的元素。 不可變集合類,相比之下,永遠不會改變。不過,你仍然可以模擬新增,移除或更新操作。
Scala學習 --------- 集合(Set)
Set集合:不重複元素的集合 4.5.1. 可變Set集合 建立可變集合 向Set集合中追加元素 += 追加元素 add方法追加元素 ++= 追加一個Set集合 向Set集合刪除元素 -= 刪除一個元素
Spark基礎-scala學習(一)
fromfile read ddl 循環 new n-2 大量 cal 與操作 Scala解析器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)->Loop(循環)。scala解析器也被稱為REPL,會快速編譯