scala习题(十三)——集合

本文探讨了Scala中的集合概念,如map和list,并提供了练习,包括不可变映射、去除整数列表中的零值、实现类似mkstring的函数、按行分割一维数组为二维数组。还警示了并发修改共享集合可能导致的错误,并建议避免使用par进行并发修改,推荐使用aggregate函数确保正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这章主要讲解关于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.这里写图片描述

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

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值