1.3 Scala的數(shù)據(jù)結(jié)構(gòu)
對(duì)于每一門編程語(yǔ)言來(lái)說,數(shù)組(Array)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,主要用來(lái)存儲(chǔ)數(shù)據(jù)類型相同的元素。Scala中的數(shù)組分為定長(zhǎng)數(shù)組和變長(zhǎng)數(shù)組,定義定長(zhǎng)數(shù)組,需要使用new關(guān)鍵字,而定義變長(zhǎng)數(shù)組時(shí),則需要導(dǎo)包
import scala.collection.mutable.ArrayBuffer
。
1.3.1 數(shù)組
數(shù)組(Array)主要用來(lái)存儲(chǔ)數(shù)據(jù)類型是每個(gè)人元素。
-
數(shù)組定義與使用
Scala中的數(shù)組分為定長(zhǎng)數(shù)組和變長(zhǎng)數(shù)組,這兩種數(shù)組的定義方式如下: -
定義定長(zhǎng)數(shù)組
New Array[T] (數(shù)組長(zhǎng)度) //定義定長(zhǎng)數(shù)組 -
定義變長(zhǎng)數(shù)組
ArrayBufferT //定義變長(zhǎng)數(shù)組
注:定義定長(zhǎng)數(shù)組,需要使用new關(guān)鍵字,而定義變長(zhǎng)數(shù)組時(shí),則需要導(dǎo)包import scala.collection.mutable.ArrayBuffer。
下面,通過一個(gè)例子來(lái)演示Scala數(shù)組簡(jiǎn)單使用,具體代碼如下所示。
package cn.itcast.scala
import scala.collection.mutable.ArrayBuffer
object Ch01_ArrayDemo {
def main(args: Array[String]): Unit = {
//定義定長(zhǎng)數(shù)組:定義長(zhǎng)度為8的定長(zhǎng)數(shù)組,數(shù)組中的每個(gè)元素初始化為0
val arr1 = new Array[Int](8)
//打印數(shù)組,內(nèi)容是數(shù)組的hashcode值
println(arr1)
//定義變長(zhǎng)數(shù)組(數(shù)組緩沖),需要導(dǎo)入包:import scala.collection.mutable.ArrayBuffer
val arr2 = ArrayBuffer[Int]()
//向變長(zhǎng)數(shù)組中追加元素
arr2 += 1
//打印變長(zhǎng)數(shù)組
println(arr2)
//向變長(zhǎng)數(shù)組中追加多個(gè)元素
arr2 += (2,3,4,5)
println(arr2)
//追加一個(gè)定長(zhǎng)數(shù)組
arr2 ++= Array(6,7)
println(arr2)
//追加一個(gè)變長(zhǎng)數(shù)組(數(shù)組緩沖)
arr2 ++= ArrayBuffer(8,9)
println(arr2)
//在變長(zhǎng)數(shù)組的某個(gè)位置插入元素
arr2.insert(0,-1,0)
println(arr2)
//刪除數(shù)組的某個(gè)元素
arr2.remove(0)
println(arr2)
}
}
數(shù)組的遍歷
Scala中,如果想要獲取數(shù)組中的每一個(gè)元素,則需要將數(shù)組進(jìn)行遍歷操作。代碼如下:
package cn.itcast.scala
object Ch02_ArrayTraversal {
def main(args: Array[String]): Unit = {
//定義定長(zhǎng)數(shù)組
//val array = new Array[Int](8) //方式1
val myArr = Array(1.9, 2.9, 3.4, 3.5) //方式2
//打印輸出數(shù)組中的所有元素
for(x<-myArr){
print(x+" ")
}
println()
//計(jì)算數(shù)組中所有元素的和
var total = 0.0
for(i <- 0 to (myArr.length-1)){
total += myArr(i)
}
println("總和為:"+total)
//查找數(shù)組中的最大值
var max = myArr(0)
for(i <- 1 to (myArr.length-1)){
if(max < myArr(i)){
max = myArr(i)
}
}
println("最大值為:"+max)
}
}
數(shù)組轉(zhuǎn)換
數(shù)組轉(zhuǎn)換就是通過yield關(guān)鍵字將原始的數(shù)組進(jìn)行轉(zhuǎn)換,會(huì)產(chǎn)生一個(gè)新的數(shù)組,然而原始的數(shù)組保持不變。定義一個(gè)數(shù)組,實(shí)現(xiàn)將偶數(shù)取出乘以10后生成一個(gè)新的數(shù)組,具體代碼如下所示:
package cn.itcast.scala
object Ch03_ArrayYieldTest {
def main(args: Array[String]): Unit = {
//定義一個(gè)數(shù)組
var arr = Array(1,2,3,4,5,6,7,8,9)
//將偶數(shù)取出乘以10后再生成一個(gè)新的數(shù)組
val newArr = for (e <- arr if e%2 == 0) yield e * 10
println(newArr.toBuffer) //將定長(zhǎng)數(shù)組轉(zhuǎn)為變長(zhǎng)數(shù)組
}
}
1.3.2 元組
Scala的元組是對(duì)多個(gè)不同類型對(duì)象的一種簡(jiǎn)單封裝,它將不同的值用小括號(hào)括起來(lái),并用逗號(hào)作分隔,即表示元組。
創(chuàng)建元組
創(chuàng)建元組的語(yǔ)法格式如下:
val tuple=(元素,元素...)
下面,通過簡(jiǎn)單的例子進(jìn)行演示創(chuàng)建元組,例如:創(chuàng)建一個(gè)包含String類型、Double類型以及Int類型的元組,具體代碼如下:
scala> val tuple = ("itcast",3.14,65535)
tuple: (String, Double, Int) = (itcast,3.14,65535)
獲取元組中的值
在Scala中,獲取元組中的值是通過下劃線加腳標(biāo)(例如:tuple._1,tuple._2)來(lái)獲取的,元組中的元素腳標(biāo)是從1開始的。代碼如下:
scala> tuple._1 # 獲取第一個(gè)值
res0: String = itcast
scala> tuple._2 # 獲取第一個(gè)值
res1: Double = 3.14
拉鏈操作
在Scala的元組中,可以通過使用“zip”命令將多個(gè)值綁定在一起。例如,定義兩個(gè)數(shù)組,分別是score和names,將這兩個(gè)數(shù)組捆綁在一起,具體代碼如下:
scala> val scores = Array(88,95,80)
scores: Array[Int] = Array(88, 95, 80)
scala> val names =Array("zhangsan","lisi","wangwu")
names: Array[String] = Array(zhangsan, lisi, wangwu)
scala> names.zip(scores)
res2: Array[(String, Int)] = Array((zhangsan,88), (lisi,95), (wangwu,80))
注:當(dāng)兩個(gè)數(shù)組個(gè)數(shù)不等時(shí),會(huì)自動(dòng)適配較短長(zhǎng)度,多余元素?zé)o相應(yīng)匹配元素會(huì)被自動(dòng)拋棄。
1.3.3 集合
在Scala中,集合有三大類: List、Set以及Map,所有的集合都擴(kuò)展自Iterable特質(zhì)。
Scala 集合分為可變的(mutable)和不可變(immutable)的集合。其中,可變集合可以在適當(dāng)?shù)牡胤奖桓禄驍U(kuò)展,意味著可以對(duì)集合進(jìn)行修改、添加、移除元素;不可變集合類,相比之下,初始化后就永遠(yuǎn)不會(huì)改變。
List
在Scala中,List列表和數(shù)組類似,列表的所有元素都具有相同類型。然而,列表與數(shù)組不同的是,列表是不可變的。
定義不同類型列表List,具體代碼如下:
// 字符串
val fruit: List[String] =List("apples","oranges","pears")
// 整型
val nums: List[Int] = List(1, 2, 3, 4)
// 空
val empty: List[Nothing] = List()
// 二維列表
val dim: List[List[Int]] =
List(
List(1, 0, 0),
List(0, 1, 0),
List(0, 0, 1)
)
在Scala中,可以使用“Nil”和“::”操作符來(lái)定義列表。代碼如下:
// 字符串
val fruit = "apples":: ("oranges":: ("pears" :: Nil))
// 整型
val nums = 1 :: (2 :: (3 :: ( 4 :: Nil)))
// 空列表
val empty = Nil
// 二維列表
val dim = (1 :: (0 :: (0 :: Nil))) ::
(0 :: (1 :: (0 :: Nil))) ::
(0 :: (0 :: (1 :: Nil))) :: Nil
Scala也提供了很多操作List的方法,如下表所示。
示例代碼如下:
package cn.itcast.scala
object Ch04_ListTest {
def main(args: Array[String]): Unit = {
//定義List集合
//val fruit:List[String] = List("apples","oranges","pears")
val fruit = "apples"::("oranges"::("pears"::Nil))
val nums = Nil
println("Head of fruit:" + fruit.head)
println("Tail of fruit:" + fruit.tail)
println("check if fruit is empty:"+fruit.isEmpty)
println("check if nums is empty:"+nums.isEmpty)
println("Take of fruit:"+fruit.take(2))
println("contains of fruit oranages:"+fruit.contains("oranges"))
}
}
Set
在Scala中,Set是沒有重復(fù)對(duì)象的集合,所有元素都是唯一的。默認(rèn)情況下,Scala 使用不可變Set集合,若想使用可變的Set集合,則需要引入scala.collection.mutable.Set
包。
定義Set集合的語(yǔ)法格式如下:
val set: Set[Int] = Set(1,2,3,4,5)
Scala提供了很多操作Set集合的方法。接下來(lái),我們列舉一些操作Set集合的常見方法,具體如下表所示。
具體代碼如下所示:
package cn.itcast.scala
object Ch05_SetTest {
def main(args: Array[String]): Unit = {
//定義Set集合
val site = Set("Itcast","Google","Baidu")
val nums:Set[Int] = Set()
println("第一個(gè)網(wǎng)站是:"+site.head)
println("最后一個(gè)網(wǎng)站是:"+site.tail)
println("site集合是否為空:"+site.isEmpty)
println("nums集合是否為空:"+nums.isEmpty)
println("查看site集合的前兩個(gè)網(wǎng)站:"+nums.take(2))
println("site集合中是不包含網(wǎng)站Google:"+site.contains("Google"))
}
}
Map
在Scala中,Map是一種可迭代的鍵值對(duì)(key/value)結(jié)構(gòu),并且鍵是唯一的,值不一定是唯一的,所有的值都是通過鍵來(lái)獲取的。Map中所有元素的鍵與值都存在一種對(duì)應(yīng)關(guān)系,這種關(guān)系即為映射。Map有兩種類型,可變集合與不可變集合,默認(rèn)是不可變Map。若需要使用可變的Map集合,則需要引入 import scala.collection.mutable.Map
類。
定義Map集合的語(yǔ)法格式如下:
var A:Map[Char,Int] = Map(鍵 -> 值,鍵 -> 值...) //Map鍵值對(duì),鍵為Char,值為Int
Scala也提供了很多操作Map集合的方法。接下來(lái),我們列舉一些操作Map集合的常見方法,具體如下表所示:
示例代碼如下所示:
package cn.itcast.scala
object Ch06_MapTest {
def main(args: Array[String]): Unit = {
//定義Map集合
val colors = Map("red"-> "#FF0000",
"azure"-> "#F0FFFF",
"peru"-> "#CD853F")
val peruColor = if(colors.contains("peru")) colors("peru") else 0
val azureColor = colors.getOrElse("azure",0)
println("獲取colors中鍵為red的值:"+colors("red"))
println("獲取colors中所有的鍵:"+colors.keys)
println("獲取colors中所有的值:"+colors.values)
println("檢測(cè)colors是否為空:"+colors.isEmpty)
println("判斷colors中是否包含鍵peru,包含則返回對(duì)應(yīng)的值,否則返回0:"+peruColor)
println("判斷colors中是否包含鍵azure,包含則返回對(duì)應(yīng)的值,否則返回0:"+azureColor)
}
}
轉(zhuǎn)載自:https://blog.csdn.net/u014727709/article/details/131679759文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-695377.html
歡迎start,歡迎評(píng)論,歡迎指正文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-695377.html
到了這里,關(guān)于Spark大數(shù)據(jù)分析與實(shí)戰(zhàn)筆記(第一章 Scala語(yǔ)言基礎(chǔ)-3)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!