内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Scala筆記整理(二):Scala數(shù)據(jù)結(jié)構(gòu)—數(shù)組、map與tuple-創(chuàng)新互聯(lián)

[TOC]

成都創(chuàng)新互聯(lián)公司自成立以來(lái),一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、成都外貿(mào)網(wǎng)站建設(shè)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開(kāi)發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開(kāi)發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開(kāi)發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

數(shù)組

定長(zhǎng)數(shù)組

如果你需要一個(gè)長(zhǎng)度不變的數(shù)組,可以用Scala中的Array。例如:

val numsArray = new Array[Int] (30) //長(zhǎng)度為30的整數(shù)數(shù)組,所有元素初始化為0
val stringArrays = new Array [String] (30) //長(zhǎng)度為30的字符串?dāng)?shù)組,所有元素初始化為null
val sHello = Array("Hello", "World") //長(zhǎng)度為2的Array[String]類型是推斷出來(lái)的,已提供初始值就不需要new
sHello(0) = "Hello Tom",使用()而不是[]來(lái)訪問(wèn)元素

在JVM中,Scala的Array以Java數(shù)組方式實(shí)現(xiàn)。示例中的數(shù)組在JVM中的類型為java.lang.String[]。Int、Double或其他與Java中基本類型對(duì)應(yīng)的數(shù)組都是基本類型數(shù)組。

舉例來(lái)說(shuō),Array(2,3,5,6,7,10, 11)在JVM中就是一個(gè)int[]。

定長(zhǎng)數(shù)組Array-賦值

  • 方法1
val stringArrays = new Array[String] (5) 
stringArrays(0) = “tom”
  • 方法2
val array = Array(1, 2, 3, 4, 5)
  • 方法3
// Array.fill(length)(value)
val array = Array.fill(5)(3.5)

如果fill第二個(gè)參數(shù)只寫一個(gè)值的話,那么該數(shù)組的所有元素都是該值,但是如果第二個(gè)參數(shù)是一個(gè)iterator或者random,那么數(shù)組就會(huì)被賦值為它們的值。

val array = Array.fill(2)(math.random)

變長(zhǎng)數(shù)組ArrayBuffer

1、對(duì)于那種長(zhǎng)度按需要變化的數(shù)組,Java有ArrayList,C++有vector。Scala中的等效數(shù)據(jù)結(jié)構(gòu)為ArrayBuffer

2、ArrayBuffer是一種mutable的數(shù)據(jù)容器,相對(duì)于Array來(lái)說(shuō),大的區(qū)別就是可以自由增刪元素。當(dāng)ArrayBuffer構(gòu)建完畢后,還可以轉(zhuǎn)換為immutable的Array容器。

import scala.collection.mutable.ArrayBuffer
val buffer = ArrayBuffer[lnt]() // 或者new ArrayBuffer [int],一個(gè)空的數(shù)組緩沖,準(zhǔn)備存放整數(shù)

buffer += 1 // ArrayBuffer (1),用+=在尾端添加元素

buffer.append(300)

buffer += (1,2,3,5) // ArrayBuffer(1,1,2,3,5),在尾端添加多個(gè)元素,以括號(hào)包起來(lái)

buffer ++= Array(8, 13, 21) // ArrayBuffer(1, 1, 2, 3, 5, 8,13, 21) //用++=操作符追加任何集合

buffer.insert(2, 150) //在第2元素(索引)后插入150:

buffer.insert(3, 147,21) //在第2元素后插入147,21:

buffer.trimEnd(5) // ArrayBuffer(1, 1, 2),移除最后5個(gè)元素,在數(shù)組緩沖的尾端添加或移除元素是一個(gè)高效的操作

buffer.remove(index, n) //移除第index元素后的n個(gè)元素

一個(gè)完整的例子如下:

import scala.collection.mutable.ArrayBuffer
object _07ArrayBufferDemo {
    def main(args:Array[String]):Unit = {
        val ab = new ArrayBuffer[Int]()

        // 增
        ab += 1
        println(ab)
        ab.append(2)
        println(ab)
        ab += (3, 4, 5)
        println(ab)
        ab ++= Array(6, 7)
        println(ab)
        // insert
        ab.insert(3, -1, -2)    // 可以在某一個(gè)位置插入多個(gè)元素
        println(ab)

        // 刪
        ab.trimEnd(1)   // 刪除數(shù)組末尾的1個(gè)元素
        println(ab)
        ab.remove(3, 1) // 從索引位置3開(kāi)始刪除,刪除2個(gè)元素
        println(ab)

        // 改
        ab(3) = -3
        println(ab)

        // 查
        println("==============================")
        for(i <- ab) {
            println(i)
        }
    }
}

遍歷數(shù)組

val array = Array(1, 2, 3, 4, 5)

1、全遍歷常用遍歷(//如果不需要使用下標(biāo),用這種方式最簡(jiǎn)單了)

for(i <- array) print(i +" ")

2、條件遍歷

for(i <- arrayif i !=2 ) print(i +“ ”) //打印出除2之外的所有整數(shù)的值

3、For推導(dǎo)式

在前面,你看到了如何像Java或C++那樣操作數(shù)組。不過(guò)在Scala中,你可以走得更遠(yuǎn)。從一個(gè)數(shù)組或數(shù)組緩沖出發(fā),以某種方式對(duì)它進(jìn)行轉(zhuǎn)換是很簡(jiǎn)單的。這些轉(zhuǎn)換動(dòng)作不會(huì)修改原始數(shù)組,而是產(chǎn)生一個(gè)全新的數(shù)組。像這樣使用for推導(dǎo)式:

val arr = ArrayBuffer(1, 3, 2, -1, -2)
for(i <- 0 until arr.length) yield arr(i) * 2 //將得到Vector(2, 6, 4, -2, -4)
for(i <- array) yield print(i * 2)  // ArrayBuffer[Unit] = ArrayBuffer((), (), (), (), ())

另外一種等價(jià)方法(借助于函數(shù)式編程的思想),某些有著函數(shù)式編程經(jīng)驗(yàn)的程序員傾向于使用filter和map而不是守衛(wèi)和yield,這不過(guò)是一種風(fēng)格罷了與for循環(huán)所做的事完全相同。你可以根據(jù)喜好任意選擇:

array.filter( _ > 0).map{ 2 * _}.foreach(println(_)) //生成array中的正數(shù)的兩倍的新集合
array.filter {_ > 0}.map {2 * _}.foreach(println //另一種寫法

常用算法(Scala內(nèi)置函數(shù))

1、求和與排序

println(Array(1,7,2,9).sum)

2、求大值

println(ArrayBuffer("Mary","had","a","little","lamb").max)

3、排序

  • 升序
val b = ArrayBuffer(1,7,2, 9)
val bSorted = b.sorted //1,2,7,9
b.sortWith(_ < ).foreach(println())

降序

b.sortWith(_ > ).foreach(println())

4、顯示數(shù)組內(nèi)容

println(b.mkString("And")) //分隔符
println(b.mkString("<",",",">"))//<1,7,2,9> //指定前綴、分隔符、后綴

多維數(shù)組

1、定長(zhǎng)多維數(shù)組(和Java一樣,多維數(shù)組是通過(guò)數(shù)組的數(shù)組來(lái)實(shí)現(xiàn)的)

val array = new Array[Array[Int]](5) 
scala> val array = new Array[Array[Int]](5)
array: Array[Array[Int]] = Array(null, null, null, null, null)

2、Scala中的多維數(shù)組同Java中一樣,多維數(shù)組都是數(shù)組的數(shù)組。(推薦使用這種方式)

通過(guò) Array.ofDi[類型](維度1, 維度2, 維度3,….)來(lái)聲明多維數(shù)組,如聲明二維數(shù)組;

或者也可以這么定義用ofDim[T](rows,column, height,…)函數(shù)定義,但最多可以定義五維數(shù)組。

scala> val array = Array.ofDim[Double](2,3)
array: Array[Array[Double]] = Array(Array(0.0, 0.0, 0.0), Array(0.0, 0.0, 0.0))

scala> for(a <- array) println(a.toList)
List(0.0, 0.0, 0.0)
List(0.0, 0.0, 0.0)

3、變長(zhǎng)多維數(shù)組

val arr1 = new ArrayBuffer[ArrayBuffer[Int]]()

定長(zhǎng)數(shù)組和變長(zhǎng)數(shù)組的轉(zhuǎn)換

1、定長(zhǎng)數(shù)組a轉(zhuǎn)換成變長(zhǎng)數(shù)組array:

array = a.toBuffer

2、變長(zhǎng)數(shù)組array轉(zhuǎn)換成定長(zhǎng)數(shù)組a:

a = array.toArray

與Java互操作(了解)

由于Scala數(shù)組是用java數(shù)組實(shí)現(xiàn)的,你可以在Java和Scala之間來(lái)回傳遞。可以引入scala.collection.JavaConversions里的隱式轉(zhuǎn)換方法,這樣在調(diào)用Java方法時(shí),這些對(duì)象會(huì)被自動(dòng)包裝成Java列表。

舉例來(lái)說(shuō),java.lang.ProcessBuilder類有一個(gè)以List<String>為參數(shù)的構(gòu)造器。以下是在Scala中調(diào)用它的寫法:

  • Scala到Java之間的轉(zhuǎn)換工作
def conversionArray: Unit ={
    import scala.collection.JavaConversions.bufferAsJavaList
    import scala.collection.mutable.ArrayBuffer
    val command = ArrayBuffer("ls", "-al", "/home/cay")
    val pb = new ProcessBuilder(command) // Scala到Java的轉(zhuǎn)換
    println(pb.command())
  • Java到Scala之間的轉(zhuǎn)換工作
def conversionArray: Unit ={
    import scala.collection.JavaConversions.bufferAsJavaList
    import scala.collection.mutable._
    val command = ArrayBuffer("ls", "-al", "/home/cay")
    val pb = new ProcessBuilder(command) // Scala到Java的轉(zhuǎn)換
    println(pb.command())

    import scala.collection.JavaConversions.asScalaBuffer
    import scala.collection.mutable.Buffer
    val cmd: Buffer[String] = pb.command() // Java到Scala的轉(zhuǎn)換
    println(cmd.head +"\t tail=> " + cmd.tail)
  }

Map

Map創(chuàng)建

1、不可變映射

我們可以這樣構(gòu)造一個(gè)映射:

val personAges = Map("Alice"-> 20, "Job"->28, "Garry"->18)

上述代碼構(gòu)造出一個(gè)不可變的Map[String,Int],其值不能被改變。

也可以用此方法創(chuàng)建Map

val personAges = Map(("Alice"-> 20), ("Job"->28),("Garry"->18))

注:->用來(lái)創(chuàng)建元組, "sa" -> 1即(" sa ", 1)

2、可變映射

如果你想要一個(gè)可變映射,則用

val personAges = scala.collection.mutable.Map("Alice"->20, "Job"->28, "Garry"->18)

如果想從—個(gè)空的映射開(kāi)始,你需要選定一個(gè)映射實(shí)現(xiàn)并給出類型參數(shù):

val personAges1 =new scala.collection.mutable.HashMap [String, Int]

在Scala中,映射是對(duì)偶的集合。對(duì)偶簡(jiǎn)單地說(shuō)就是兩個(gè)值構(gòu)成的組,這兩個(gè)值并不一定是同一個(gè)類型的,比如("Alice",10)

獲取Map中的值

  • 方式1
println("Alice=>  " + personAges.get("Alice111"))

類似于Java中的personAges.get("Alice111"),如果映射并不包含請(qǐng)求中使用的鍵,則會(huì)拋出異常。要檢查映射中是否有某個(gè)指定的鍵,可以用contains方法。

  • 方式2:contains方法
val personAlice = if (personAges.contains ("Alice")) { personAges("Alice") }else 0
println("personAlice===> " + personAlice)
  • 方式3
println("Alice1.else=>  " + personAges.getOrElse("Alice",0))     // 如果映射包含鍵“Alice",返回對(duì)應(yīng)的值;否則,返回0

最后,映射.get(鍵)這樣的調(diào)用返回一個(gè)Option對(duì)象,要么是Some(鍵對(duì)應(yīng)的值),要么是None,Option對(duì)象有g(shù)et函數(shù),直接調(diào)用即可獲取原來(lái)Map中key所對(duì)應(yīng)的value

更新Map中的值

1、更新可變映射

在可變映射中,你可以更新某個(gè)映射的值,或者添加一個(gè)新的映射關(guān)系,做法是在=號(hào)的左側(cè)使用():

personAges("Job") = 31 // 更新鍵"Job"對(duì)應(yīng)的值
personAges("Garry") = 27 // 增加新的鍵/值對(duì)偶到personAges

或者,你也可以用+=操作來(lái)添加多個(gè)關(guān)系:

personAges += ("Bob"-> 10, "Fred"->7)

要移除某個(gè)鍵和對(duì)應(yīng)的值,使用-=操作符:

personAges -="Alice"

2、更新不可變映射

雖然不能更新一個(gè)不可變的映射,但你可以做一些同樣有用的操作,即獲取一個(gè)包含所需要的更新的新映射

val personAges = Map("Alice" -> 20, "Job" -> 28, "Garry" -> 18)
val newPersonAges = personAges + ("Job" -> 10,"Fred" -> 7) // 更新過(guò)的新映射
println("newPersonAges=> " + newPersonAges)

同時(shí)也可以聲明var變量

var personA = Map("Alice"-> 20, "Job"->28, "Garry"->18)
personA = personA + ("Bob"->10, "Fred"->7)
println("personA=> " +personA)

同時(shí)移除不可變映射的值

personA = personA -"Alice"  // 其實(shí)也相當(dāng)于是重新創(chuàng)建了一個(gè)新的Map對(duì)象
println("remove.personA => "+ personA)

遍歷Map

val personAges = Map ("Alice"-> 20, "Job"->28, "Garry"->18)

for ((k,v) <- personAges) print("k=> " + k +"\t v=> " + v +" ") println()   // 同時(shí)獲取key和value

for((k,_)<- personAges) print("k => " + k +" ") println()   // 只獲取key

for(k <- personAges.keySet) print("kkkk=> " + k +" ") println() // 只獲取key

for((_,v) <- personAges) print("v=> " + v +" ") println()   // 只獲取value

for ( v <- personAges.values) print("vvvv=> " + v)  // 只獲取value

scala> person.foreach(me => println(me._1)) // 只獲取key,通過(guò)元組的方式
jieling
xiaoqiutian
xpleaf

scala> person.foreach(me => println(me._2)) // 只獲取value,通過(guò)元組的方式
22
17
23

要反轉(zhuǎn)一個(gè)映射,即交換鍵和值的位置,可以用:

for ( (k,v) <- personAges) yield print(v,k)

scala> for((k,v) <- person) yield print(v, k)
(22,jieling)(17,xiaoqiutian)(23,xpleaf)res177: scala.collection.mutable.Iterable[Unit] = ArrayBuffer((), (), ())

scala> for((k,v) <- person) yield(v, k) // 應(yīng)該是這樣才對(duì),因?yàn)樯厦娴姆绞街禐榭盏?res178: scala.collection.mutable.Map[Int,String] = Map(23 -> xpleaf, 17 -> xiaoqiutian, 22 -> jieling)

Map排序

val personAges = scala.collection.immutable.SortedMap("Alice"->10,"Fred"->7,"Bob"->3,"Cindy"->8)    // 會(huì)按照key的字典順序進(jìn)行排序
println("personAges==> " + personAges)  // personAges==> Map(Alice -> 10, Bob -> 3, Cindy -> 8, Fred -> 7)

val months = scala.collection.mutable.LinkedHashMap("January" -> 1,"February" -> 2,"March" -> 3)    // 創(chuàng)建一個(gè)順序的Map
months += ("Fourth" -> 4)
println("months=> " + months)   // months=> Map(January -> 1, February -> 2, March -> 3, Fourth -> 4)

tuple

元組定義

映射是鍵/值對(duì)偶的集合。對(duì)偶是元組( tuple)的最簡(jiǎn)單形態(tài),元組是不同類型的值的聚集。元組的值是通過(guò)將單個(gè)的值包含在圓括號(hào)中構(gòu)成的。例如:

(1, 3.14, "Fred")

是一個(gè)元組,類型為:

Tuple3 [Int, Double, java.lang.String]

下面是元組簡(jiǎn)單的定義方式:

val t = (1,3.14, "John")
println(t._1 +"\t " + t._2 +"\t " + t._3)

需要注意的是:和數(shù)組或字符串中的位置不同,元組的各組元從1開(kāi)始,而不是0。你可以把t._2寫為t _2,即用空格而不是句點(diǎn),但不能寫成t_2

當(dāng)然也可以通過(guò)下面的方式進(jìn)行定義:

scala> val tuple = new Tuple4[String, Int, String, Double]("xpleaf", 1, "guangdong", 17000)
tuple: (String, Int, String, Double) = (xpleaf,1,guangdong,17000.0)

獲取元組

val t = (1, 3.14, "John", "Garry")
println(t._1 +"\t " + t._2 +"\t " + t._3 + "\t" + t._4)
val (first,second,third,fourth) = t // 這種賦值方式與Python是一樣的,通過(guò)元組賦值給多個(gè)值
println(first + "\t" + second + "\t" + third + "\t" + fourth)
println("New York".partition ( _.isUpper))  // (NY,ew ork)

遍歷元素:

t.productIterator.foreach(x => print(x +" "))

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

本文題目:Scala筆記整理(二):Scala數(shù)據(jù)結(jié)構(gòu)—數(shù)組、map與tuple-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://m.rwnh.cn/article2/djioic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站品牌網(wǎng)站制作、網(wǎng)站維護(hù)、網(wǎng)站收錄App開(kāi)發(fā)、網(wǎng)站導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)
准格尔旗| 保靖县| 恩施市| 盈江县| 濉溪县| 临清市| 三穗县| 诸城市| 高陵县| 禹州市| 海原县| 全南县| 珠海市| 黄龙县| 内乡县| 塔河县| 安康市| 新晃| 枝江市| 那坡县| 报价| 百色市| 札达县| 宁安市| 宿迁市| 金塔县| 边坝县| 集安市| 公主岭市| 江阴市| 白玉县| 永吉县| 牟定县| 沙河市| 常宁市| 呼和浩特市| 德化县| 临汾市| 金华市| 门头沟区| 都兰县|