Scala-集合

目录
    1.可变集合和不可变集合
    2.列表
    3.序列
    4. 集(Set)和集的操作
    5.模式匹配
    6.样本类(CaseClass)

1.可变集合和不可变集合
(1)可变集合:
(2)不可变集合:
  • 集合从不改变,因此可以安全地共享其引用。
  • 甚至是在一个多线程的应用程序当中也没问题。
//不可变的集合
val math = scala.collection.immutable.Map("Alice"->80,"Bob"->90,"Mary"->85)

//可变的集合
val english = scala.collection.mutable.Map("Alice"->80,"Bob"->90,"Mary"->85)
val chinese = scala.collection.mutable.Map("Alice"->80,"Bob"->90,"Mary"->85)

(3)集合的操作:


a.获取集合中的值

chinese.get("Bob")

chinese.get("Tomdfsdfd")

chinese("Bob")

chinese.getOrElse("Tomsdlkfjlskdjfls",-1)

chinese("Tomdfsdfd")

获取集合中的值

b.更新集合中的值:注意:必须是一个可变集合

chinese

chinese("Bob")=0

chinese

math

math("Bob")=0

更新集合元素

c.添加新元素

chinese += "Tom"->85

添加新元素
d.移除元素

chinese -= "Bob"

移除元素

2.列表
(1)不可变列表(List)
//不可变列表:List
//字符串列表
val namelist = List("Bob","Mary","Mike")
//整数列表
val intList = List(1,2,3,4,5)
//空列表
val nullList:List[Nothing] = List()
//二维列表
val dim:List[List[Int]] = List(List(1,2,3),List(4,5,6))

不可变列表

不可变列表的相关操作
a.head:列表中的第一个元素

//输出列表中的值:head,tail,isEmpty
println("第一个人的名字:"+namelist.head)

b.tail:不是返回最后一个元素,而是返回除去第一个元素后,剩下的元素列表

println(namelist.tail)

c.isEmpty:判断列表是否为空

println("列表是否为空:"+namelist.isEmpty)

不可变列表的相关操作

(2)可变列表(LinkedList):scala.collection.mutable.LinkedList

LinkedList和不可变列表List类似,只不过我们可以修改列表中的值

//可变列表:
val myList = scala.collection.mutable.LinkedList(1,2,3,4,5)
//操作:将上面可变列表中的每个值乘以2
//列名 elem
//定义一个指针指向列表的开始
var cur = myList

//Nil:代表Scala中的null
while(cur != Nil){
  cur.elem = cur.elem*2
  //将指针指向下一个元素
  cur = cur.next
}
//查看结果
println(myList)

myList

myList.map(_*2)


移除元素

myList.drop(2)

myList.dropWhile(_%2!=0)

dropWhile 去除当前数组中,符合条件的元素,碰到第一个不满足条件的元素,就结束。

3.序列

常用的序列有:Vector和Range

(1)Vector是ArrayBuffer的不可变版本,是一个带下标的序列
//Vector:为了提高list列表随机存取的效率而引入的新的集合类型
//支持快速的查找和更新
val v= Vector(1,2,3,4,5,6)

//返回的是第一个满足条件的元素
v.find(_>3)
v.updated(2,1000)

Vector

(2)Range表示一个整数序列
//Range:有序的通过空格分割的Int序列
//以下几个例子Range是一样

Range(0,5)
println("第一种写法:"+Range(0,5))
println("第二种写法:"+(0 until 5))
println("第三种写法:"+(0 to 4))

//两个range可以相加
('0' to '9')++('A' to 'Z')

//可以将Range转换为List
1 to 5 toList

Range

4. 集(Set)和集的操作
  • 集Set是不重复元素的集合
  • 和列表不同,集并不保留元素插入的顺序。默认是HashSet
(1)示例1:创建集
//a.**创建一个Set**
var s1 = Set(2,0,1)

//往s1中添加一个重复元素
s1+1

//往s1中添加一个不重复元素
s1+100

//创建一个LinkedHashSet,一定要先import下面这个,否则会保错
import collection.mutable
var weeksday = mutable.LinkedHashSet("星期一","星期二","星期三","星期四")

//创建一个排序的集
var s2 = mutable.SortedSet(1,2,3,10,4)

(2)示例2:集的操作

a.添加

weeksday+"星期五"

b.判断元素是否存在

weeksday contains("星期二")

c.判断一个集是否是另一个集的子集

Set("星期二","星期四","星期日") subsetOf(weeksday)

d.集的运算,union并集,intersect交集,diff差集

var set1=Set(1,2,3,4,5)

var set2=Set(5,6,7,8,9,10)
//并集:集合相加,去掉重复元素
set1 union set2
//intersect交集
set1 intersect set2
//差集
set1 diff set2

集的操作

5.模式匹配
(1)Scala有一个强大的模式匹配机制,可以应用在很多场合:
  • switch语句
  • 类型检查
(2)Scala还提供了样本类(case class),对模式匹配进行了优化
(3)模式匹配示例:
  • 更好的switch
//更好的switch
var sign =0

var ch1 = '-'

ch1 match{
  case '+' => sign = 1
  case '-' =>sign = -1
  case _ =>sign = 0
}
println(sign)

(4)Scala的守卫:匹配某种类型的所有值
//scala的守卫:匹配某种类型的所有值
var ch2='6'
var digit:Int = -1
ch2 match{
  case '+' => println("这是一个+")
  case '-' => println("这是一个-")
  case _ if Character.isDigit(ch2) => digit = Character.digit(ch2,10)
 case _ => println("其他类型")
}

println("Digit:"+digit)

(5)模式匹配中的变量
//模式匹配的变量
var str3 = "Hello World"

str3(7) match{
  case '+' => println("这是一个+")
  case '-' => println("这是一个+")
  case ch => println("这是字符:"+ch)
}

(6)类型模式
//类型模式
var v4:Any =100
v4 match{
  case x:Int => println("这是一个整数:"+x)
  case s:String => println("这是一个字符串:"+s)
  case _ => println("这是其他类型")
}

(7)匹配数组和列表
//匹配数组和列表
var myArray = Array(1,2,3)
myArray match{
  case Array(0) => println("0")
  case Array(x,y) =>println("这是数组包含的两个元素,和是:"+(x+y))
  case Array(x,y,z) => println("这是数组包含的三个元素,乘积是:"+(x*y*z))
  case Array(x,_*) => println("这是一个数组")
}

var myList = List(1,2,3)
myList match{
  case List(0) => println("0")
  case List(x,y) =>println("这是列表包含的两个元素,和是:"+(x+y))
  case List(x,y,z) =>println("这是列表包含的三个元素,乘积是:"+(x*y*z))
  case List(x,_*) => println("这个列表包含多个元素")
}

6.样本类(CaseClass)

    简单的来说,Scala的case class就是在普通的类定义前加case这个关键字,然后你可以对这些类来模式匹配。

case class带来的最大的好处是它们支持模式识别。

    首先,回顾一下前面的模式匹配:

普通的模式匹配

    其次,如果我们想判断一个对象是否是某个类的对象,跟Java一样可以使用isInstanceOf

下面这个好像有点问题

最后,在Scala中有一种更简单的方式来判断,就是case class

注意:需要在class前面使用case关键字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值