Scala函数编程之集合操作

 Scala的集合体系结构
   Scala中的集合体系主要包括: Iterable 、Seq、Set、Map 。其中Iterable是所有集合trait的根trait。这个结构与Java的集合体系非常相似。

  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(_ + _)

代码如下:



猜你喜欢

转载自blog.csdn.net/m0_37564404/article/details/80787398