您好,登錄后才能下訂單哦!
[TOC]
如果你需要一個長度不變的數組,可以用Scala中的Array。例如:
val numsArray = new Array[Int] (30) //長度為30的整數數組,所有元素初始化為0
val stringArrays = new Array [String] (30) //長度為30的字符串數組,所有元素初始化為null
val sHello = Array("Hello", "World") //長度為2的Array[String]類型是推斷出來的,已提供初始值就不需要new
sHello(0) = "Hello Tom",使用()而不是[]來訪問元素
在JVM中,Scala的Array以Java數組方式實現。示例中的數組在JVM中的類型為java.lang.String[]。Int、Double或其他與Java中基本類型對應的數組都是基本類型數組。
舉例來說,Array(2,3,5,6,7,10, 11)
在JVM中就是一個int[]。
val stringArrays = new Array[String] (5)
stringArrays(0) = “tom”
val array = Array(1, 2, 3, 4, 5)
// Array.fill(length)(value)
val array = Array.fill(5)(3.5)
如果fill第二個參數只寫一個值的話,那么該數組的所有元素都是該值,但是如果第二個參數是一個iterator
或者random
,那么數組就會被賦值為它們的值。
val array = Array.fill(2)(math.random)
1、對于那種長度按需要變化的數組,Java有ArrayList,C++有vector。Scala中的等效數據結構為ArrayBuffer
2、ArrayBuffer是一種mutable的數據容器,相對于Array來說,最大的區別就是可以自由增刪元素。當ArrayBuffer構建完畢后,還可以轉換為immutable的Array容器。
import scala.collection.mutable.ArrayBuffer
val buffer = ArrayBuffer[lnt]() // 或者new ArrayBuffer [int],一個空的數組緩沖,準備存放整數
buffer += 1 // ArrayBuffer (1),用+=在尾端添加元素
buffer.append(300)
buffer += (1,2,3,5) // ArrayBuffer(1,1,2,3,5),在尾端添加多個元素,以括號包起來
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個元素,在數組緩沖的尾端添加或移除元素是一個高效的操作
buffer.remove(index, n) //移除第index元素后的n個元素
一個完整的例子如下:
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) // 可以在某一個位置插入多個元素
println(ab)
// 刪
ab.trimEnd(1) // 刪除數組末尾的1個元素
println(ab)
ab.remove(3, 1) // 從索引位置3開始刪除,刪除2個元素
println(ab)
// 改
ab(3) = -3
println(ab)
// 查
println("==============================")
for(i <- ab) {
println(i)
}
}
}
val array = Array(1, 2, 3, 4, 5)
1、全遍歷常用遍歷(//如果不需要使用下標,用這種方式最簡單了)
for(i <- array) print(i +" ")
2、條件遍歷
for(i <- arrayif i !=2 ) print(i +“ ”) //打印出除2之外的所有整數的值
3、For推導式
在前面,你看到了如何像Java或C++那樣操作數組。不過在Scala中,你可以走得更遠。從一個數組或數組緩沖出發,以某種方式對它進行轉換是很簡單的。這些轉換動作不會修改原始數組,而是產生一個全新的數組。像這樣使用for推導式:
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((), (), (), (), ())
另外一種等價方法(借助于函數式編程的思想),某些有著函數式編程經驗的程序員傾向于使用filter和map而不是守衛和yield,這不過是一種風格罷了與for循環所做的事完全相同。你可以根據喜好任意選擇:
array.filter( _ > 0).map{ 2 * _}.foreach(println(_)) //生成array中的正數的兩倍的新集合
array.filter {_ > 0}.map {2 * _}.foreach(println //另一種寫法
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、顯示數組內容
println(b.mkString("And")) //分隔符
println(b.mkString("<",",",">"))//<1,7,2,9> //指定前綴、分隔符、后綴
1、定長多維數組(和Java一樣,多維數組是通過數組的數組來實現的)
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中的多維數組同Java中一樣,多維數組都是數組的數組。(推薦使用這種方式)
通過 Array.ofDi[類型](維度1, 維度2, 維度3,….)
來聲明多維數組,如聲明二維數組;
或者也可以這么定義用ofDim[T](rows,column, height,…)
函數定義,但最多可以定義五維數組。
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、變長多維數組
val arr1 = new ArrayBuffer[ArrayBuffer[Int]]()
1、定長數組a轉換成變長數組array:
array = a.toBuffer
2、變長數組array轉換成定長數組a:
a = array.toArray
由于Scala數組是用java數組實現的,你可以在Java和Scala之間來回傳遞。可以引入scala.collection.JavaConversions里的隱式轉換方法,這樣在調用Java方法時,這些對象會被自動包裝成Java列表。
舉例來說,java.lang.ProcessBuilder類有一個以List<String>為參數的構造器。以下是在Scala中調用它的寫法:
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的轉換
println(pb.command())
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的轉換
println(pb.command())
import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable.Buffer
val cmd: Buffer[String] = pb.command() // Java到Scala的轉換
println(cmd.head +"\t tail=> " + cmd.tail)
}
1、不可變映射
我們可以這樣構造一個映射:
val personAges = Map("Alice"-> 20, "Job"->28, "Garry"->18)
上述代碼構造出一個不可變的Map[String,Int],其值不能被改變。
也可以用此方法創建Map
val personAges = Map(("Alice"-> 20), ("Job"->28),("Garry"->18))
注:->用來創建元組, "sa" -> 1即(" sa ", 1)
2、可變映射
如果你想要一個可變映射,則用
val personAges = scala.collection.mutable.Map("Alice"->20, "Job"->28, "Garry"->18)
如果想從—個空的映射開始,你需要選定一個映射實現并給出類型參數:
val personAges1 =new scala.collection.mutable.HashMap [String, Int]
在Scala中,映射是對偶的集合。對偶簡單地說就是兩個值構成的組,這兩個值并不一定是同一個類型的,比如("Alice",10)
println("Alice=> " + personAges.get("Alice111"))
類似于Java中的personAges.get("Alice111"),如果映射并不包含請求中使用的鍵,則會拋出異常。要檢查映射中是否有某個指定的鍵,可以用contains方法。
val personAlice = if (personAges.contains ("Alice")) { personAges("Alice") }else 0
println("personAlice===> " + personAlice)
println("Alice1.else=> " + personAges.getOrElse("Alice",0)) // 如果映射包含鍵“Alice",返回對應的值;否則,返回0
最后,映射.get(鍵)這樣的調用返回一個Option對象,要么是Some(鍵對應的值),要么是None,Option對象有get函數,直接調用即可獲取原來Map中key所對應的value
1、更新可變映射
在可變映射中,你可以更新某個映射的值,或者添加一個新的映射關系,做法是在=號的左側使用():
personAges("Job") = 31 // 更新鍵"Job"對應的值
personAges("Garry") = 27 // 增加新的鍵/值對偶到personAges
或者,你也可以用+=操作來添加多個關系:
personAges += ("Bob"-> 10, "Fred"->7)
要移除某個鍵和對應的值,使用-=操作符:
personAges -="Alice"
2、更新不可變映射
雖然不能更新一個不可變的映射,但你可以做一些同樣有用的操作,即獲取一個包含所需要的更新的新映射
val personAges = Map("Alice" -> 20, "Job" -> 28, "Garry" -> 18)
val newPersonAges = personAges + ("Job" -> 10,"Fred" -> 7) // 更新過的新映射
println("newPersonAges=> " + newPersonAges)
同時也可以聲明var變量
var personA = Map("Alice"-> 20, "Job"->28, "Garry"->18)
personA = personA + ("Bob"->10, "Fred"->7)
println("personA=> " +personA)
同時移除不可變映射的值
personA = personA -"Alice" // 其實也相當于是重新創建了一個新的Map對象
println("remove.personA => "+ personA)
val personAges = Map ("Alice"-> 20, "Job"->28, "Garry"->18)
for ((k,v) <- personAges) print("k=> " + k +"\t v=> " + v +" ") println() // 同時獲取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,通過元組的方式
jieling
xiaoqiutian
xpleaf
scala> person.foreach(me => println(me._2)) // 只獲取value,通過元組的方式
22
17
23
要反轉一個映射,即交換鍵和值的位置,可以用:
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) // 應該是這樣才對,因為上面的方式值為空的
res178: scala.collection.mutable.Map[Int,String] = Map(23 -> xpleaf, 17 -> xiaoqiutian, 22 -> jieling)
val personAges = scala.collection.immutable.SortedMap("Alice"->10,"Fred"->7,"Bob"->3,"Cindy"->8) // 會按照key的字典順序進行排序
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) // 創建一個順序的Map
months += ("Fourth" -> 4)
println("months=> " + months) // months=> Map(January -> 1, February -> 2, March -> 3, Fourth -> 4)
映射是鍵/值對偶的集合。對偶是元組( tuple)的最簡單形態,元組是不同類型的值的聚集。元組的值是通過將單個的值包含在圓括號中構成的。例如:
(1, 3.14, "Fred")
是一個元組,類型為:
Tuple3 [Int, Double, java.lang.String]
下面是元組簡單的定義方式:
val t = (1,3.14, "John")
println(t._1 +"\t " + t._2 +"\t " + t._3)
需要注意的是:和數組或字符串中的位置不同,元組的各組元從1開始,而不是0。你可以把t._2寫為t _2,即用空格而不是句點,但不能寫成t_2
當然也可以通過下面的方式進行定義:
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是一樣的,通過元組賦值給多個值
println(first + "\t" + second + "\t" + third + "\t" + fourth)
println("New York".partition ( _.isUpper)) // (NY,ew ork)
遍歷元素:
t.productIterator.foreach(x => print(x +" "))
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。