Ch03 数组相关操作 - 练习

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

//import java.lang.Math

def getArray(n:Int)={

  val nums = new Array[Int](n)

  for(i <- 0 until nums.length){

    nums(i) = (Math.random() * n).toInt 

  }

  nums

}

 

getArray(10)

//res18: Array[Int] = Array(5, 1, 6, 9, 0, 9, 6, 6, 8, 1)

方法二:

object App{

  def main(args: Array[String]){

    makeArr(10).foreach(println)

  }

  def makeArr(n:Int): Array[Int]={

    val = new Array[Int](n)

    val rand = new scala.util.Random()

    for(i <- a) yield rand.nextInt(n)

  }

}

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

object App{

  def main(args: Array[String]){

    val = Array(1,2,3,4,5)

    exchangeArr(a).foreach(println)

  }

  def exchangeArr(a:Array[Int]):Array[Int]={

    for(i <- 0 until a.length){

      if(i % 2 == 0 && i != a.length -1){

        val = a(i)

        a(i) = a(i+1)

        a(i+1= t

      }

    }

    a

  }

}

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

object App{

  def main(args: Array[String]){

    val = Array(1,2,3,4,5)

    val = revertYield(a)

    a.foreach(println)

    println

    b.foreach(println)

  }

  def revertYield(arr:Array[Int])={

    for(i <- 0 until arr.length) yield {

      if(i % 2 == 0 && i != arr.length -1){

        arr(i+1)

      }else if(i % 2 == 1 && i != arr.length -1){

        arr(i-1)

      }else if(i % 2 == 0 && i == arr.length -1){

        arr(i)

      }else{

        arr(i-1)

      }

    }

  }

}

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

object App{

  def main(args: Array[String]){

    val = Array(1,2,-3,-4,5,0)

    sortArr(a).foreach(println)

  }

  def sortArr(arr:Array[Int])={

    val positiveIndexes = for(i <- 0 until arr.length if arr(i) >0 yield i

    val nonpositiveIndexes = for(i <- 0 until arr.length if arr(i) <= 0yield i

    val newArr = new Array[Int](arr.length)

    for(i <- 0 until arr.length){

      if(i < positiveIndexes.length) newArr(i) = arr(positiveIndexes(i))

      else newArr(i) = arr(nonpositiveIndexes(i - positiveIndexes.length))

    }

    newArr

  }

}

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

object App{

  def main(args: Array[String]){

    val = Array(1,2.0,-3,-4,5,0)

    println(average(a).toString)

  }

  def average(arr:Array[Double])={

    arr.sum/arr.length

  }

}

//result: 0.16666666666666666

 

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

object App{

  def main(args: Array[String]){

    val = Array(1,2,-3,-4,5)

    println(a.mkString("[",",","]"))

    println(reverseArray(a).mkString("[",",","]"))

  }

  def reverseArray(arr:Array[Int])={

    for(i <- 0 until arr.length/2){

        val = arr(arr.length-1-i)

        arr(arr.length-1-i) = arr(i) 

        arr(i) = t

    }

    arr

  }

}

/*result: 

[1,2,-3,-4,5]

[5,-4,-3,2,1]

*/

ArrayBuffer的版本几乎和Array的版本一样。

import scala.collection.mutable.ArrayBuffer

object App{

  def main(args: Array[String]){

    val = ArrayBuffer(1,2,-3,-4,5)

    println(a.mkString("[",",","]"))

    println(reverseArray(a).mkString("[",",","]"))

  }

  def reverseArray(arr:ArrayBuffer[Int])={

    for(i <- 0 until arr.length/2){

        val = arr(arr.length-1-i)

        arr(arr.length-1-i) = arr(i) 

        arr(i) = t

    }

    arr

  }

}

/*result: 

[1,2,-3,-4,5]

[5,-4,-3,2,1]

*/

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

object App{

  def main(args: Array[String]){

    val = Array(6,2,2,6,7,5,2)

    println(a.mkString("[",",","]"))

    val = a.distinct

    println(b.mkString("[",",","]"))

  }

}

/*result: 

[6,2,2,6,7,5,2]

[6,2,7,5]

*/

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

import scala.collection.mutable.ArrayBuffer

object App{

  def main(args: Array[String]){

    var = ArrayBuffer(1,-2,3,-4,5,-6,7)

    println(a.mkString("[",",","]"))

    var begin = System.currentTimeMillis()

    var = ridAllNegativeButFirstA(a)

    var end = System.currentTimeMillis()

    println(end-begin)

    println(b.mkString("[",",","]"))

    println

    

    = ArrayBuffer(1,-2,3,-4,5,-6,7)

    println(a.mkString("[",",","]"))

    begin = System.currentTimeMillis()

    = ridAllNegativeButFirstB(a)

    end = System.currentTimeMillis()

    println(end-begin)

    println(b.mkString("[",",","]"))

    println

    

    = ArrayBuffer(1,-2,3,-4,5,-6,7)

    println(a.mkString("[",",","]"))

    begin = System.currentTimeMillis()

    = ridAllNegativeButFirstC(a)

    end = System.currentTimeMillis()

    println(end-begin)

    println(b.mkString("[",",","]"))   

  }

  def ridAllNegativeButFirstA(a:ArrayBuffer[Int])={

    var first = true

    var = a.length

    var = 0

    while(i < n){

      if(a(i) >= 0) i += 1

      else{

        if(first) { first = false; i += 1 }

        else { a.remove(i); n -= 1 }

      }

    }

    a

  }

   def ridAllNegativeButFirstB(a:ArrayBuffer[Int])={

    var first = true

    val indexes = for(i <- 0 until a.length if first || a(i) >= 0yield {

        if (a(i) < 0) first = false; i

    }

    for(j <- 0 until indexes.length) a(j) = a(indexes(j))

    a.trimEnd(a.length - indexes.length)

    a

  }

  

   def ridAllNegativeButFirstC(a:ArrayBuffer[Int])={

    val indexes = for(i <- 0 until a.length if a(i) < 0yield i

    val seq = indexes.reverse.dropRight(1)

    for(i <- 0 until seq.length) a.remove(i)

    a

  }  

}

/*result: 

[1,-2,3,-4,5,-6,7]

5

[1,-2,3,5,7]

[1,-2,3,-4,5,-6,7]

4

[1,-2,3,5,7]

[1,-2,3,-4,5,-6,7]

3

[-2,-4,5,-6,7]

*/

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

import scala.collection.mutable.ArrayBuffer

import java.util.TimeZone

object App{

  def main(args: Array[String]){

    val = TimeZone.getAvailableIDs()

    val = a.filter(_.startsWith("America/"))

    for(i <- 0 until b.length) b(i) = b(i).replace("America/","")

    b.foreach(println) 

  }

}

/*result: 

Adak

Anchorage

Anguilla

Antigua

...

*/

 

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

val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]

然后以DataFlavor.imageFlavor为参数调用getNativesForFlavor方法, 以Scala缓冲保存返回值。

(为什么用这样一个晦涩难懂的类?因为在Java标准类库中很难找得到使用java.util.List的代码。)

import scala.collection.JavaConversions.asScalaBuffer

import scala.collection.mutable.Buffer

import java.awt.datatransfer._

import java.util.TimeZone

object App{

  def main(args: Array[String]){

    val flavors = SystemFlavorMap.getDefaultFlavorMap().asInstanceOf[SystemFlavorMap]

    val buffer = flavors.getNativesForFlavor(DataFlavor.imageFlavor)

    println(buffer)

  }

}

/*result

[PNG, JFIF, DIB, ENHMETAFILE, METAFILEPICT]

*/

时间: 2024-08-26 06:14:30

Ch03 数组相关操作 - 练习的相关文章

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

3 数组相关操作 3.1 编写一段代码,将a设置为一个n个随机整数的数组,要求随机数介于0(包含)和n(不包含)之间 random和yield的使用 Scala代码   import scala.math.random def randomArray(n:Int)={ for(i <- 0 until n) yield (random * n).toInt } println(randomArray(10).mkString(",")) 3.2 编写一个循环,将整数数组中相邻的元

Scala学习(三)----数组相关操作

数组相关操作 摘要: 本篇主要学习如何在Scala中操作数组.Java和C++程序员通常会选用数组或近似的结构(比如数组列表或向量)来收集一组元素.在Scala中,我们的选择更多,不过现在我们先假定不关心其他选择,而只是想马上开始用数组.本篇的要点包括: 1. 若长度固定则使用Array,若长度可能有变化则使用ArrayBuffer 2. 提供初始值时不要使用new 3. 用()来访问元素 4. 用for (elem<-arr)来遍历元素 5. 用for (elem<-arr if…)…yie

Scala详解---------数组相关操作

Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合. 取替声明单个变量,如number0, number1, ..., 和number99,声明一个数组变量,如号码和使用numbers[0],numbers[1],...,numbers[99]表示单个变量.本教程介绍了如何声明数组变量,创建数组和使用索引的过程变量数组.数组的第一个元素的索引是数字0和最后一个元素的索引为元素的总数减去1.

从零学scala(二)数组相关操作、映射和元组

一:数组相关操作 定长数组 val array = Array[String]("a","b","c") //直接初始化数组的内容        println(array.mkString("|")) val array = new Array[String](2) //new一个长度为2的数据在通过更新的方法进行赋值        array.update(0, "0")        array.up

快学SCALA(3)--数组相关操作

val a = Array(2, 4, 5, 6) val result = for(elem <- a) yield 2 * elem //result = (4,8, 10, 12) val result1 = for(elem <- a if elem % 2 == 0) yield 2 * elem //result1 = (4,8,12) val result2 = a.filter(_ % 2 == 0).map(2 * _ ) //result = (4,8,12) val re

scala 入门(2)--数组相关操作

scala 无论从数组的定义还是操作方面来说都跟java非常相似,但又有其独特的强大之处… 1. 定长数组 对于长度不变的数组,可以用scala中的Array. //scala 里使用new实例化对象. 实例化过程中,可以用值和类型使对象参数化(创建对象的同时完成对它的设置) val nums = new Array[Int](5); //含5个整数的数组,元素默认初始化为0: val arr = new Array[String](10);  //含10个字符串的数组,元素默认初始化为null

scala学习3 数组相关操作映射和元组

一.定长数组 如果需要一个长度不变的数组,可以使用Scala中的Array. val nums = new Array[int](10) val s = Array("Hello","world") 二.变长数组:数组缓冲 1. val b = ArrayBuffer[int]() 2.追加元素 b +=(1,2,3,4,5) 3.追加任何集合 b ++= Array(8,13,21) 4.移除最后5个元素 b.trimEnd(5) 5.插入元素 b.insert(

快学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

Shell数组相关操作

参考:http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html 创建数组 a=(1 2 3 4 5) 获得数组长度 ${#a[@]} #${#变量}为获得变量长度 ${#a[*]} 打印数组内容 echo ${a[@]} #echo $a仅打印出数组的第一个元素 echo ${a[*]} 删除 unset a[1] #删除单个成员 unset a #删除整个数组 单个赋值 a[1]=100 a[10]=200 #下标值超出长度索