def indexesSet(arg:String)={
var map=Map[String,SortedSet[Int]]();
var m:Int=0;
arg.foreach { x => if(map.contains(x.toString())) {map.get(x.toString()).get+=m;m=m+1;} else {val b=SortedSet[Int]();b+=m;map+=(x.toString()->b);m=m+1;}}
map;
}
2.重复之前一个练习,这次使用到列表的不可变映射
def indexesList(arg:String)={
var map=Map[String,ListBuffer[Int]]();
var m:Int=0;
arg.foreach { x => if(map.contains(x.toString())) {map.get(x.toString()).get+=m;m=m+1;} else {map+=(x.toString()->ListBuffer[Int](m)) ; m=m+1;}}
map;
}
3.编写一个函数从一个整形链表中去除零值
def delzero(list:List[Int])={
list.filter {_!=0}
}
def strMap(str:Array[String],map:Map[String,Int])={
str.flatMap { map.get(_) };
}
5.写一个函数,作用与mkstring相同,使用reduceLeft
def mkstr(str:Array[String],mk:String)={
str.reduceLeft{
(a,b) =>
a.toString()+mk+b.toString();
}
}
val list=List[Int](0,1,0,2,0,3);
println((list:\List[Int]()){
(a,b) =>
b:+a;
});
val f=(x:Double,y:Int)=>x*y;
val prices=List(5.0,20.0,9.95);
val quantities=List(10,2,1);
println(prices.zip(quantities).map(f.tupled));
8.编写一个将一维数组按照指定行数分割成二维数组的函数提示,使用grouped的方法
def divarr(arr:Array[Int],lineNum:Int)={
arr.grouped(lineNum).toArray;
}
并发修改共享集合会导致结果出错
10.在9的基础上实现正确的并发机制
需要注意的是修改共享的集合时使用par进行并发是不明智的,会导致结果不准确
另外aggregate函数是一个科里化函数,第一个参数为初始值,第二个括号中的两个参数,第一个是对分块区域进行处理的函数,第二个是合并时需要用到的函数,在对其内部函数实行不清楚时,推荐按照如下方式进行编写,方便理解
def seqop(map:HashMap[Char,Int],key:Char):HashMap[Char,Int]={
println("seqop:"+map+" "+key);
map(key)=map.getOrElse(key,0)+1;
println(map);
map;
}
def combop(map1:HashMap[Char,Int],map2:HashMap[Char,Int]):HashMap[Char,Int]={
val result=new HashMap[Char,Int];
println("combop:"+map1+" "+map2+map1.keySet++map2.keySet);
(map1.keySet++map2.keySet).foldLeft(result)({
(a,b)=> a(b)=a.getOrElse(b,0)+map1.getOrElse(b, 0)+map2.getOrElse(b,0);a;
})
}
var str="abcabc";
val fre=new scala.collection.mutable.HashMap[Char,Int];
str.aggregate(fre)(seqop, combop);
println(fre);