Scala练习题

一、Scala基础

【1】在Scala REPL中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?
在这里插入图片描述
【2】如何检测一个变量是val还是var?

看它的值能否被修改,能修改类型为var,否则为val

【3】Scala允许你用数字去乘一个字符串,去REPL中试一下"crazy"*3。这个操作做什么?在Scaladoc中如何找到这个操作?
在这里插入图片描述
从代码可以推断,*是"crazy"这个字符串所具有的方法,但是Java中的String可没这个方法,很明显。此方法在StringOps中

【4】10 max 2的含义是什么?max方法定义在哪个类中?
在这里插入图片描述
可以看出,此方法返回两个数字中较大的那个。此方法Java中不存在,所以在RichInt中
【5】用BigInt计算2的1024次方
在这里插入图片描述
【6】在Scala中如何获取字符串“Hello”的首字符和尾字符?
在这里插入图片描述

二、控制结构和函数

【1】一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值

var signum1 = (num:Long)=>{
    if(num>0)
      1
    else if(num==0)
      0
    else -1
  }

【2】一个空的块表达式{}的值是什么?类型是什么?
在REPL中就能看出来了

scala> val t = {}
t: Unit = ()
可以看出,它的值是()类型是Unit

【3】针对下列Java循环编写一个Scala版本

Java:
for(int i=10;i>=0;i–-)System.out.println(i);
scala:
for(i<-10.to(0,-1)){
      println(i)
    }

【4】编写一个过程countdown(n:Int),打印从n到0的数字

var countdown=(x:Int)=> {
      for(i<-x.to(0,-1)) println(i)
    }
    countdown(10)

【5】编写一个for循环,计算字符串中所有字母的Unicode代码(toLong方法)的乘积。举例来说,"Hello"中所有字符串的乘积为9415087488L

var sum:Long = 1
    for(i<-"Hello") sum*=(i.toLong)
    println(sum)

【6】同样是解决前一个练习的问题,请用StringOps的foreach方式解决

var sum:Long = 1
    "Hello".foreach(sum*=_.toLong)
    println(sum)

【7】编写一个函数product(s:String),计算字符串中所有字母的Unicode代码(toLong方法)的乘积

def product(s:String)={
    var sum:Long = 1
    "Hello".foreach(sum*=_.toLong)
    sum
  }

【8】把7练习中的函数改成递归函数

def product(s:String):Long={
    var sum:Long = 1
    if(s.length!=0)
      s.head.toLong*product(s.substring(1))
    else 1
  }

【9】编写函数计算 ,其中n是整数,使用如下的递归定义:
在这里插入图片描述

def product(x:Double,n:Int):Double={
    if(x==0)
      1
    else if(x>0) x*product(x,n-1)
    else x/product(x,-n)
  }

三、数据结构

【1】编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0和n之间。

def randomArray(n:Int)={
    val ints: Array[Int] = new Array[Int](n)
    for (i <- 0.to(ints.length-1)) {
      ints(i)=Random.nextInt(n)
    }
    ints
  }
 
  def randomArray(n:Int)={
    for (i <- 0.to(n-1)) yield{
      Random.nextInt(n)
    }
  }

【2】编写一个循环,将整数数组中相邻的元素置换。比如Array(1, 2, 3, 4, 5)置换后为Array(2, 1, 4, 3, 5)

def main(args: Array[String]): Unit = {
    println(swapArray(Array(1, 2, 3, 4, 5)).toList)
  }
  def swapArray(array: Array[Int])={
    var t = 0
    for(i<-1.to(array.length-1,2)){
      t = array(i)
      array(i)=array(i-1)
      array(i-1)=t
    }
    array
  }

【3】给定一个整数数组,产出一个新的数组,包含原数组中的所有正值,以原有顺序排列,之后的元素是所有零或负值,以原有顺序排列。

def main(args: Array[String]): Unit = {
    println(rankSpe(Array(1, 2, 3, -1, 0, 4, -3)).toList)
  }
  def rankSpe(array: Array[Int])={
    val newArray1 = new ArrayBuffer[Int]()
    val newArray2 = new ArrayBuffer[Int]()
    array.foreach(x=>{
      if(x>0)
        newArray1.append(x)
      else newArray2.append(x)
    })
    newArray1++newArray2
  }

【4】创建一个由java.util.TimeZone.getAvailableIDs返回的时区集合,并只显示以America/前缀开头的时区,并且有序。

def main(args: Array[String]): Unit = {
    val strings: Array[String] = TimeZone.getAvailableIDs()
    var tmp: Array[String] =for (elem <- strings if(elem.startsWith("America/"))) yield{
      elem.drop(8)
    }
    val tmp1: Array[String] = tmp.sorted
    println(tmp1.toList)
  }

【5】设置一个映射,其中包含你想要的一些装备,以及它们的价格。然后根据这个映射构建另一个新映射,采用同一组键,但是价格上打9折。

def main(args: Array[String]): Unit = {
    val stringToDouble: Map[String, Double] = Map(("无尽", 1999.0), ("回响", 2000), ("反甲", 1000))
    val map2 = stringToDouble.map(x => (x._1, x._2 * 0.9))
    println(map2)
  }

【6】编写一段WordCount函数,统计传入的字符串中单词的个数

def main(args: Array[String]): Unit = {
    println("i have an apple i have a pen".split(" ")
    .groupBy(x => x).map(x => (x._1, x._2.size)))
  }

【7】重复上一个练习,使统计后的单词有序

println("i have an apple i have a pen".split(" ").groupBy(x => x).map(x => (x._1, x._2.size)).toList.sorted)

【8】重复前一个练习,使用java.util.TreeMap进行实现,并使之适用于Scala API

object Work01 {
  def main(args: Array[String]): Unit = {
    val stringToInt: Map[String, Int] = "i have an apple i have a pen".split(" ").groupBy(x => x).map(x => (x._1, x._2.size))
    val map: util.TreeMap[String, Int] = new util.TreeMap()
    for (elem <- stringToInt) {
      map.put(elem._1, elem._2)
    }
    val strings: util.Set[String] = map.keySet()
    var value: util.Iterator[String] = strings.iterator()
    while (value.hasNext) {
      val str: String = value.next()
      val i: Int = map.get(str)
      println(s"$str:${i}")
    }
  }
}

【9】编写一个函数 minmax(values:Array[Int]), 返回数组中最小值和最大值的对偶

object Work01 {
  def main(args: Array[String]): Unit = {
    val tuple: (Int, Int) = minmax(Array(1, 2, 3, 4, 5))
    println(tuple)
  }
  def minmax(values:Array[Int]) ={
    (values.max,values.min)
  }
}

【10】编写一个函数indexes,给定字符串,产出一个包含所有字符下标的映射。举例来说:indexes(“Mississippi”)应返回一个映射,让’M’对应集{0},‘i’对应集{1,4,7,10},依次类推。使用字符到可变集的映射,注意下标的集应该是有序的

object Work01 {
  def main(args: Array[String]): Unit = {
    println(indexes("Mississippi"))

  }
  def indexes(str:String)={
    var t = 0
    str.map(x=>{
      t+=1
      (x,t-1)
    }).groupBy(_._1).map(x=>{
      (x._1,x._2.map(_._2).toList.sorted)
    })
  }
}

【11】编写一个函数,从一个整型链表中去除所有的零值。

object Work01 {
  def main(args: Array[String]): Unit = {
    println(removeAllZero(List(1, 2, 3, 0, 3, 0, 2, 1, 0)))
  }
  def removeAllZero(list: List[Int]) ={
    list.filter(x=>{
      x!=0
    })
  }
}

【12】编写一个函数,接受一个字符串的集合,以及一个从字符串到整数值的映射。返回整形的集合,其值为能和集合中某个字符串相对应的映射的值。举例来说,给定Array(“Tom”,”Fred”,”Harry”)和Map(“Tom”->3,”Dick”->4,”Harry”->5),返回Array(3,5)。提示:用flatMap将get返回的Option值组合在一起

object Work01 {
  def main(args: Array[String]): Unit = {
    println(fun1(Array("Tom", "Fred", "Harry"), Map("Tom" -> 3, "Dick" -> 4, "Harry" -> 5)).mkString(","))
  }
  def fun1(str:Array[String],map:Map[String,Int]) ={
    str.flatMap(map.get(_))
  }
}

【13】实现一个函数,作用与mkStirng相同,提示:使用reduceLeft实现试试

 def mymkString(set:Iterator[Any],regex:String)={
    set.reduceLeft(_.toString + regex + _.toString)
  }

【14】编写一个函数,将Double数组转换成二维数组。传入列数作为参数。具体来说,传入Array(1,2,3,4,5,6)和3列,返回Array(Array(1,2,3), Array(4,5,6))

def ArrayToDoubleArray(array: Array[Int],n:Int)={
    val ints  = new Array[Int](n)
    var len = 0
    if(array.length%n==0){
      len = array.length/n
    }else len= array.length/n +1
    var result = Array.ofDim[Int](len,n)
    for(i<-0.to(array.length-1)){
      result(i/n)(i%n)=array(i)
    }
    result
  }
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值