1. 程式人生 > >Scala中常見的容器 set

Scala中常見的容器 set

Scala Set(集合)是沒有重複的物件集合,所有的元素都是唯一的。

Scala 集合分為可變的和不可變的集合。

預設情況下,Scala 使用的是不可變集合,如果你想使用可變集合,需要引用 scala.collection.mutable.Set 包。

預設引用 scala.collection.immutable.Set,不可變集合例項如下:

val set=Set(1,2,3)
println(set.getClass.getName)// 
println(set.exists(_ %2==0))//true
println(set.drop(1))//Set(2,3)  表示從前往後刪除元素的個數
如果需要使用可變集合需要引入 scala.collection.mutable.Set:
import scala.collection.mutable.Set// 可以在任何地方引入 可變集合

val mutableSet =Set(1,2,3)
println(mutableSet.getClass.getName)// scala.collection.mutable.HashSet

mutableSet.add(4)
mutableSet.remove(1)
mutableSet +=5
mutableSet -=2

println(mutableSet)// Set(5, 3, 4)

val another 
= mutableSet.toSet println(another.getClass.getName)// scala.collection.immutable.Set
注意: 雖然可變Set和不可變Set都有新增或刪除元素的操作,但是有一個非常大的差別。對不可變Set進行操作,會產生一個新的set,原來的set並沒有改變,這與List一樣。 而對可變Set進行操作,改變的是該Set本身,與ListBuffer類似。

集合基本操作

Scala集合有三個基本操作:

  • head 返回集合第一個元素
  • tail 返回一個集合,包含除了第一元素之外的其他元素
  • isEmpty 在集合為空時返回true

對於Scala集合的任何操作都可以使用這三個基本操作來表達。例項如下:

objectTest{def main(args:Array[String]){
      val site =Set("Runoob","Google","Baidu")
      val nums:Set[Int]=Set()

      println("第一網站是 : "+ site.head )
      println("最後一個網站是 : "+ site.tail )
      println("檢視列表 site 是否為空 : "+ site.isEmpty )
      println("檢視 nums 是否為空 : "+ nums.isEmpty )}}
執行以上程式碼,輸出結果為:
$ vim Test.scala 
$ scala Test.scala 
第一網站是:Runoob最後一個網站是:Set(Google,Baidu)檢視列表 site 是否為空:false檢視 nums 是否為空:true

連線集合

你可以使用 ++ 運算子或 Set.++() 方法來連線兩個集合。如果元素有重複的就會移除重複的元素。例項如下:

objectTest{def main(args:Array[String]){
      val site1 =Set("Runoob","Google","Baidu")
      val site2 =Set("Faceboook","Taobao")// ++ 作為運算子使用var site = site1 ++ site2
      println("site1 ++ site2 : "+ site )//  ++ 作為方法使用
      site = site1.++(site2)
      println("site1.++(site2) : "+ site )}}

執行以上程式碼,輸出結果為:

$ vim Test.scala 
$ scala Test.scala 
site1 ++ site2 :Set(Faceboook,Taobao,Google,Baidu,Runoob)
site1.++(site2):Set(Faceboook,Taobao,Google,Baidu,Runoob)

查詢集合中最大與最小元素

你可以使用 Set.min 方法來查詢集合中的最小元素,使用 Set.max 方法查詢集合中的最大元素。例項如下:

objectTest{def main(args:Array[String]){
      val num =Set(5,6,9,20,30,45)// 查詢集合中最大與最小元素
      println("Set(5,6,9,20,30,45) 集合中的最小元素是 : "+ num.min )
      println("Set(5,6,9,20,30,45) 集合中的最大元素是 : "+ num.max )}}

執行以上程式碼,輸出結果為:

$ vim Test.scala 
$ scala Test.scala 
Set(5,6,9,20,30,45)集合中的最小元素是:5Set(5,6,9,20,30,45)集合中的最大元素是:45

交集

你可以使用 Set.& 方法或 Set.intersect 方法來檢視兩個集合的交集元素。例項如下:

objectTest{def main(args:Array[String]){
      val num1 =Set(5,6,9,20,30,45)
      val num2 =Set(50,60,9,20,35,55)// 交集
      println("num1.&(num2) : "+ num1.&(num2))
      println("num1.intersect(num2) : "+ num1.intersect(num2))}}

執行以上程式碼,輸出結果為:

$ vim Test.scala 
$ scala Test.scala 
num1.&(num2):Set(20,9)
num1.intersect(num2):Set(20,9)

Scala Set 常用方法

下表列出了 Scala Set 常用的方法:

序號 方法及描述
1

def +(elem: A): Set[A]

為集合新增新元素,x並建立一個新的集合,除非元素已存在

2

def -(elem: A): Set[A]

移除集合中的元素,並建立一個新的集合

3

def contains(elem: A): Boolean

如果元素在集合中存在,返回 true,否則返回 false。

4

def &(that: Set[A]): Set[A]

返回兩個集合的交集

5

def &~(that: Set[A]): Set[A]

返回兩個集合的差集

6

def +(elem1: A, elem2: A, elems: A*): Set[A]

通過新增傳入指定集合的元素建立一個新的不可變集合

7

def ++(elems: A): Set[A]

合併兩個集合

8

def -(elem1: A, elem2: A, elems: A*): Set[A]

通過移除傳入指定集合的元素建立一個新的不可變集合

9

def addString(b: StringBuilder): StringBuilder

將不可變集合的所有元素新增到字串緩衝區

10

def addString(b: StringBuilder, sep: String): StringBuilder

將不可變集合的所有元素新增到字串緩衝區,並使用指定的分隔符

11

def apply(elem: A)

檢測集合中是否包含指定元素

12

def count(p: (A) => Boolean): Int

計算滿足指定條件的集合元素個數

13

def copyToArray(xs: Array[A], start: Int, len: Int): Unit

複製不可變集合元素到陣列

14

def diff(that: Set[A]): Set[A]

比較兩個集合的差集

15

def drop(n: Int): Set[A]]

返回丟棄前n個元素新集合

16

def dropRight(n: Int): Set[A]

返回丟棄最後n個元素新集合

17

def dropWhile(p: (A) => Boolean): Set[A]

從左向右丟棄元素,直到條件p不成立

18

def equals(that: Any): Boolean

equals 方法可用於任意序列。用於比較系列是否相等。

19

def exists(p: (A) => Boolean): Boolean

判斷不可變集合中指定條件的元素是否存在。

20

def filter(p: (A) => Boolean): Set[A]

輸出符合指定條件的所有不可變集合元素。

21

def find(p: (A) => Boolean): Option[A]

查詢不可變集合中滿足指定條件的第一個元素

22

def forall(p: (A) => Boolean): Boolean

查詢不可變集合中滿足指定條件的所有元素

23

def foreach(f: (A) => Unit): Unit

將函式應用到不可變集合的所有元素

24

def head: A

獲取不可變集合的第一個元素

25

def init: Set[A]

返回所有元素,除了最後一個

26

def intersect(that: Set[A]): Set[A]

計算兩個集合的交集

27

def isEmpty: Boolean

判斷集合是否為空

28

def iterator: Iterator[A]

建立一個新的迭代器來迭代元素

29

def last: A

返回最後一個元素

30

def map[B](f: (A) => B): immutable.Set[B]

通過給定的方法將所有元素重新計算

31

def max: A

查詢最大元素

32

def min: A

查詢最小元素

33

def mkString: String

集合所有元素作為字串顯示

34

def mkString(sep: String): String

使用分隔符將集合所有元素作為字串顯示

35

def product: A

返回不可變集合中數字元素的積。

36

def size: Int

返回不可變集合元素的數量

37

def splitAt(n: Int): (Set[A], Set[A])

把不可變集合拆分為兩個容器,第一個由前 n 個元素組成,第二個由剩下的元素組成

38

def subsetOf(that: Set[A]): Boolean

如果集合中含有子集返回 true,否則返回false

39

def sum: A

返回不可變集合中所有數字元素之和

40

def tail: Set[A]

返回一個不可變集合中除了第一元素之外的其他元素

41

def take(n: Int): Set[A]

返回前 n 個元素

42

def takeRight(n: Int):Set[A]

相關推薦

Scala常見容器 set

Scala Set(集合)是沒有重複的物件集合,所有的元素都是唯一的。 Scala 集合分為可變的和不可變的集合。 預設情況下,Scala 使用的是不可變集合,如果你想使用可變集合,需要引用 scala.collection.mutable.Set 包。 預設引用

Scala常見容器 元組 Tuple

與列表一樣,元組也是不可變的,但與列表不同的是元組可以包含不同型別的元素。 元組的值是通過將單個的值包含在圓括號中構成的。例如: val t =(1,3.14,"Fred") 以上例項在元組中定義了三個元素,對應的型別分別為[Int, Double, java.lan

C++ STL常見容器的時間複雜度

map, set, multimap, and multiset 上述四種容器採用紅黑樹實現,紅黑樹是平衡二叉樹的一種。不同操作的時間複雜度近似為: 插入: O(logN) 檢視:O(logN) 刪除:O(logN) hash_map, hash_set, hash_

Java常見數據結構Set之HashSet

顯示 clas src 項目開發 style created ide value 存儲 今天來說說Java集合中的Set系列之HashSet。 Set我們眾所周知的就是慮重功能, 我們平時在項目開發中也常用到這個特性的。那麽Set為何能夠慮重呢? 接下來我們就看下源

scala的Seq 和 Set 的區別

var seq = Seq[String]() seq = seq :+ "hello" var set = Set[String]() set += "hello" Seq 和 Set是針對現實使用場景的不同資料結構抽象。 簡單來說, Seq是列表,適合存有序重複資料,進行快速插入/刪除

Scalaset和map的簡單使用

//因為Scala旨在幫助您利用功能和命令式樣式,所以它的集合庫可以區分它們可變和不可變的集合。 //例如,陣列總是可變的; 列表總是不可變的。 Scala還提供可變和不可變的集合和對映的替代方案, //但對兩個版本使用相同的簡單名稱。 對於集合和對映,Scala在類層次結構中建模可變性 //Sca

STL的list/set/map等容器clear之後的記憶體佔用

最近在知乎上看到一個問題: 為什麼呼叫 std::map::clear() 後記憶體佔用率沒有降低? size很大的一個map,用完後呼叫了clear()函式,按說記憶體使用率應該能降低很多,top命令觀察,結果是記憶體使用率沒有降低,為什麼呢? 求解答,謝謝。

Scala系列——Scala_(下劃線)的常見用法

將方法轉換為函式 scala> def ml(x: Int,y:Int) : Int= x*y scala> val f1=m1 _ 作為函式的引數         一個匿名的函式傳遞給一個方法或者函式的時候,scala會盡量推斷出引數型別。例如一個完整的匿

Docker容器常見的十種誤區

Docker是一個開源的應用容器引擎,在虛擬的容器環境之上增加一個應用部署引擎。它是一個輕量級但十分強大的關於虛擬化技術的開源容器,在容器中還整合了構建並容器化應用的工作流程。目前大家已經開始認同並接受容器技術,並意識到它能夠解決多種現實問題並具備一系列無可比擬的優勢。今

JavaMap和Set容器如何存物件的

 之前看到過這樣一個問題,大概是:能否把一個物件(自定義,沒有任何方法)的兩個例項同時存放到同一個Set中去?  當時很懵,但是這幾天偶然看了Set和Map的原始碼就比較明瞭了。這裡總結一下。  首先,大體上為了儲存,有通過樹來存資料的,也有通過雜湊(has

JS 調試常見的報錯的解決辦法

是否 asp success ted json字符串 clas 使用 crud 識別 報錯:Uncaught SyntaxError: Unexpected token o in JSON at position 1 at JSON.parse (<anonymou

js常見算法

常見 split length log else result cdd cnblogs 面試 一、面試80%都要問的數組去重   數組去重的方式有多種,其實面試中主要是想靠對對象的理解。還記得我第一次去面試的時候,去重的時候用了2個for循環。 //1循環一次 var

Linux常見目錄的作用

執行 保存 配置文件 家目錄 pro 系統 配置 命令 dev bin目錄   有四個bin目錄,分別是/bin、/sbin、/usr/bin/、/usr/sbin/   用來保存系統命令,區別是 前兩個目錄下的命令所有用戶都可以執行,後兩個目錄下的命令只有超級用戶可以執

Java常見的註解

ise rri 自帶 com doc ret not article 標識 Java中常見的註解 [email protected]/* */ @Deprecated @Suppvisewarnings 常見第三方註解 Spring:@Autowired

js常見面試問題-筆記

doc 重新 amp 原理 parent 事件 del 結果 ear 原文參考https://mp.weixin.qq.com/s/mCVL6qI33XeTg4YGIKt-JQ 1.事件代理給父元素添加事件,利用事件冒泡原理,在根據e.target來獲取子元素<ul

Rsync使用常見參數的說明

rsync5、Rsync使用中常見參數的說明.md常見參數說明motd file:定義當客戶端訪問時看到的信息,默認為空。 pid fle:定義rsync daemon將其PID寫入的文件,如果此文件存在rsync,daemon會終止而不是覆蓋。 port:定義daemon監聽的端口,默認為873。 addr

【遊戲開發】淺談遊戲開發常見的設計原則

依賴關系 unity 說過 srp des log gof https 類繼承   俗話說得好:“設計模式,常讀常新~”。的確,每讀一遍設計模式都會有些新的體會和收獲。馬三不才,才讀了兩遍設計模式(還有一遍是在學校學的),屬於菜鳥級別的。這次準備把閱

Java web常見編碼亂碼問題(二)

catalina 轉換 alt str 檢測 內容 tom 拼搏 image 根據上篇記錄Java web中常見編碼亂碼問題(一), 接著記錄亂碼案例:   案例分析:   2、輸出流寫入內容或者輸入流讀取內容時亂碼(內容中有中文)   原因分析:     a、 如果是

楊恒說李的算法好-我問你聽誰說的-龍哥說的(java常見的List就2個)(list放入的是原子元素)

ron 2個 常用 span color 原子 ges pan col 1.List中常用的 方法集合: 函數原型 ******************************************* *****************************

SVN版本號管理工具使用常見的代碼提交沖突問題的解決方法

而且 spa ise 錯誤 這樣的 合作開發 csdn 新版 span 相信剛開始學習使用SVN的小夥伴在項目合作開發的過程中一定常常遇到一些影響到自己編寫的代碼的苦惱。我這裏列舉了幾種常見的問題以及問題的解決方法: 1.誤刪除和誤操作的問題