Spark大数据分析实战
上QQ阅读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,原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:

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))

上述代码输出结果为:

Set(5, 10)
Set(5, 10)