Scala中的集合与模式匹配

一、可变集合和不可变集合

  • 可变(mutable)集合
  • 不可变(immutable)集合:
    • 集合从不改变,因此可以安全地共享其引用。
    • 甚至是在一个多线程的应用程序当中也没问题。
object MapTest {
  def main(args: Array[String]): Unit = {
  	//定义不可变Map
    var immutableMap = scala.collection.immutable.Map("alice"->80,"bob"->90)
	//定义可变Map
    var mutableMap=scala.collection.mutable.Map("cllen"->100,"efos"->77)
	//如果key存在就输出value,如果可以不存在就报错
	//java.util.NoSuchElementException: key not found: efo1s
    println(immutableMap("alice"))
    println(mutableMap("efo1s"))

	//判断mike存不存在,存在输出value,不存在输出-1
    if(immutableMap.contains("mike")){
      print("mike")
    }else{
      println(-1)
    }
    //上面的简单写法
    println(mutableMap.getOrElse("lary",0))

	//对immutableMap的value进行修改
    var ee =(immutableMap("alice")=10)
    //报错
    println(immutableMap("alice"))
    //Error:(20, 14) value update is not a member of scala.collection.immutable.Map[String,Int]
    var ee =(immutableMap("alice")=10)
    //mutableMap值修改成功并可以输出value为20
    var dd= (mutableMap("efos")=20)
    println(mutableMap("efos"))

  }
}

涉及的集合操作:
(1)contains 对Map的key进行判断
(2)Map元素赋值操作

二、列表

2.1不可变列表(List)

在这里插入图片描述

不可变列表的相关操作:
在这里插入图片描述

scala> List(7,8,9).head
res41: Int = 7

scala> List(7,8,9).tail
res42: List[Int] = List(8, 9)

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

在这里插入图片描述

scala> scala.collection.mutable.LinkedList(1,2,3,4,5)
//warning: there was one deprecation warning; re-run with -deprecation for details 
//res45: scala.collection.mutable.LinkedList[Int] = LinkedList(1, 2, 3, 4, 5)
scala> scala.collection.mutable.LinkedList(1,2,3,4,5).map(_*2)
//warning: there were two deprecation warnings; re-run with -deprecation for details
//res46: scala.collection.mutable.LinkedList[Int] = LinkedList(2, 4, 6, 8, 10)

总结:scala中的mutable为可改变的,默认为不可改变。此时需要导入包。

三、序列

常用的序列有:Vector和Range。

  • Vector是ArrayBuffer的不可变版本,是一个带下标的序列。
    在这里插入图片描述

  • Range表示一个整数序列
    在这里插入图片描述

scala> Range(0,5)
//res49: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)

scala> 0 until 5
//res50: scala.collection.immutable.Range = Range(0, 1, 2, 3, 4)

scala> 0 to 5
//res51: scala.collection.immutable.Range.Inclusive = Range(0, 1, 2, 3, 4, 5)

scala> Range(0,5).toList
//res52: List[Int] = List(0, 1, 2, 3, 4)

scala> Range(0,5)++Range(0,5)
//res54: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4, 0, 1, 2, 3, 4)

四、集(Set)和集的操作

集Set是不重复元素的集合。
和列表不同,集并不保留元素插入的顺序。默认以Hash集实现。

  • 创建集
    在这里插入图片描述
scala> Set(2,1,1,2)
//res55: scala.collection.immutable.Set[Int] = Set(2, 1)

scala> scala.collection.mutable.LinkedHashSet("星期一","星期二","星期三")
//res56: scala.collection.mutable.LinkedHashSet[String] = Set(星期一, 星期二, 星期三)

scala> scala.collection.mutable.SortedSet(11,2,8,100,77)
//res57: scala.collection.mutable.SortedSet[Int] = TreeSet(2, 8, 11, 77, 100)
  • 集操作
    在这里插入图片描述
scala> scala.collection.mutable.SortedSet(11,2,8,100,77).contains(2)
		//res58: Boolean = true

scala> scala.collection.mutable.SortedSet(11,2,8,100,77).contains(200)
		//res59: Boolean = false
//并集,可以取出重复值
scala> Set(1,2,3,4,5) union Set(3,4,5,6,7)
		//res60: scala.collection.immutable.Set[Int] = Set(5, 1, 6, 2, 7, 3, 4)
//交集
scala> Set(1,2,3,4,5) intersect Set(3,4,5,6,7)
		//res61: scala.collection.immutable.Set[Int] = Set(5, 3, 4)
//差集
scala> Set(1,2,3,4,5) diff Set(3,4,5,6,7)
		//res63: scala.collection.immutable.Set[Int] = Set(1, 2)

五、模式匹配

Scala有一个强大的模式匹配机制,可以应用在很多场合:

  • switch语句
  • 类型检查
     var sign=99
     var ch1:Char='-'
     ch1 match {
       case '+' =>sign=1
       case '-'=>sign-1
       //如果是其它类型,则输出sign=0
       case _=>sign=0
     }

     println(sign)

Scala还提供了样本类(case class),对模式匹配进行了优化。

模式匹配示例:

  • 更好的switch
    在这里插入图片描述
  • Scala的守卫
    在这里插入图片描述
  • 模式匹配中的变量
    在这里插入图片描述
var str ="hello scala"
     str(7) match {
       case '+'=>println("这是一个+")
       case '-'=>println("这是一个-")
       case aa=>println("这是字符:"+aa)//c
     }
 //str(7)取0开始的编号为7的字符    
  • 类型模式
    在这里插入图片描述
     var str:Any ="hello scala"
     str match {
       case a:Int=>println("这是一个整数")
       case b:String=>println("这是一个字符串")
       case _=>println("其它类型")
     }
  • 匹配数组和列表
    在这里插入图片描述

在这里插入图片描述

    var str1=Array(1,2,3,4)
     str1 match {
       case Array(0)=>println("只有0")
       case Array(x,y)=>println("有两个元素")
       case Array(x,y,z)=>println("有三个元素")
       case _=>println("有很多元素")
     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值