Scala-元组、集合

1、元祖
映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值。
1)、创建元祖

//创建元祖时,用小括号那个多个元素括起来,元素之间用逗号隔开,元素的类型可以不一样,元素个数也可以任意多个
scala> val tp = (1,3.3,"scala")
tp: (Int, Double, String) = (1,3.3,scala)

2)、获取元祖的值

scala> tp._1
res37: Int = 1

scala> tp._2
res38: Double = 3.3

scala> tp._3
res39: String = scala

//使用下面这种方式更直观
scala> val t , (a, b, c) = (2, 2.2, "scala")
t: (Int, Double, String) = (2,2.2,scala)
a: Int = 2
b: Double = 2.2
c: String = scala

scala> x
<console>:9: error: not found: value x
              x
              ^

scala> a
res43: Int = 2

scala> b
res44: Double = 2.2

scala> c
res45: String = scala

//对偶元祖加到map中
scala> val m = Map(1 -> "a", 2 -> "b")
m: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a)

scala> val t = (3,"c")
t: (Int, String) = (3,c)

scala> m += t
res40: m.type = Map(2 -> b, 1 -> a, 3 -> c)

scala> m
res41: scala.collection.mutable.Map[Int,String] = Map(2 -> b, 1 -> a, 3 -> c)

3)、将对偶集合转换成映射

scala> val arr = Array((1,"a"),(2,"b"))
arr: Array[(Int, String)] = Array((1,a), (2,b))

scala> val t = arr.toMap
t: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

scala> t
res46: scala.collection.immutable.Map[Int,String] = Map(1 -> a, 2 -> b)

4)、拉链操作
使用zip命令可以将集合中对应的多个值绑定在一起

scala> val arr1 = Array(1,2,3)
arr1: Array[Int] = Array(1, 2, 3)

scala> val arr2 = Array("a","b","c")
arr2: Array[String] = Array(a, b, c)

scala> var arr3 = arr2.zip(arr1)
arr3: Array[(String, Int)] = Array((a,1), (b,2), (c,3))

scala> arr3
res47: Array[(String, Int)] = Array((a,1), (b,2), (c,3))

//如果其中一个元素要多,那么省去最后多余的
//即:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素个数
scala> val arr4 = Array("a","b","c","d")
arr4: Array[String] = Array(a, b, c, d)

scala> var arr5 = arr4.zip(arr1)
arr5: Array[(String, Int)] = Array((a,1), (b,2), (c,3))
//arr4中多余的"d"就给省去了
scala> arr5
res49: Array[(String, Int)] = Array((a,1), (b,2), (c,3))

2、集合
Scala的集合有三大类:序列Seq、集Set、映射Map,所有的集合都扩展自Iterable特质(trait)
在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区别)

1)、序列
可认为java的List

//创建不可变集合
scala> val list = List(1,2,3,4)
list: List[Int] = List(1, 2, 3, 4)

//获取序列中角标为0的元素
scala> list(0)
res50: Int = 1

//由于集合是不可变的所以企图修改其中的值是行不通的
scala> list(0) = 6
<console>:10: error: value update is not a member of List[Int]
              list(0) = 6

//向集合中添加元素生成新的集合
//将0插入到lst1的前面生成一个新的List
scala> val list2 = 0 :: list
list2: List[Int] = List(0, 1, 2, 3, 4)

scala> list2
res52: List[Int] = List(0, 1, 2, 3, 4)

scala> val list3 = list.::(0)
list3: List[Int] = List(0, 1, 2, 3, 4)

scala> val list4 = 0 +: list
list4: List[Int] = List(0, 1, 2, 3, 4)

scala> val list5 = list.+:(0)
list5: List[Int] = List(0, 1, 2, 3, 4)

//将5添加到list最后面
scala> val list6 = list :+ 5
list6: List[Int] = List(1, 2, 3, 4, 5)

//将两个list合并生成一个新的list
scala> list
res57: List[Int] = List(1, 2, 3, 4)

scala> val lst = List(1,5,6,7)
lst: List[Int] = List(1, 5, 6, 7)

scala> val ls = list ++ lst
ls: List[Int] = List(1, 2, 3, 4, 1, 5, 6, 7)

//将lst插入到list前生成一个新的list
scala> val ls2 = lst ++: list
ls2: List[Int] = List(1, 5, 6, 7, 1, 2, 3, 4)

下面是可变序列

//导入可变集合的所有包
scala> import scala.collection.mutable._
import scala.collection.mutable._

//创建可变序列(list)
scala> val lst = ListBuffer[Int]()
lst: scala.collection.mutable.ListBuffer[Int] = ListBuffer()

//直接赋值初始化
scala> val lst2 = ListBuffer(4,5,6,7)
lst2: scala.collection.mutable.ListBuffer[Int] = ListBuffer(4, 5, 6, 7)
//添加元素,以下有两种方式添加元素。注意:没有生成新的集合
scala> lst += 1
res58: lst.type = ListBuffer(1)

scala> lst += 2
res59: lst.type = ListBuffer(1, 2)

scala> lst.app
append        appendAll     apply         applyOrElse

scala> lst.append
append      appendAll

scala> lst.append(3,4)

scala> lst
res61: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4)

// 将lst2中元素追加到lst中,注意:没有生成新的集合
scala> lst ++= lst2
res62: lst.type = ListBuffer(1, 2, 3, 4, 4, 5, 6, 7)

scala> lst
res63: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 4, 5, 6, 7)

//两个集合合并,生成了新的集合
scala> val lst3 = lst ++ lst2
lst3: scala.collection.mutable.ListBuffer[Int] = ListBuffer(1, 2, 3, 4, 4, 5, 6, 7, 4, 5, 6, 7)

2)、Set
不可变Set

scala> import scala.collection.immutable._
import scala.collection.immutable._

scala> val s1 = new HashSet[Int]()
s1: scala.collection.immutable.HashSet[Int] = Set()

//将元素1和s1合并生成一个新的set,原有set不变
scala> s1 + 1
res64: scala.collection.immutable.HashSet[Int] = Set(1)

//发现原来的set中还是空
scala> s1
res65: scala.collection.immutable.HashSet[Int] = Set()

scala> res64
res66: scala.collection.immutable.HashSet[Int] = Set(1)

//创建set的时候直接初始化
//重复的元素会去掉
scala> val set1 = Set(1,2,3,3)
set1: scala.collection.immutable.Set[Int] = Set(1, 2, 3)

//两个set相加,生成新的set,重复的元素会自动去掉,且元素排序不是按加入的时候顺序,这样这是set的特性
scala> val set2 = set1 ++ Set(3,4,5)
set2: scala.collection.immutable.Set[Int] = Set(5, 1, 2, 3, 4)

可变set

scala> import scala.collection.mutable._
import scala.collection.mutable._

scala> val set1 = Set(1,2,3,3)
set1: scala.collection.mutable.Set[Int] = Set(1, 2, 3)

//两种方式添加元素,不会生成新的set
scala> set1.add(4)
res69: Boolean = true

scala> set1 += 5
res70: set1.type = Set(1, 5, 2, 3, 4)

scala> set1
res71: scala.collection.mutable.Set[Int] = Set(1, 5, 2, 3, 4)

//删除元素的两种方式
scala> set1 -= 5
res72: set1.type = Set(1, 2, 3, 4)

scala> set1.remove(4)
res73: Boolean = true

scala> set1
res74: scala.collection.mutable.Set[Int] = Set(1, 2, 3)

3)、map
这里只演示可变map了,都是跟上面一样,操作跟java集合操作类似(需要导入可变集合的包,上面已经导入过)

//创建可变map
scala> val map = new HashMap[String,Int]
map: scala.collection.mutable.HashMap[String,Int] = Map()

//两种方式添加元素,不会生成新的集合
scala> map("zs") = 88

scala> map("ls") = 87

scala> map
res81: scala.collection.mutable.HashMap[String,Int] = Map(zs -> 88, ls -> 87)

scala> map.put("ww",99)
res82: Option[Int] = None

scala> map
res83: scala.collection.mutable.HashMap[String,Int] = Map(ww -> 99, zs -> 88, ls -> 87)

//两种方式移除元素,不会生成新的集合


scala> map -= "ww"
res84: map.type = Map(zs -> 88, ls -> 87)

scala> map.remove("zs")
res85: Option[Int] = Some(88)

scala> map
res86: scala.collection.mutable.HashMap[String,Int] = Map(ls -> 87)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Scala与Java的关系 Scala与Java的关系是非常紧密的!! 因为Scala是基于Java虚拟机,也就是...
    灯火gg阅读 3,417评论 1 24
  • 1.1. 什么是Scala Scala是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特...
    文子轩阅读 1,519评论 1 3
  • 可变和不可变集合 Scala中的集合可分为可变集合和不可变集合。可变集合可以当场被更新,不可变集合本身是不可变的。...
    liqing151阅读 200评论 0 0
  • 无论处于世界何地,是富有还是贫穷,是健康还是疾病,是官员还是百姓,生命都是独一无二的。你就是你,我就是我,他就是他...
    精进的医生阅读 383评论 6 6
  • 还是别人的,我没有这么好的文笔; 在某一个阶段你缺乏的,没有及时得到的东西,在日后一定会找你来讨债,或许是未曾满足...
    霖临说阅读 482评论 0 49