• scala学习---2


    一.遍历

    object Scala05 {
    def main(args: Array[String]): Unit = {
    //1.遍历
    /* var n=10
    while (n>0){
    println(n)
    n-=1
    }*/

    //2.
    /* var n=10
    for(i<-1 to n)
    println(i)*/

    //3.
    /* var n=10
    for (i<-1 until n)
    println(i)*/

    //4.字符串遍历
    /*for(c<-"Hello World")
    print(c)*/

    //1.跳出循环
    //·scala没有提供类似于java的break语句。
    //·但是可以使用boolean类型变量、return或者Breaks的break函数来替代使用。
    /* import scala.util.control.Breaks._
    breakable {
    var n = 10
    for(c <- "Hello World") {
    if(n == 5) break;
    print(c)
    n -= 1
    }
    }*/

    //2.多重for循环:九九乘法表
    /* for(i <- 1 to 9; j <- 1 to 9) {
    if(j == 9) {
    println(i * j)
    } else {
    print(i * j + " ")
    }
    }*/

    //3.if守卫:取偶数
    // for(i <- 1 to 100 if i % 2 == 0) println(i)

    //4.for推导式:构造集合
    println( for(i <- 1 to 10) yield i)
    //打印结果 Vector(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    }
    }

    1.Any是String和Int的公共父类型 

    2.在Scala中,定义函数时,如果函数体直接包裹在了花括号里面,而没有使用=连接,则函数的返回值类型就是Unit。这样的函数就被称之为过程。过程通常用于不需要返回值的函数。

    二.方法函数

    object Scala01 {
      //1.函数
      def sayHello(name: String, age: Int) = {
        if (age > 18) {
          printf("hi %s, you are a big boy
    ", name); age
        }
        else {
          printf("hi %s, you are a little boy
    ", name);
          age
        }
      }
    
      def main(args: Array[String]): Unit = {
        //sayHello("leo", 30)
        //println(sum(10))
       //sayHello1("")
        // println(sum3(1,2,4))
         println(sum2(1,2,4))
      }
      //2.函数
      def sum(n: Int) = {
        var sum = 0;
        for(i <- 1 to n) sum += i
        sum   //默认是返回值
      }
    
      //3.默认参数  如果给出的参数不够,则会从作往右依次应用参数
      def sayHello1(name: String, age: Int = 20) {
        print("Hello, " + name + ", your age is " + age)
      }
    
      //4还可以混合使用未命名参数和带名参数,但是未命名参数必须排在带名参数前面
      //sayHello("Mick", lastName = "Nina", middleName = "Jack")
    
      //5.变长参数
      def sum3(nums:Int*)={
        var res=0
        for (num<-nums) res+=num
        res
      }
    
      //6.使用递归函数实现累加
      def sum2(nums:Int*):Int={
        if(nums.length==0)0
        else nums.head+sum2(nums.tail:_*)
      }
    }

    三.集合

     ArrayBuffer和Array

    // 使用insert()函数可以在指定位置插入元素
    // 但是这种操作效率很低,因为需要移动指定位置后的所有元素
    b.insert(5, 6)
    b.insert(6, 7, 8, 9, 10)
    // 使用remove()函数可以移除指定位置的元素
    b.remove(1)
    b.remove(1, 3)
    // Array与ArrayBuffer可以互相进行转换
    b.toArray
    a.toBuffer
    
    // 使用for循环和until遍历Array / ArrayBuffer
    // 使until是RichInt提供的函数
      for (i <- 0 until b.length)
      println(b(i))
    // 跳跃遍历Array / ArrayBuffer
      for(i <- 0 until (b.length, 2))
      println(b(i))
    // 从尾部遍历Array / ArrayBuffer
      for(i <- (0 until b.length).reverse)
      println(b(i))
    // 使用“增强for循环”遍历Array / ArrayBuffer
      for (e <- b)
      println(e)
    
    // 数组元素求和
     val a = Array(1, 2, 3, 4, 5)
     val sum = a.sum
    // 获取数组最大值
     val max = a.max
    // 对数组进行排序
     scala.util.Sorting.quickSort(a)
    // 获取数组中所有元素内容
     a.mkString
     a.mkString(", ")
     a.mkString("<", ",", ">")
    // toString函数
     a.toString
     b.toString
    使用yield和函数式编程转换数组
    
    // 对Array进行转换,获取的还是Array
    val a = Array(1, 2, 3, 4, 5)
    val a2 = for (ele <- a) yield ele * ele
    // 对ArrayBuffer进行转换,获取的还是ArrayBuffer
    val b = ArrayBuffer[Int]()
    b += (1, 2, 3, 4, 5)
    val b2 = for (ele <- b) yield ele * ele
    // 结合if守卫,仅转换需要的元素
    val a3 = for (ele <- a if ele % 2 == 0) yield ele * ele
    
    // 使用函数式编程转换数组(通常使用第一种方式)
    a.filter(_ % 2 == 0).map(2 * _)
    a.filter { _ % 2 == 0 } map { 2 * _ }
    
    算法案例:移除第一个负数之后的所有负数
    
    // 构建数组
    val a = ArrayBuffer[Int]()
    a += (1, 2, 3, 4, 5, -1, -3, -5, -9)
    
    // 每发现一个第一个负数之后的负数,就进行移除,性能较差,多次移动数组
    var foundFirstNegative = false
    var arrayLength = a.length
    var index = 0
    while (index < arrayLength) {
      if (a(index) >= 0) {
        index += 1
      } else {
        if (!foundFirstNegative) { foundFirstNegative = true; index += 1 }
        else { a.remove(index); arrayLength -= 1 }
      }
    } 
    
     算法案例:移除第一个负数之后的所有负数(简约版)
    // 重新构建数组
    val a = ArrayBuffer[Int]()
    a += (1, 2, 3, 4, 5, -1, -3, -5, -9)
    
    // 每记录所有不需要移除的元素的索引,稍后一次性移除所有需要移除的元素
    // 性能较高,数组内的元素迁移只要执行一次即可
    var foundFirstNegative = false
    val keepIndexes = for (i <- 0 until a.length if !foundFirstNegative || a(i) >= 0) yield {
      if (a(i) < 0) foundFirstNegative = true
      i
    }
    for (i <- 0 until keepIndexes.length) { a(i) = a(keepIndexes(i)) }
    a.trimEnd(a.length - keepIndexes.length)
  • 相关阅读:
    理解cookie
    浏览器解析url后执行过程
    如何使用D3绘制折线图
    Django 笔记
    vi命令
    PEP8编程规范
    Python_入门第一篇【持续更新...】
    DjangoWeb _ 登录页开发test
    Django开发流程
    Django 笔记2018.2.7
  • 原文地址:https://www.cnblogs.com/kaiwen03/p/9547824.html
Copyright © 2020-2023  润新知