
目錄
???????集合介紹:
不可變集合繼承圖:?編輯
?可變集合繼承圖
數(shù)組:
不可變數(shù)組:
樣例代碼:
遍歷集合的方法:
1.for循環(huán)
2.迭代器
3.轉(zhuǎn)換成List列表:
4.使用foreach()函數(shù):
可變數(shù)組:
ArrayBuffer:
二維數(shù)組:
?List集合:
Set 集合:
不可變 Set:
可變Set:
Map集合:
創(chuàng)建map:
map集合的遍歷:
可變map:
元組:
tuple的定義:
元組與map的關(guān)系:
特點(diǎn):
集合介紹:
不可變集合:
不可變集合繼承圖:
set集合特點(diǎn):無(wú)序,不重復(fù)
對(duì)set集合無(wú)序的理解:set集合的無(wú)序是指在使用append等方法給集合添加元素的時(shí)候所添加的元素的順序是不可預(yù)測(cè)的,并且不能按照添加順序進(jìn)行遍歷(存儲(chǔ)位置是不一定的)
Set集合的無(wú)序性是由它的實(shí)現(xiàn)方式所決定的。通常,Set集合的實(shí)現(xiàn)方式采用了哈希表這種數(shù)據(jù)結(jié)構(gòu),其中元素被散列到桶中,不同的元素可能被散列到同一個(gè)桶中,因此添加的順序不能保證元素的順序。
set集合提供了SortedSet集合是有序的(放入2,3,1,4會(huì)按照1,2,3,4進(jìn)行存儲(chǔ))SortedSet寫了一個(gè)TreeSet集合是樹(shù)狀存儲(chǔ)
?可變集合繼承圖
數(shù)組:
不可變數(shù)組:
不可變集合是長(zhǎng)度不可變
Scala中的array 是與 Java中的[]對(duì)應(yīng)
樣例代碼:
package chapter05
object Test01_Array {
def main(args: Array[String]): Unit = {
val array = new Array[Int](4)
array(3)=100
//遍歷
for (elem <- array) {
println(elem)
}
}
}
在Scala中沒(méi)有寫方法名的都是調(diào)用了apply方法
遍歷集合的方法:
1.for循環(huán)
? ? ? ? 上邊樣例代碼已經(jīng)使用
2.迭代器
? ? ? ? 迭代器相當(dāng)于是指針的跳轉(zhuǎn)(指針在內(nèi)存中的跳轉(zhuǎn))
樣例代碼:
package chapter05
object Test01_Array {
def main(args: Array[String]): Unit = {
val array = new Array[Int](4)
array(3)=100
val iterator: Iterator[Int] = array.iterator
while (iterator.hasNext)
{
val i: Int = iterator.next()
println(i)
}
}
}
3.轉(zhuǎn)換成List列表:
? ? ? ? array集合可以通過(guò)to方法轉(zhuǎn)換成List列表
4.使用foreach()函數(shù):
在Scala中給所有的集合都提供了一個(gè)foreach()方法 進(jìn)行函數(shù)式打印
foreach()源碼:
def foreach[U](f: A => U): Unit = {
var i = 0
val len = length
while (i < len) { f(this(i)); i += 1 }
}
源碼分析:
foreach()傳入的參數(shù)實(shí)際是傳入的函數(shù)
A:是代表你傳入集合的類型
U:是泛型,代表你的輸出類型
這個(gè)函數(shù)的返回值是Unit類型
讓后通過(guò)while進(jìn)行向下運(yùn)行
對(duì)foreach()函數(shù)的調(diào)用使用匿名函數(shù)進(jìn)行調(diào)用
array.foreach(i=>println(i*2))
可變數(shù)組:
數(shù)組是默認(rèn)的不可變的,如果需要可變是需要自己導(dǎo)包的
ArrayBuffer:
填入的初始化大小(數(shù)組的大?。?只決定了創(chuàng)建底層結(jié)構(gòu)的長(zhǎng)度(不填的話默認(rèn)是16)
ArrayBuffer是可以進(jìn)行添加元素的append()
可以進(jìn)行增刪改查
可變數(shù)組與不可變數(shù)組元素的增加區(qū)別:
可變的用方法不可變的用符號(hào)
代碼樣例:
可變數(shù)組的增刪改查:
package chapter05
import scala.collection.mutable.ArrayBuffer
object Test_02_ArrayBuffer {
def main(args: Array[String]): Unit = {
//可變---導(dǎo)包
val arrayBuffer = new ArrayBuffer[Int](4)
arrayBuffer.append(1,2,3)
arrayBuffer.remove(1)
arrayBuffer.update(0,100)
println(arrayBuffer(0))
println(arrayBuffer)
}
}
不可變數(shù)組是不可變的,如果使用符號(hào)做出改變會(huì)生成一個(gè)新的對(duì)象
val array = new Array[Int](10)
val array1: Array[Int]= array :+ 8
println(array1.toList)
使用to方法可以讓可變與不可變數(shù)組進(jìn)行相互轉(zhuǎn)換
二維數(shù)組:
二維數(shù)組的定義與遍歷:
val array2: Array[ Array[Int]] = Array(Array(1, 2, 3),Array(1, 2, 3),Array(1, 2, 3))
for (array3 <- array2) {
for (elem <- array3) {
print(elem+ "\t")
}
println()
}
在Scala中創(chuàng)建多維數(shù)組的方法:
val array3: Array[Array[Int]] = Array.ofDim[Int](3, 4)
?List集合:
List是一個(gè)抽象類 在不繼承的情況下是無(wú)法new的,所以需要使用伴生對(duì)象的apply方法
直接使用即可
val list = List(1, 2, 3, 4)
list.foreach(println)
val ints: List[Int] = list :+ 10
ints.foreach(println)
val list1: List[Int] = 10 :: list
list1.foreach(println)
val list2 = List(5, 6, 7, 8)
val ints1: List[Int] = list ::: list2
println(ints1)
? ? ? ?

println(ints1(5))
val ints2: List[Int] = 1 :: 2 :: 4 :: 5 :: Nil
val ints3: List[Int] = 3 :: 6 :: 7 :: 9 :: List()
上述兩行代碼代表的是一個(gè)意思
Set 集合:
不可變 Set:
val value: Any = Set(1, 1, 2,2,3, 4, 5, 6, 7, 8, 9)
println(value)
運(yùn)行結(jié)果:
判斷set的類型:
val bool: Boolean = value.isInstanceOf[HashSet[Int]]
println(bool)
可變Set:
val ints: mutable.Set[Int] = mutable.Set(1, 2, 2, 3, 1, 4, 5, 6, 8, 7, 9)
可變Set的增加是add方法,不是append方法
可變Set的集合也是符合不可重復(fù),不可修改的特點(diǎn)
?只可增刪查
Map集合:
map集合也是一個(gè)特質(zhì),可以通過(guò)apply方法創(chuàng)建對(duì)象
map是一個(gè)(k,v)集合
創(chuàng)建map:
(1)這是一種采用元組的方式創(chuàng)建的
val map = Map(("hello", 10), ("world", 20))
(2)這是采用的箭頭的方式創(chuàng)建的
val map1 = Map("hello" -> 10, "world" -> 12)
常用第一種方式創(chuàng)建
map集合的遍歷:
(采用第一種方式創(chuàng)建的)
for循環(huán)得到的對(duì)象是元組
for (elem <- map) {
//elem是元組
val key: String = elem._1
val value: Int = elem._2
println(s"${key}:${value}")
}
在Scala中value的類型為Int類型? 在Java中是Int的包裝類(防止在get方法找value不存在的時(shí)候?yàn)镹ull的情況)
上述情況也會(huì)在Scala中出現(xiàn),Scala是對(duì)get方法使用Option(是一個(gè)抽象類,被兩個(gè)子類實(shí)現(xiàn)(None,Some))封裝
如果get的key存在 就調(diào)用上述的some類 再對(duì)結(jié)果進(jìn)行調(diào)用get? 轉(zhuǎn)換成int類型 (方法很長(zhǎng),而且在沒(méi)有值的情況下是會(huì)報(bào)錯(cuò)的)
因?yàn)樘L(zhǎng)引入了新的寫法:
對(duì)map集合直接調(diào)用getOrElse(1)方法? ?設(shè)置1? 有值輸出值? 無(wú)值輸出1
val i: Int = map.getOrElse("hello", 1)
println(i)
不存在就會(huì)返回None
可變map:
可變map也是采用mutable.map進(jìn)行創(chuàng)建
增刪改查:
增加:
put方法? 這個(gè)方法可以增加也可以進(jìn)行修改? ?當(dāng)key值存在的時(shí)候? 如果value不同會(huì)覆蓋前值
val maybeInt: Option[Int] = map.put("helloi2", 23)
刪除:
val maybeInt1: Option[Int] = map.remove("hello")
查找:
查找與不可變一樣使用getOrElse方法進(jìn)行查找
元組:
本身為不可變 ,可以存放不同數(shù)據(jù)類型的元素
list具有上述的性質(zhì)? ? 但是使用list存放不同類型的數(shù)據(jù) 在調(diào)用的時(shí)候無(wú)法得到相應(yīng)的類型(統(tǒng)一為Any)而tuple(元組可以)
tuple的定義:
val tuple: (String, Int) = ("hihihi", 23)
元組與map的關(guān)系:
map中的(key? value )元素被默認(rèn)當(dāng)作二元組
特點(diǎn):
這樣我們可以實(shí)現(xiàn)list集合與map集合的轉(zhuǎn)換
val toList: List[(String, Int)] = map1.toList
println(toList)
?運(yùn)行結(jié)果:
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-417792.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-417792.html
到了這里,關(guān)于Scala之集合(1)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!