购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

1.4 集合

Scala集合分为可变集合和不可变集合。可变集合可以对其中的元素进行修改、添加、移除;而不可变集合永远不会改变,但是仍然可以模拟进行添加、移除或更新操作。这些操作都会返回一个新的集合,原集合的内容不发生改变。

1.4.1 数组

Scala中的数组分为定长数组和变长数组,定长数组初始化后不可对数组长度进行修改,而变长数组则可以修改。

1.定长数组

(1)数组定义

定义数组的同时可以初始化数据,代码如下:

    val arr=Array(1,2,3)  //自动推断数组类型

或者

    val arr=Array[Int](1,2,3)  //手动指定数据类型

也可以在定义时指定数组长度,稍后对其添加数据,代码如下:

    val arr=new Array[Int](3)
    arr(0)=1
    arr(1)=2
    arr(2)=3

(2)数组遍历

可以使用for循环对数组进行遍历,输出数组所有的元素,代码如下:

    val arr=Array(1,2,3)
    for(i<-arr){
      println(i)
    }

(3)常用方法

Scala对数组提供了很多常用的方法,使用起来非常方便,代码如下:

    val arr=Array(1,2,3)
    //求数组中所有数值的和
    val arrSum=arr.sum
    //求数组中的最大值
    val arrmAx=arr.max
    //求数组中的最小值
    val arrMin=arr.min
    //对数组进行升序排序
    val arrSorted=arr.sorted
    //对数组进行降序排序
    val arrReverse=arr.sorted.reverse

2.变长数组

(1)数组定义

变长数组使用类scala.collection.mutable.ArrayBuffer进行定义,例如以下代码:

    //定义一个变长Int类型数组
    val arr=new ArrayBuffer[Int]()
    //向其中添加3个元素
    arr+=1
    arr+=2
    arr+=3
    println(arr)

上述代码输出结果为:

    ArrayBuffer(1, 2, 3)

也可以使用-=符号对变长数组中的元素进行删减,例如,去掉数组arr中值为3的元素:

    arr-=3

若数组中有多个值为3的元素,则从前向后删除第一个匹配的值。

(2)数组合并

Scala支持使用++=符号将两个变长数组进行合并,例如,将数组a2的所有元素追加到数组a1中,代码如下:

    val a1=ArrayBuffer(1,2,3,4,5)
    val a2=ArrayBuffer(6,7)
    println(a1++=a2)

输出结果如下:

    ArrayBuffer(1, 2, 3, 4, 5, 6, 7)

(3)在固定位置插入元素

使用insert()方法可以在数组指定的位置插入任意多个元素,例如,在数组arr的下标为0的位置插入两个元素1和2,代码如下:

    arr.insert(0,1,2)

(4)在固定位置移除元素

使用remove()方法可以在数组的固定位置移除指定数量的元素,例如,从数组arr的下标为1的位置开始移除两个元素,代码如下:

    val arr=ArrayBuffer[Int](1,2,3,4,5)
    arr.remove(1, 2)
    println(arr)

输出结果如下:

    ArrayBuffer(1, 4, 5)

1.4.2 List

Scala中的List分为不可变List和可变List,默认为不可变List。不可变List也可以增加元素,但实际上生成了一个新的List,原List不变。

1.不可变List

例如,创建一个Int类型的List,名为nums,代码如下:

    val nums: List[Int] = List(1, 2, 3, 4)

在该List的头部追加一个元素1,生成一个新的List,代码如下:

    val nums2=nums.+:(1)

在该List的尾部追加一个元素5,生成一个新的List,代码如下:

    val nums3=nums:+5

List也支持合并操作,例如,将两个List合并为一个新的List,代码如下:

    val nums1: List[Int] = List(1, 2, 3)
    val nums2: List[Int] = List(4, 5, 6)
    val nums3=nums1++:nums2
    println(nums3)

输出结果如下:

    List(1, 2, 3, 4, 5, 6)

此外,常用的还有二维List:

    //二维List
    val dim: List[List[Int]] =
       List(
         List(1, 0, 0),
         List(0, 1, 0),
         List(0, 0, 1)
       )

2.可变List

可变List需要使用scala.collection.mutable.ListBuffer类。

例如,创建一个可变List并初始化数据:

    val listBuffer= ListBuffer(1, 2, 3)

或者创建时不初始化数据,而是通过后面添加元素:

    val listBuffer= new ListBuffer[Int]()
    listBuffer+=1
    listBuffer+=2
    listBuffer+=3

也可以将两个List进行合并:

    val listBuffer= ListBuffer(1, 2, 3)
    val listBuffer3= ListBuffer(4, 5, 6)
    println(listBuffer++listBuffer3)

输出结果为:

    ListBuffer(1, 2, 3, 4, 5, 6)

1.4.3 Map映射

Scala中的Map也分不可变Map和可变Map,默认为不可变Map。

1.不可变Map

创建一个不可变Map的代码如下:

    val mp = Map(
       "key1" -> "value1",
       "key2" -> "value2",
       "key3" -> "value3"
    )

也可以使用以下写法:

    val mp = Map(
       ("key1" , "value1"),
       ("key2" , "value2"),
       ("key3" , "value3")
    )

循环输出上述Map中的键值数据的代码如下:

    mp.keys.foreach {
       i =>
         print("Key = "+i)
         println(" Value = "+mp(i))
    }

也可以使用for循环代替:

    for((k,v)<-mp){
       println(k+":"+v)
    }

2.可变Map

创建可变Map需要引入类scala.collection.mutable.Map,创建方式与上述不可变Map相同。

如果要访问Map中key1的值,代码如下:

    val mp = Map(
       ("key1" , "value1"),
       ("key2" , "value2")
    )
    println(mp("key1"))

若键key1不存在则返回-1:

    if(mp.contains("key1"))
        mp("key1")
    else
        -1

上述代码也可以使用getOrElse()方法代替,该方法第一个参数表示访问的键,第二个参数表示若值不存在,则返回的默认值:

    mp.getOrElse("key1", -1)

若要修改键key1的值为value2,代码如下:

    mp("key1")="value2"

上述代码中,当key1存在时执行修改操作,若key1不存在,则执行添加操作。

当然,向Map中添加元素也可以使用+=符号,代码如下:

    mp+=("key3" -> "value3")

或者

    mp+=(("key3","value3"))

相对应的,从Map中删除一个元素可以使用-=符号,代码如下:

    mp-="key3"

1.4.4 元组

元组是一个可以存放不同类型对象的集合,元组中的元素不可以修改。

1.定义元组

例如,定义一个元组t:

    val t=(1,"scala",2.6)

也可以使用以下方式定义元组,其中Tuple3是一个元组类,代表元组的长度为3:

    val t2 = new Tuple3(1,"scala",2.6)

目前,Scala支持的元组最大长度为22,即可以使用Tuple1到Tuple22。元组的实际类型取决于元素数量和元素的类型。例如,(20,"shanghai")的类型是Tuple2[Int,String],(10,20,"beijing","shanghai","guangzhou")的类型是Tuple5[Int,Int,String,String,String]。

2.访问元组

可以使用方法_1、_2、_3访问其中的元素。例如,取出元组中第一个元素:

    println(t._1)

与数组和字符串的位置不同,元组的元素下标从1开始。

3.迭代元组

使用Tuple.productIterator()方法可以迭代输出元组的所有元素:

    val t = (4,3,2,1)
    t.productIterator.foreach{ i =>println("Value = " + i )}

4.元组转为字符串

使用Tuple.toString()方法可以将元组的所有元素组合成一个字符串:

    val t = new Tuple3(1, "hello", "Scala")
    println("连接后的字符串为: " + t.toString() )

上述代码输出结果为:

    连接后的字符串为: (1,hello,Scala)

1.4.5 Set

Scala Set集合存储的对象不可重复。Set集合分为可变集合和不可变集合,默认情况下,Scala使用的是不可变集合,如果要使用可变集合,就需要引用scala.collection.mutable.Set包。

1.集合定义

可以使用如下方式定义一个不可变集合:

    val set = Set(1,2,3)

2.元素增减

与List集合一样,对于不可变Set进行元素的增加和删除实际上会产生一个新的Set,原来的Set并没有改变,代码如下:

    //定义一个不可变Set集合
    val set = Set(1,2,3)
    //增加一个元素
    val set1=set+4
    //减少一个元素
    val set2=set-3
    println(set)
    println(set1)
    println(set2)

上述代码输出结果如下:

    Set(1, 2, 3)
    Set(1, 2, 3, 4)
    Set(1, 2)

3.集合方法

常用的集合方法如下:

    val site = Set("Ali", "Google", "Baidu")
    //输出第一个元素
    println(site.head)
    //取得除了第一个元素外所有元素的集合
    val set2=site.tail
    println(set2)
    //查看元素是否为空
    println(site.isEmpty)

使用++运算符可以连接两个集合:

    val site1 = Set("Ali", "Google", "Baidu")
    val site2 = Set("Faceboook", "Taobao")
    val site=site1++site2
    println(site)

上述代码输出结果为:

    Set(Faceboook, Taobao, Google, Ali, Baidu)

使用Set.min方法可以查找集合中的最小元素,使用Set.max方法可以查找集合中最大的元素,代码如下:

    val num = Set(5,8,7,20,10,66)
    //输出集合中的最小元素
    println(num.min)
    //输出集合中的最大元素
    println(num.max)

可以使用Set.&方法或Set.intersect方法查看两个集合的交集元素,代码如下:

    val num1 = Set(5,2,9,10,3,15)
    val num2 = Set(5,6,10,20,35,65)
    //输出两个集合的交集元素
    println(num1.&(num2))
    //输出两个集合的交集元素
    println(num1.intersect(num2))

上述代码输出结果为: RfsAjT87Ytp7hoHZyllG4paqHF2X9vprQYOqG1z78Vzyvqx0Oa1EmRMfsqHkOsEK

    Set(5, 10)
    Set(5, 10)
点击中间区域
呼出菜单
上一章
目录
下一章
×