Scala 入门2(数组、List、Set、Map、元组、Option、Iterator)

2021-09-06 10:47:04 浏览数 (1)

文章目录

    • 1. 数组
    • 2. List
    • 3. Set
    • 4. Map
    • 5. 元组
    • 6. Option
    • 7. 迭代器

学自 https://www.runoob.com/scala/scala-tutorial.html

1. 数组

  • 使用 () 来取索引处的元素
代码语言:javascript复制
// 数组
        var z1 : Array[String] = new Array[String](3)
        var z2 = new Array[String](3) // 两种方式定义
        z1(0) = "michael"; z1(1) = "scala"; z1(2) = "!"
        for(z <- z1)
            println(z)

        var z3 = Array("hello","michael","!!!")
        for(z <- z3)
            println(z)

        // 求和,求最大
        var nums = Array(1.9, 2, -1, 0.1)
        var sum = 0.0; var maxv = -100000.0
        for(i <- 0 to (nums.length-1)){
            sum  = nums(i)
            if(nums(i) > maxv)
                maxv = nums(i)
        }
        println(printf("sum: %f, maxv: %f",sum, maxv))
        // sum: 3.000000, maxv: 2.000000()

        // 多维数组
        import Array._
        val mat = Array.ofDim[Int](3,3)
        for(i <- 0 to 2; j <- 0 to 2)
            mat(i)(j) = i*3 j;
        for(i <- 0 to 2; j <- 0 to 2)
            print(mat(i)(j)   " ") // 0 1 2 3 4 5 6 7 8
        println()
        
        // 合并数组
        var nums2 = Array(1,2,3)
        var nums3 = Array(4,5,6,7)
        var allnums = concat(nums2, nums3)
        for(x <- allnums)
            print(x   " ") // 1 2 3 4 5 6 7
        println()
        var nums4 = range(5, 8)
        for(x <- nums4)
            print(x   " ") // 5 6 7
        println()
        var nums5 = range(5, 18, 2) // 左闭右开,间距 2
        for(x <- nums5)
            print(x   " ") // 5 7 9 11 13 15 17
        println()

2. List

代码语言:javascript复制
		val site: List[String] = List("michael", "csdn","blog")
        val site1 = "michael" :: ("csdn" :: Nil)
        val empty: List[Nothing] = List()
        val empty1 = Nil
        val dim: List[List[Int]] = List(
            List(1, 0, 0),
            List(0, 1, 0),
            List(0, 0, 0, 1)
        )
        val dim1 = (1::(0::(0::Nil)))::
                    (0::(1::(0::Nil)))::
                    (0::(0::(0::(1::Nil))))::Nil
        println(site.head) // michael
        println(site.tail) // 除第一个元素之外的 List(csdn, blog)
        println(empty.isEmpty) // true
        println(dim.isEmpty) // false

        // 列表连接
        // 方法1 ::: 运算
        var site0 = site ::: site1
        println(site0) // List(michael, csdn, blog, michael, csdn)
        // 方法2 List.:::() 方法, 注意连接的顺序
        site0 = site.:::(site1)
        println(site0) // List(michael, csdn, michael, csdn, blog)
        println(site) // List(michael, csdn, blog)
        // 方法3 使用 concat 方法
        site0 = List.concat(site, site1)
        println(site0) // List(michael, csdn, blog, michael, csdn)

        // List.fill() 填入重复数量的元素
        val site3 = List.fill(3)("michael") // 重复3次
        println(site3) // List(michael, michael, michael)

        // List.tabulate() 通过给定函数创建列表
        val squares = List.tabulate(6)(n => n*n 1)
        println(squares) // List(1, 2, 5, 10, 17, 26)
        // 二维
        val mul = List.tabulate(4,5)(_ * _)
        println(mul)
        // List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))

        // List.reverse 反转
        println(squares.reverse) // List(26, 17, 10, 5, 2, 1)

3. Set

代码语言:javascript复制
		// set没有重复,默认是不可变集合, 改变后,生成新的set
        val set = Set(1,2,3)
        println(set.getClass.getName) // scala.collection.immutable.Set$Set3
        println(set.exists(_%2 == 0)) // true
        println(set.drop(1)) // Set(2, 3)
        println(set) // Set(1, 2, 3)
        // 可变集合
        import scala.collection.mutable
        val mutableSet = mutable.Set(1,2,3)
        println(mutableSet.getClass.getName) // scala.collection.mutable.HashSet
        println(mutableSet.add(4)) // true
        println(mutableSet.remove(1)) // true
        mutableSet  = 5
        mutableSet -= 2
        println(mutableSet) // Set(5, 3, 4)

        // .head  .tail  .isEmpty 跟 List 的含义一样

        // 连接集合    or Set.  () ,会去重
        val s1 = Set("michael","ming")
        val s2 = Set("michael", "scala")
        var s0 = s1    s2
        println(s0) // Set(michael, ming, scala)
        s0 = s1.  (s2)
        println(s0) // Set(michael, ming, scala)

        // 最值 Set.min, Set.max
        val num = Set(1,2,3,4,5,6,-1)
        println(num.min, num.max) // (-1, 6)

        // 交集 Set.&  or  Set.intersect
        val num1 = Set(1,2,3,11,12)
        println(num.&(num1)) // Set(1, 2, 3)
        println(num.intersect(num1)) // Set(1, 2, 3)

4. Map

代码语言:javascript复制
		// Map 默认不可变的 Map, 可变的要import scala.collection.mutable.Map
        val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")
        println(colors("red")) // #FF0000
        println("all keys: "   colors.keys) // all keys: Set(red, azure)
        println("all values: "   colors.values) // all values: MapLike(#FF0000, #F0FFFF)
        println("isEmpty ? : "   colors.isEmpty) // isEmpty ? : false
        val num3 = Map()
        println(num3.isEmpty) // true

        // 合并   运算 or Map.  ()
        val colors1 = Map("red" -> "#FF0000",
                        "azure" -> "#F0FFFF",
                        "peru" -> "#CD853F")
        println(colors    colors1) // Map(red -> #FF0000, azure -> #F0FFFF, peru -> #CD853F)
        println(colors.  (colors1)) // Map(red -> #FF0000, azure -> #F0FFFF, peru -> #CD853F)
        // 如果有 key 一样,value不一样,以后者的为准,请自行测试

        // 输出 keys, values
        colors.keys.foreach{
            i => print("key: "   i); println(" value: "   colors(i))
        } // key: red value: #FF0000
          // key: azure value: #F0FFFF

        // 指定key是否存在
        println(colors.contains("red")) // true
        println(colors.contains("blue")) // false

5. 元组

代码语言:javascript复制
		// 元组
        val t = (1, 3.14, "michael")
        println(t._1) // 1, 下标从1开始 ._idx

        t.productIterator.foreach{ // 遍历
            i => println("value: "   i)
        }

        // 元组转字符串
        println(t.toString()) // (1,3.14,michael)

        // 交换元素
        val t1 = (1,2)
        println(t1.swap) // (2,1) 长度只能为 2

6. Option

代码语言:javascript复制
        // Option 表示一个值是可选的
        val myMap  = Map("k1" -> "v1")
        val v1 : Option[String] = myMap.get("k1")
        val v2 : Option[String] = myMap.get("k2")
        println(v1) // Some(v1)
        println(v2) // None

        def show(x : Option[String]) = x match {
            case Some(s) => s
            case None => "?"
        }
        println(show(myMap.get("k1"))) // v1
        println(show(myMap.get("k2"))) // ?

        // getOrElse() 获取存在的元素或者使用默认值
        val a : Option[Int] = Some(5)
        val b : Option[Int] = None
        println(a.getOrElse(0)) // 5
        println(b.getOrElse(10)) // 不存在,取默认值10
        println(a.isEmpty) // false
        println(b.isEmpty) // true

7. 迭代器

代码语言:javascript复制
        // Iterator 访问集合的方法
        // it.next() 返回下一个元素,并更新迭代器
        // it.hasNext 是否还有元素
        val it = Iterator("baidu", "alibaba", "tencent")
        while(it.hasNext){
            println(it.next())
        }
        val it1 = Iterator(1,2,3,-1)
        val it2 = Iterator(1,2,3,-1)
        val it3 = Iterator(1,2,3,-1)

        println(it1.min) // -1
        println(it2.max) // 3, 需要分开写,不能写 it1.max

        println(it1.size) // 0, 迭代器走到头了,剩余长度0
        println(it3.length) // 4

0 人点赞