Scala中的集合是分成可变和不可变两类集合的, 其中可变集合是说 ,集合的元素可以动态修改,而不可变集合的元素在初始化之后就无法修改了。分别对应scala.collection.mutable和scala.collection.immutable两个包。
Seq下包含了Range、ArrayBuffer、List等子trait ,其中Range就代表了一个序列,通常可以使用"1 to 10" 这种语法来产生一个Range。
ArrayBuffer就类似与Java中的ArrayList
下面将细述每个集合。
-- List
// List代表一个不可变的的列表
// List的创建,val list=List(1,2,3,4)
// List 有head和tail ,head代表List的第一个元素,tail代表第一个元素之后的所有元素
list.head ,list.tail
// List 有特殊的::操作符 ,可用于将head和tail合并成一个List ,0::list
// 如果一个List只有一个元素,那么它的head就是该元素,它的tail是Nil
// 案例:用递归函数来给List中的每个元素都加上指定前缀,并打印。
def decorator(l: List[Int],prefix:String){
if(l != Nil){
println(prefix+ l.head)
decorator(l.tail , prefix)
}
}
-- LinkedList
//LinkedList代表一个可变的列表,使用elem可以引用其头部,next可以引用其尾部。
val list=scala.collection.mutable.LinkedList(1,2,3,4,5)
list.elem ; list.next (list.tail也一样,但是在LinkedList中通常使用next)
// 案例: 使用while循环将LinkedList中的每一个元素都乘以2
val list=scala.collection.mutable.LinkedList(1,2,3,4,5)
var currentList =list
while(currentList != Nil){
currentList.elem =currentList.elem *2
currentList =currentList.next
}
// 案例: 使用while循环将LinkedList中,从第一个元素开始,每隔一个元素就乘以2
val list=scala.collection.mutable.LinkedList(1,2,3,4,5,6,7,8,9,10)
var currentList=list
currentList.elem =currentList.elem *2 //第一个元素
while(currentList != Nil && currentList.next != Nil){
currentList =currentList.next.next
currentList.elem =currentList.elem *2
}
代码展示如下:
案例二:
-- Set 代表一个没有重复元素的集合
// 将重复元素加入Set是没用的,比如val s=Set(1,2,3); s+1;s+4
// 而且Set是不保证插入顺序的 ,也就是说,Set中的元素是乱序的,比如 HashSet是根据哈希值存入的
s =new scala.collection.mutable.HashSet[Int]() ;s+=1;s+=2;s+=5
// LinkedHashSet 会用一个链表维护插入顺序,val s=new scala.collection.mutable.LinkedHashSet[Int]() ; s+=1;s+=2;s+=5
// SortedSet 会自动根据key来进行排序, val s=scala.collection.mutable.SortedSet("orange","apple","banana")
各使用如下:
-- 集合的函数式编程
//map案例实战 :为List中的每个元素都加上一个前缀。
List("leo","Jen","Peter","Jack").map("name is "+ _)
// flatMap案例实战 :将List中的多行句子拆分为单词
List("Hello world","You Me").flatMap(_.split(" "))
// foreach案例实战:打印List中的每个单词
List("I","hava","a","beautiful","house").foreach(println(_))
// zip案例实战: 对学生姓名和学生成绩进行关联
List("Leo","Jen","Peter","Jack").zip(List(100,90,75,83))
-- 综合案例 :单词计数
对两个文本的中单词数进行统计。
val lines1=scala.io.Source.fromFile("/root/test/test01.txt").mkString //读取一个文本中的内容
val lines2=scala.io.Source.fromFile("/root/test/test02.txt").mkString //读取给定文本的内容
val lines=List(lines1,lines2)
// 先将lines中的元素进行split操作,紧接着的map操作,将每个元素变成一个tuple ,("hello",1)
// 的形式, 再接着的map操作,_._2取出Int值 1 (_._1取出 "hello"),最后把新得到的list在进行从左到右的 reduce操作。
lines.flatMap(_.split(" ")).map( (_,1) ).map(_._2).reduceLeft(_ + _)
代码如下: