《快学Scala》第三章练习题答案+概述

第三章

1、内容概述

  • 3.1 定长数组

    //定义
    val nums = new Array[Int](10)  //长度为10,值为0
    val strs = Array("one" , "two")    
    //获取
    nums(0)    
    
  • 3.2 变长数组:数组缓冲区

    import scala.collection.mutable.ArrayBuffer
    //定义
    var x = ArrayBuffer[Int]() or new ArrayBuffer[Int]
    //添加数据 
    b += 1
    b += (1,5,9,6)     //最加多个元素
    b ++= Array(2,6,8) //追加集合
    b.trimEnd(2)       //移除后两个
    b.trimStart(2)	   //不解释
    b.insert(2,6)	   //下标为二的位置上插入6
    b.insert(2,6,8,9)  //下标为二的位置上插入6,8,9
    b.remove(2)		   //移除下标为二的元素
    b.remove(2,3)      //从下标2开始移除3个元素
    相互转换 缓冲区.toArray , 数组.toBuffer    
    

    注意:在尾端增删都是高效的,在其他位置插入或移除不高效(位置之后的元素必须平移)

  • 3.3 遍历数组和数组缓冲区

    for(i <- 0 until a.length) println("下标" + i +"值:"+ a(i))
    //until 返回所有小于(但不包括上限的数字)遍历数值的利器
    for(i <- (0 until a.length).reverse) println("下标" + i +"值:"+ a(i))    
    
  • 3.4 数组转换

    val x = Array(2,3,5,8,9)
    val res = for(y <- x) yield 2 * y //res结果是x中所有元素都翻倍    
    
  • 3.5 常用算法

    var x = Array(2,3,5,8,9)
    x.sum //和
    x.min
    x = x.sorted
    x = x.sorted.reverse
    
    x.mkString(",") 2,3,5,8,9
    x.mkString("<"","">") <2,3,5,8,9>
    
    
  • 3.6 解读Scaladoc

  • 3.7 多维数组

    //定义
    val x = Array.ofDim[Double](3,4)
    //获取
     x(row)(column)   
    
  • 3.8 java互相操作

    /**
        Scala数组运行时也是编译成calss文件运行在JVM中,当然Scala数组使用Java数组实现的,可以在Java和Scala中来回传递
       
    */
    // Scala到Java的转换
    import scala.collection.mutable.ArrayBuffer
    val com = Arrayuffer("one","two","three")
    val pb = new ProcessBuilder(command)    
    //java到Scala的转换
    import scala.collection.JavaConversions.asScalaBuffer
    import scala.collection.mutable.Buffer
    val cmd: Buffer[String] = pb.command()
        
    
    

2、习题

  • 3.1 编写一段代码,将a设置为n个随机整数的数组,要求随机数位于[0,n)之间
    def problem_1(n: Int): Array[Int] = {
        val random: Random = new Random()
        val randomArr: Array[Int] = new Array[Int](n)
        for (i <- 0 until n) randomArr(i) = random.nextInt(n)
        randomArr
    }
    
  • 3.2 编写一个程序,将整数数组中相邻的元素置换;例如,Array(1,2,3,4,5)置换后变为Array(2,1,4,3,5)
    def problem_2(arr: Array[Int]): Array[Int] = {
        for (i <- Range(0, arr.length / 2 + 1, 2)) {
          val temp = arr(i)
          arr(i) = arr(i + 1)
          arr(i + 1) = temp
        }
        arr
      }
    
  • 3.3 重复前一个练习,不过这一次生成的新的值交换过的数组,用for/yeild
    def problem_3(arr: Array[Int]): Array[Int] = {
        val newArr = for (i <- Range(0, arr.length)) yield {
          if (arr.length % 2 == 1 && i == arr.length - 1) arr(i) else if (i % 2 == 0) arr(i + 1) else arr(i - 1)
        }
        newArr.toArray
      }
    
  • 3.4 给定一个整数数组,产生一个新的数组,包含原数组中的所有正值,按原有顺序排序之后的元素是所有的零或者负值,按原有顺序排序
    def problem_4(arr: Array[Int]): Array[Int] = {
        var newArr: Array[Int] = for (elem <- arr if elem > 0) yield elem
        val newArr1: Array[Int] = for (elem <- arr if elem <= 0) yield elem
        newArr ++= newArr1
        newArr
      }
    
    
  • 3.5 如何计算Array[Double]的平均值
    def problem_5(arr: Array[Double]): Double = {
        arr.sum / arr.length
      }
    
  • 3.6 如何组织Array[Int]使他们反序排列,如果是ArrayBuffer呢?
    def problem () = {
        //方案一
        val x = Array[Int](1, 2, 3)
        val y = new Array[Int](x.length)
        for (i <- 0 until x.length) {
          y(x.length - 1 - i) = x(i)
        }
    	//方案二
        val x = ArrayBuffer(1, 2, 3)
        val y = x.reverse
    }
    
    
  • 3.7 写一个程序,输出数组中的所有值,去掉重复项
    def problem_7(arr: Array[Int]): Array[Int] = {
        arr.distinct
    }
    
  • 3.8 重新编写3.4节结尾的实例。收集负值元素的下标,反序,去掉最后一个下标然后对每个下标调用remove。比较这样做的效率和3.4中另外两个方法的效率
    def problem_8(): Unit ={
        //定义数值缓冲区
        val buff = ArrayBuffer[Int](-10, 2, 5, -2, 8, -3, 6)
        //收集负值的索引并反转(为什么要反转,因为:从前面每减去一个值,缓冲区的值的索引就会往前移动,导致索引越界)
        val fIndex = (for (x <- 0 until buff.length if (buff(x) < 0)) yield x).reverse
        //移除负值
        for (x <- 0 until fIndex.length - 1) buff.remove(fIndex(x))
        //查看结果
        for (x <- buff) print(x + "   ")
      }
    
  • 3.9 创建一个java.util.TimeZone.getAvailableIDs返回的时区的集合,判断条件是它们在美洲;去掉"America/"前缀并排序
    def problem_9(): Unit = {
        var timezoneArr: Array[String] = java.util.TimeZone.getAvailableIDs()
        var filterArr = for (elem <- timezoneArr if !elem.startsWith("America/")) yield elem
        var sortedArr = filterArr.sorted
        for (elem <- sortedArr) println(elem)
      }
    
  • 3.10 引入java.awt.datatransfer._并构建一个类型为SystemFlavorMap的对象 然后以DataFlavor.imageFlavor为参数调用getNativesForFlavor的方法,以Scala缓冲保留返回值 为什么要用这样一个晦涩难懂的类?因为java标准类库中很难得到试用java.util.List的代码
    def problem_10(): Unit = {
        val flavors = SystemFlavorMap.getDefaultFlavorMap.asInstanceOf[SystemFlavorMap]
        val buffer: Buffer[String] = flavors.getNativesForFlavor(DataFlavor.imageFlavor)
    }
    
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值