快学Scala习题解答—第三章 数组相关操作

3 数组相关操作

3.1 编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间

random和yield的使用

Scala代码  

  1. import scala.math.random
  2. def randomArray(n:Int)={
  3. for(i <- 0 until n) yield (random * n).toInt
  4. }
  5. println(randomArray(10).mkString(","))

3.2 编写一个循环,将整数数组中相邻的元素置换。例如,Array(1,2,3,4,5)经过置换后变为Array(2,1,4,3,5)

对数组方法的使用

Scala代码  

  1. def reorderArray(arr:Array[Int]):Array[Int]={
  2. val t = arr.toBuffer
  3. for(i <- 1 until (t.length,2);tmp = t(i);j <- i - 1 until i){
  4. t(i) = t(j)
  5. t(j) = tmp
  6. }
  7. t.toArray
  8. }
  9. println(reorderArray(Array(1,2,3,4,5)).mkString(","))

3.3 重复前一个练习,不过这一次生成一个新的值交换过的数组。用for/yield

Scala代码  

  1. def reorderArray(arr:Array[Int]):Array[Int]={
  2. (for(i <- 0 until (arr.length,2)) yield if (i + 1 < arr.length) Array(arr(i + 1),arr(i)) else Array(arr(i))).flatten.toArray
  3. }
  4. println(reorderArray(Array(1,2,3,4,5)).mkString(","))

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

Scala代码  

  1. //使用循环
  2. def reorderArray(arr:Array[Int]):Array[Int]={
  3. val a = ArrayBuffer[Int]()
  4. val b = ArrayBuffer[Int]()
  5. arr.foreach(arg => if(arg > 0) a += arg else b += arg)
  6. a ++= b
  7. a.toArray
  8. }
    val a = Array(1,3,-3,-5,-7,3,2)
    def reorderArray(arr: Array[Int]) = {
      val  b = arr.filter(_ > 0)
      val  c = arr.filter(_ <= 0)
      val newarr = b ++ c
      print(newarr.toBuffer.toString())
    }
      reorderArray(a)

3.5 如何计算Array[Double]的平均值?

Scala代码  

  1. def aveArray(arr:Array[Double]):Double={
  2. arr.sum/arr.length
  3. }

3.6 如何重新组织Array[Int]的元素将他们以反序排列?对于ArrayBuffer[Int]你又会怎么做呢?

Scala代码  

  1. def reverseArray(arr:Array[Int]):Array[Int]={
  2. arr.reverse
  3. }

3.7 编写一段代码,产出数组中的所有值,去掉重复项。(提示:查看Scaladoc)

产出数组的代码就不编写了。去重只需要调用api即可

Scala代码  

  1. def distinctArray(arr:Array[Int]):Array[Int]={
  2. val t = arr.toBuffer
  3. t.distinct.toArray
  4. }

3.8 重新编写3.4节结尾的示例。收集负值元素的下标,反序,去掉最后一个下标,然后对每个下标调用a.remove(i)。比较这样做的效率和3.4节中另外两种方法的效率

   def removeArray(array: Array[Int]){
      val t = array.toBuffer
      val index = for (i <- 0 until array.length if array(i) < 0) yield i
      val right = index.reverse.dropRight(1)
      right.foreach(t.remove(_))
      print(t)
    }

    val a = Array(1,3,-3,-5,-7,3,2,1)
    removeArray(a)

3.9 创建一个由java.util.TimeZone.getAvailableIDs返回ide时区集合,判断条件是它们在美洲。去掉"America/"前缀并排序

 val americaTimeZone = java.util.TimeZone.getAvailableIDs
val americatimezone = java.util.TimeZone.getAvailableIDs.filter(_.take(8)=="America/")
val sortedamericaTimeZone = americaTimeZone.map(_.drop(8)).sorted

3.10 引入java.awt.datatransfer.并构建一个类型为SystemFlavorMap类型的对象:

val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap] 然后以DataFlavor.imageFlavor为参数调用getNativesForFlavor方法,以Scala缓冲保存返回值。
(为什么用这样一个晦涩难懂的类?因为在Java标准库中很难找到使用java.util.List的代码)

Scala代码  

  1. val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]
  2. println(flavors.getNativesForFlavor(DataFlavor.imageFlavor).toArray.toBuffer.mkString(" | ")

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 16:16:02

快学Scala习题解答—第三章 数组相关操作的相关文章

快学Scala习题解答—第四章 映射和元组

4 映射和元组 4.1 设置一个映射,其中包含你想要的一些装备,以及它们的价格.然后构建另一个映射,采用同一组键,但是价格上打9折 映射的简单操作 Shell代码   scala> val map = Map("book"->10,"gun"->18,"ipad"->1000) map: scala.collection.immutable.Map[java.lang.String,Int] = Map(book ->

快学Scala习题解答—第十一章 操作符

11 操作符 11.1 依据优先级规则,3 + 4 -> 5和3 -> 4 + 5是怎样被求值的? 在REPL中运行就可以得到结果.都是从左至右运行 12.2 BigInt类有一个pow方法,但没实用操作符字符. Scala类库的设计者为什么没有选用**(像Fortran那样)或者^(像Pascal那样)作为乘方操作符呢? Scala中的操作符就是方法.其优先级是依据首字母来推断的,优先级例如以下 最高优先级:除下面字符外的操作符字符 * / % + - : = ! < > &am

快学scala习题解答--第五章 类

5 类 5.1 改进5.1节的Counter类,让它不要在Int.MaxValue时变成负数 Scala代码   class Count{ private var value = Int.MaxValue def increment(){if(value < Int.MaxValue) value + 1 else value } def current = value } 5.2 编写一个BankAccount类,加入deposit和withdraw方法,和一个只读的balance属性 Sca

快学Scala习题解答—第一章 基础

1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on the Java Virtual Machine>好很多. 是本不错的入门书.而且每个章节都设置了难度级别,每章有习题,可以巩固Scala语法. 本文的目的就是针对这些习题进行解答 2 基础 2.1 在Scala REPL中键入3,然后按Tab键.有哪些方法可以被应用? 这个....直接操作一遍就有结果了.

快学Scala习题解答—第二章 控制结构和函数

2 控制结构和函数 2.1 一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值 简单的逻辑判断 Scala代码   def signum(num:Int){if(num>0)print(1)else if(num<0)print(-1)else print(0)} Scala中已经有此方法了,刚才查找API的时候,应该能看到 Scala代码   BigInt(10).signum 2.2 一个空的块表达式{}的值

快学Scala习题解答—第八章 继承

8 继承 8.1 扩展如下的BankAccount类,新类CheckingAccount对每次存款和取款都收取1美元的手续费class BankAccount(initialBalance:Double){ private var balance = initialBalance def deposit(amount:Double) = { balance += amount; balance} def withdraw(amount:Double) = {balance -= amount;

快学Scala-第三章 数组相关操作

知识点: 1.定长数组 Array val nums = new Array[Int](10) //10个整数的数组,所有元素初始化为0 val a = new Array[String](10) //10个元素的字符串数组,所有元素初始化为null val s= Array("Hello","World") //长度为2的Array(String) 类型是编译器推断出来的,已提供初始值就不需要new s(0) = "Goodbye" //Arr

scala学习第三章数组相关操作

val b = new ArrayBuffer[Int]() //或者 new ArrayBuffer[Int] b += 1 //ArrayBuffer(1) 用+= 在尾端添加元素 b += (1,2,3,5) //ArrayBuffer(1,1,2,3,5) 在尾端添加多个元素 b ++= Array(1,2,3) //ArrayBuffer(1,1,2,3,5,1,2,3) 在尾端追加集合 用++= b.trimEnd(5) //ArrayBuffer(1,1,2) 移除最后5个元素 b

曼昆《经济学原理》(第五版)习题解答 第三章 相互依存性与贸易的好处

1 .在什么情况下,生产可能性曲线是直线,而不是外凸的?答:生产可能性曲线会由于机会成本的动态变化而呈现不同形状.在机会成本不变的情况下,生产可能性曲线是一条直线;机会成本递增的时候,生产可能性曲线凹向原点;而机会成本递减的时候,生产可能性曲线凸向原点.这几种情况如下图所示. 2 .解释绝对优势和比较优势有什么不同.答:同一生产者可能同时在两种物品上都具有绝对优势,但不可能同时在两种物品上都拥有比较优势.绝对优势反映了生产率的高低,比较优势反映了相对机会成本的高低.3 .举例说明一个人在做某件事