1. 程式人生 > >Scala學習進擊Spark(五): Scala集合

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,會快速編譯