scala习题(十三)——集合

这章主要讲解关于scala中集合的概念,map,list等
这里写图片描述

  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;
  }

9.scala习题(十三)——集合_第1张图片

并发修改共享集合会导致结果出错

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);

你可能感兴趣的:(scala)