之前我写了写12章的练习感觉还不错,链接地址为:http://www.ptbird.cn/kuaixue-scala-answer-chapter-12/,所以我又把13章"集合"的练习写了一下。

啰嗦

这个不是标准答案,只是我自己根据本章内容实现了练习的目的,也不是最优解。

练习1 产生一个包含所有字符的下标的映射

例如:"Mississippi" 应该生成'M'->{0},'i'->{1,4,7,10},以此类推。

这个我还是花了点时间,一直没想到好的解决办法,我觉得我的办法还可以再优化一下
他问怎样保证集是排序过的,我反正顺序访问和追加一定是排序过的


    //练习 1 LX13_1
    //集由于顺序访问和追加一定是排序的
    def LX13_1(s: String): scala.collection.mutable.Map[Char, Set[Int]] = {
        var tmpMap =scala.collection.mutable.Map[Char, Set[Int]]()
        s.zipWithIndex.foreach(i =>{
            tmpMap(i._1)= tmpMap.getOrElse(i._1,Set[Int]())+(i._2)
        })
        tmpMap
    }
    //测试函数
     LX13_1("Mississippi").foreach(i=>{
     //println(i._1+" "+i._2.mkString("{",",","}"))
//         M {0}
//         s {2,3,5,6}
//         p {8,9}
//         i {1,4,7,10}
 })

 

练习2 把练习1的集变成列表,同样是产生映射

偷懒的实现了,顺序是反序的,reverse很简单


//练习2 LX13_2
    //偷懒 得到的是反序的
    def LX13_2(s:String):scala.collection.mutable.Map[Char,List[Int]]={
        var tmpMap =scala.collection.mutable.Map[Char, List[Int]]()
        s.zipWithIndex.foreach(i =>{
            tmpMap(i._1)= i._2::tmpMap.getOrElse(i._1,List[Int]())
        })
        tmpMap
    }
    //测试函数
    LX13_2("Mississippi").foreach(i=>{
        println(i._1+" "+i._2.mkString("{",",","}"))
    })

 

练习3 从整形链表中去除所有的0

LinkedList已经不建议使用了。。。


 //练习3 LX13_3
    //这是我能想到的比较合理的实现 不过linkedlist已经不赞成使用了
    import scala.collection.mutable.LinkedList
    def LX13_3(linkedList:LinkedList[Int]):LinkedList[Int]={
        var tmp=linkedList
        var res=LinkedList[Int]()
        while(tmp !=Nil){
            if(tmp.elem!=0){
                res=res++LinkedList(tmp.elem)
            }
            tmp=tmp.next
        }
        res
    }
//    LX13_3(LinkedList(1,2,0,3,4,0,5,6,0,1)).foreach(println(_))
//    LX13_3(LinkedList(1,2,0,3,4,0,5,6,0)).foreach(println(_))
//    LX13_3(LinkedList(1,2,0,0,4,0,5,6,0)).foreach(println(_))

 

练习4 从一个字符串的数组中去匹配一个[String,Int]的Map,将值也就是Int再生成一个集返回

一般来说,首先考虑的回事getOrElse,不过我直接先filter,这样子就不需要判断是否有值了


def LX13_4(name:Array[String],nameM:Map[String,Int])={
       var res=Set[Int]()
       name.filter(i=>{nameM.keys.toList.contains(i)}).foreach(i=>{res=res++nameM.get(i).toList})
       res
   }
    val nameArr=Array("scala","spark","flink")
    val nameMap=Map("scala"->1,"flink"->2)
   println(LX13_4(nameArr,nameMap).mkString("(",",",")"))

 

练习5 用reduceLeft实现一个mkString相似的函数,我没有用trait去混入,就写了个函数

这个比较简单,一直重写就行。


def LX13_5(seq:Seq[Any]):String={
        seq.reduceLeft(_+""+_).toString
    }
    def LX13_5(seq:Seq[Any],str:String):String={
        seq.reduceLeft(_+str+_).toString
    }
    def LX13_5(seq:Seq[Any],start:String,str:String,end:String):String={
        start+seq.reduceLeft(_+str+_).toString+end
    }
    val tmpList=List[Int](1,2,3,4,5,6)
//    println(LX13_5(tmpList))
    //    println(LX13_5(tmpList,"+"))
      println(LX13_5(tmpList,"{",",","}"))

 

练习6 利用(List[Int]()/:tmpList2)(_ :+ _)或者(List[Int]()/:tmpList2)(_ :+ _)反序一个list

原题首先问了(List[Int]()/:tmpList2)(_ :+ _)和 (List[Int]()/:tmpList2)(_ :+ _) 会有什么结果 结果是一样的顺序序列,不一样的表达而已
自己太懒了。。。


  //练习6
    val tmpList2=List(1,2,3,4,4,5,6,7,7)
    //两个结果一样 只不过是不同的表达方式而已
    //都是重新建了一个一样的list
  (tmpList2:\List[Int]())(_ :: _).foreach(println(_))
  (List[Int]()/:tmpList2)(_ :+ _).foreach(println(_))
    //修改 反序
    //终极偷懒方式。。。哈哈哈哈哈
 (List[Int]()/:tmpList2.toVector.reverse.toList)((a,b)=>{a:+b}).foreach(println(_))

 

练习7 利用Function.tuple实现map接受一个元组

之前12章写过一个这样的函数,Function.tuple可以直接实现,不过我不是很确定是不是需要隐式转换,因为我这样写也不是很"优雅"


     val prices=List(5.0,20.0,9.95)
    val quantities=List(10,2,1)
    //12章的时候已经写过一个了  貌似这个直接就可以 坑啊。。
   (prices zip quantities).map(Function.tupled(_ * _)).foreach(println(_))

 

练习8 Double数组转换成N维数组

使用group可以直接实现


    //练习8 LX13_8
    def LX13_8(doubleArr:Array[Double],num:Int)={
        doubleArr.grouped(num)
    }
    val tmpArr=Array[Double](2.00,3.12,3.123,5.2,234,123.123)
  LX13_8(tmpArr,3).foreach(i=>i.foreach(println(_)))

9 和 10我就不写出来了,没啥写的

代码

我在码云存了一份代码片段:

码云可以存代码片段这个还是很不错的,github没有这个功能

git@osc:https://git.oschina.net/postbird/codes/mfcz01ltx4gsbn863uahv39

 

如果有任何更好的意见或建议欢迎联系我:http://contact.ptbird.cn