Scala 集合

来源:互联网 发布:网络暴力的例子 编辑:程序博客网 时间:2024/06/08 17:52

基本介绍

Scala拥有丰富的集合库。集合是一种用来存储各种对象和数据的容器。 这些容器可以被排序,诸如列表,元组,选项,映射等的线性集合。集合可以具有任意数量的元素或被限制为零或一个元素(例如,Option)。
集合可以是严格的(strict)或懒惰的(Lazy)。 懒惰集合的元素在访问之前可能不会使用内存,例如Ranges。 此外,集合可能是可变的(引用的内容可以改变)或不可变的(引用引用的东西从不改变)。 请注意,不可变集合可能包含可变项目。


Scala列表与数组非常相似,列表的所有元素都具有相同的类型,但有两个重要的区别。 首先,列表是不可变的,列表的元素不能通过赋值来更改。 其次,列表表示一个链表,而数组是平的。具有类型T的元素的列表的类型被写为List[T]。示例如下:

val fruit: List[String] = List(“apples”, “oranges”, “pears”) //String格式的val empty: List[Nothing] = List()//空列表val dim: List[List[Int]] = List( List(1, 0, 0), List(0, 1, 0), List(0, 0, 1) ) //二维列表

所有列表都可以使用两个基本构建块定义,尾部为Nil和::,如下

val fruit = “apples”::(“oranges”::(“pears”::Nil))   //String 格式的val empty = Nil     //空列表val dim = (1::(0::(0::Nil))) :: (0::(1::(0::Nil))) :: (0::(0::(1::Nil)))::Nil    //二维列表

可以使用:::操作符或List.:::()方法添加两个或多个列表,如下:

val fruit1 = “apples”::(“oranges”::(“pears”::Nil)) val fruit2 = “mangoes”::(“banana”::Nil)var fruit = fruit1 ::: fruit2 或者 fruit = fruit1.:::(fruit2)
  注意::::和::操作符,一个针对的是列表,一个针对的是单个元素,他们是定义在List类上的方法,必须要有List去调用.

Set

Set是相同类型的不同元素的集合。换句话说,一个集合是不包含重复元素的集合。 集合有两种:不可变(immutable)和可变(mutable)。可变对象和不可变对象之间的区别在于,当对象不可变时,对象本身无法更改。
默认情况下,Scala使用不可变的集合(Set)。 如果要使用可变集合(Set),则必须明确导入scala.collection.mutable.Set类。 如果要在同一集合中使用可变集合和不可变集合,则可以继续引用不可变集作为集合(Set),但可以将可变集合称为mutable.Set。示例如下:
var s : Set[Int] = Set() //空的int类型的集合
var s : Set[Int] = Set(1,3,5,7)或者var s = Set(1,3,5,7) //int类型的集合

数据操作

不可变集合的数据添加只能通过s+=的方式
可变集合的数据添加还可以通过s.add的方式
集的访问
通过for循环进行访问 for(c<-set) println(c)
转换为列表进行数据获取site.toList(0)
返回缓冲区,包含了所有元素site.toBuffer(0)
head:此方法返回集的第一个元素 println(fruit.head)
tail:此方法返回由除第一个之外的所有元素组成的集。
println(fruit.tail)
isEmpty如果集为空,则此方法返回true,否则返回false
println(fruit.isEmpty)
使用++运算符或Set.++()方法连接两个或多个集合,但是在添加集合时将删除重复的元素
val fruit1 = Set(“apples”, “oranges”) val fruit2 = Set(“mangoes”, “banana”)
var fruit = fruit1 ++ fruit2或者fruit = fruit1.++(fruit2)
使用Set.min方法和Set.max方法来分别找出集合中元素的最大值和最小值
使用Set.&或Set.intersect方法来查找两个集合之间的交集(相交值)
val num1 = Set(5,6,9,20,30,45) val num2 = Set(50,60,9,20,35,55)
num1.&(num2)或者num1.intersect(num2)

Map

  • 映射(Map)是一组键/值对的对象。 任何值都可以根据键来进行检索。键在映射中是唯一的,但值不一定是唯一的。映射也称为哈希表。映射有两种,不可变的和可变的。可变对象和不可变对象之间的区别在于,当对象不可变时,对象本身无法更改。
  • 默认情况下,Scala使用不可变映射(Map)。如果要使用可变映射(Map),则必须明确导入scala.collection.mutable.Map类。如果想同时使用可变的和不可变映射(Map),那么可以继续引用不可变映射(Map),但是可以将mutable集合引用mutable.Map。
    示例如下:
var A:Map[Char,Int] = Map()       //空的映射,其中key是char,value是Int类型   val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")
  • 数据添加
    在定义空的映射(Map)时,类型注释是必需的,因为系统需要将具体的类型分配给变量。 如果我们要向映射(Map)添加一个键值对,可以使用运算符+,如下所示:
A + = ('I' -> 1)A + = ('J' -> 5)
  • 操作方法
    • 访问元素的方法,如果映射并不包含请求中使用的键,则会抛出异常
 amap(“key”) amap.get(“key”) amap.contains(“key”)  //要检查映射中是否有某个指定的键,可以用contains方法amap.getOrElse(“key”,0)   //直接用getOrelse方法访问映射val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF","peru" -> "#CD853F") colors.keys.foreach{ i => print( "Key = " + i ) println(" Value = " + colors(i) )}

keys,此方法返回包含映射中每个键的迭代
values,此方法返回一个包含映射中每个值的迭代。
isEmpty,如果列表为空,则此方法返回true,否则返回false

元组

  • Scala元组将固定数量的项目组合在一起,以便它们可以作为一个整体传递。 与数组或列表不同,元组可以容纳不同类型的对象,但它们也是不可变的。定义如下:
    val t = new Tuple3(1, “hello”, Console)或者
    val t = (1, “hello”, Console)
  • 元组的实际类型取决于它包含的数量和元素以及这些元素的类型。
    (99,“Luftballons”)的类型是Tuple2 [Int,String]。
    (‘u’,‘r’,“the”,1,4)是Tuple5 [Char,Char,String,Int,Int]。
  • 目前 Scala 支持的元组最大长度为 22。对于更大长度你可以使用集合,或者扩展元组。
  • 元组数据的访问(从1开始而不是0,访问的格式 .或 空格)
    例如使用t._1方法访问第一个元素,t._2方法访问第二个元素,依此类推。
  • 可以使用Tuple.productIterator()方法遍历元组的所有元素。
    t.productIterator.foreach{ i =>println(“Value = ” + i )}

选项

  • Scala Option(选项)类型用来表示一个值是可选的(有值或无值)。
  • Option[T] 是一个类型为 T 的可选值的容器: 如果值存在, Option[T] 就是一个 Some[T] ,如果不存在, Option[T] 就是对象 None 。示例如下:
    “`
    val myMap: Map[String, String] = Map(“key1” -> “value”)
    val value1: Option[String] = myMap.get(“key1”)
    val value2: Option[String] = myMap.get(“key2”)
    println(value2) // None

    “`
    在上面的代码中,myMap 是一个 Key 的类型是 String,Value 的类型是 String 的 hash map,但不一样的是 get() 返回的是一个叫 Option[String] 的类别。
    使用 Option[String] 的意思是说我会想办法回传一个 String,但也可能没有 String 给你。myMap 里并没有 key2 这个数据,get() 方法返回 None。Option 有两个子类别,一个是 Some,一个是 None,当他回传 Some 的时候,代表这个函式成功地给了你一个 String,而你可以透过 get() 这个函式拿到那个 String,如果他返回的是 None,则代表没有字符串可以给你

原创粉丝点击