版权属于: Postbird - There I am , in the world more exciting!
原文地址: http://www.ptbird.cn/kuaixue-scala-answer-chapter-13.html
转载时必须以链接形式注明原始出处及本声明。
之前我写了写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