zoukankan      html  css  js  c++  java
  • 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]
    */
     
  • 相关阅读:
    Best Time to Buy and Sell Stock III
    Valid Palindrome
    Longest Substring Without Repeating Characters
    Copy List with Random Pointer
    Add Two Numbers
    Recover Binary Search Tree
    Anagrams
    ZigZag Conversion
    Merge k Sorted Lists
    Distinct Subsequences
  • 原文地址:https://www.cnblogs.com/chenjo/p/4436585.html
Copyright © 2011-2022 走看看