ABCDer丶Bi 发表于 2017-10-20 19:53:38

学习scala的那五天__第二天

本帖最后由 ABCDer丶Bi 于 2017-10-20 20:42 编辑

学习scala的那五天__第一天
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22957
(出处: about云开发)

第一天的作业答案会在后面楼层发布

2数组、映射、元组、集合 2.1数组
   2.1.1定长数组和变长数组
    //初始化一个长度为8的定长数组,其所有元素均为0
        val arr1 = new Array(8)        //直接打印定长数组,内容为数组的hashcode值        println(arr1)        //将数组转换成数组缓冲,就可以看到原数组中的内容了         //toBuffer会将数组转换长数组缓冲
        println(arr1.toBuffer)

         //注意:如果不new,相当于调用了数组的apply方法,直接为数组赋值
        //初始化一个长度为1的定长数组
        val arr2 = Array(10)
         println(arr2.toBuffer)

         //定义一个长度为3的定长数组
        val arr3 = Array("hadoop", "storm", "spark")
         //使用()来访问元素
        println(arr3(2))

         //////////////////////////////////////////////////
        //变长数组(数组缓冲)
        //如果想使用数组缓冲,需要导入import scala.collection.mutable.ArrayBuffer包
        val ab = ArrayBuffer()
         //向数组缓冲的尾部追加一个元素
        //+=尾部追加元素
        ab += 1
         //追加多个元素
        ab += (2, 3, 4, 5)
         //追加一个数组++=
        ab ++= Array(6, 7)
         //追加一个数组缓冲
        ab ++= ArrayBuffer(8,9)
         //打印数组缓冲ab

        //在数组某个位置插入元素用insert
        ab.insert(0, -1, 0)
         //删除数组某个位置的元素用remove
        ab.remove(8, 2)
         println(ab)   2.1.2遍历数组   1.增强for循环         2.好用的until会生成脚标,0 until 10 包含0不包含10                  //初始化一个数组                val arr = Array(1,2,3,4,5,6,7,8)                   //增强for循环
                   for(i <- arr)
                     println(i)

                   //好用的until会生成一个Range
                   //reverse是将前面生成的Range反转
                   for(i <- (0 until arr.length).reverse)
                     println(arr(i))   2.1.3数组转换   yield关键字将原始的数组进行转换会产生一个新的数组,原始的数组不变                     //定义一个数组                 val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)                 //将偶数取出乘以10后再生成一个新的数组                 val res = for (e <- arr if e % 2 == 0) yield e * 10             println(res.toBuffer)
             //更高级的写法,用着更爽                //filter是过滤,接收一个返回值为boolean的函数             //map相当于将数组中的每一个元素取出来,应用传进去的函数              val r = arr.filter(_ % 2 == 0).map(_ * 10)
                println(r.toBuffer)   2.1.3数组常用算法      在Scala中,数组上的某些方法对数组进行相应的操作非常方便!      
2.2映射
         2.2.1构建映射
         2.2.2获取和修改映射中的值
         
         好用的getOrElse
         
         注意:在Scala中,有两种Map,一个是immutable包下的Map,该Map中的内容不可变;另一个是mutable包下的Map,该Map中的内容可变         例子:                  注意:通常我们在创建一个集合是会用val这个关键字修饰一个变量(相当于java中的final),那么就意味着该变量的引用不可变,该引用中的内 容是不是可变,取决于这个引用指向的集合的类型2.3元组    映射是K/V对偶的集合,对偶是元组的最简单形式,元组可以装着多个不同类型的值。         2.3.1创建元组                  2.3.2获取元组中的值                  2.3.3将对偶的集合转换成映射                  2.3.4拉链操作             zip命令可以将多个值绑定在一起    注意:如果两个数组的元素个数不一致,拉链操作后生成的数组的长度为较小的那个数组的元素个数   篇幅原因放在下面了

ABCDer丶Bi 发表于 2017-10-20 19:55:59

本帖最后由 ABCDer丶Bi 于 2017-10-20 20:40 编辑

2.4集合   Scala的集合有三大类:序列Seq、集合Set、映射Map,所有的集合都扩展自Iterable特质    在Scala中集合有可变(mutable)和不可变(immutable)两种类型,immutable类型的集合初始化后就不能改变了(注意与val修饰的变量进行区 别)          2.4.1序列Seq
    不可变的序列 import scala.collection.immutable._
    在Scala中列表要么为空(Nil表示空列表)要么是一个head元素加上一个tail列表。    9 :: List(5, 2):: 操作符是将给定的头和尾创建一个新的列表    注意::: 操作符是右结合的,如9 :: 5 :: 2 :: Nil相当于 9 :: (5 :: (2 :: Nil))    //创建一个不可变的集合    val lst1 = List(1,2,3) //将0插入到lst1的前面生成一个新的List val lst2 = 0 :: lst1    val lst3 = lst1.::(0) val lst4 = 0 +: lst1    val lst5 = lst1.+:(0)
   //将一个元素添加到lst1的后面产生一个新的集合    val lst6 = lst1 :+ 3
val lst0 = List(4,5,6)    //将2个list合并成一个新的List    val lst7 = lst1 ++ lst0 //将lst0插入到lst1前面生成一个新的集合 val lst8 = lst1 ++: lst0
    //将lst0插入到lst1前面生成一个新的集合 val lst9 = lst1.:::(lst0)
    println(lst9)    可变的序列 import scala.collection.mutable._    //构建一个可变列表,初始有3个元素1,2,3 val lst0 = ListBuffer(1,2,3) //创建一个空的可变列表 val lst1 = new ListBuffer //向lst1中追加元素,注意:没有生成新的集合 lst1 += 4 lst1.append(5)
//将lst1中的元素追加到lst0中, 注意:没有生成新的集合 lst0 ++= lst1
//将lst0和lst1合并成一个新的ListBuffer 注意:生成了一个集合 val lst2= lst0 ++ lst1
//将元素追加到lst0的后面生成一个新的集合 val lst3 = lst0 :+ 5          2.4.2集合Set
    不可变的Set
   val set1 = new HashSet()
    //将元素和set1合并生成一个新的set,原有set不变     val set2 = set1 + 4    //set中元素不能重复     val set3 = set1 ++ Set(5, 6, 7)    val set0 = Set(1,3,4) ++ set1     println(set0.getClass)         可变的Set   //创建一个可变的HashSet
   val set1 = new mutable.HashSet()   //向HashSet中添加元素set1 += 2//add等价于+=set1.add(4)set1 ++= Set(1,3,5)println(set1) //删除一个元素set1 -= 5set1.remove(2)println(set1)      2.4.3映射Map                     val map1 = new mutable.HashMap[String, Int]()         //向map中添加数据          map1("spark") = 1         map1 += (("hadoop", 2))         map1.put("storm", 3)         println(map1)
         //从map中移除元素         map1 -= "spark"         map1.remove("hadoop")         println(map1)好吧,今天也就到这里了,被自己的排版折服




补充内容 (2017-10-21 09:30):
由于之前不是很会用这些东西,没有来得及审查,排版问题以及文字中间出现的错误,希望大家看的时候推敲一下,深表歉意.

补充内容 (2017-10-21 15:09):
学习scala的那五天__第二天缺失版
http://www.aboutyun.com/forum.php?mod=viewthread&tid=22961
(出处: about云开发)

pig2 发表于 2017-10-20 20:16:02

ABCDer丶Bi 发表于 2017-10-20 19:55
噗...还没整理好,一个回车就出去了


有编辑按钮

ABCDer丶Bi 发表于 2017-10-20 20:17:12

本帖最后由 ABCDer丶Bi 于 2017-10-20 20:37 编辑

pig2 发表于 2017-10-20 20:16
有编辑按钮
看到咯,正在搞,谢谢了

ABCDer丶Bi 发表于 2017-10-21 09:22:40

本帖最后由 ABCDer丶Bi 于 2017-10-21 09:24 编辑

//第一天的练习答案

    //创建一个List
    val list0 = List(3,4,6,2,1,7,8,9,5)


    //将list0中每个元素乘以2后生成一个新的集合
//    val f1 = (x: Int) => x * 2
//    val res = list0.map(f1)
//    val res = list0.map(_ * 2)


    //将list0的偶数取出来生成一个新的集合
//    val res = list0.filter(_ % 2 == 0)


    //将list0排序后生成一个新的集合
//    val res = list0.sorted


    //反转排序顺序
//    val res = list0.sorted.reverse


    //将list0中的元素4个一组,类型为Iterator]
    val grouped: Iterator] = list0.grouped(4)


    //将Iterator转换成List
//    val res = grouped.toList


    //将多个list压扁成一个List
    val list2 = List(List(1,2,3), List(4,5,6), List(7,8,9))

//    val res = list2.flatten

    //先按空格切分,再压平
    val list3 = List("hello java", "hello scala hello", "hello php", "hello python")

//    val res = list3.map(_.split(" ")).flatten
    val res = list3.flatMap(_.split(" "))


    println(res)




val arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

    // 求和
    //    val res = arr.sum

    //并行计算求和
    // (1+2+3+4)+(5+6+7)+(8+9+10)
    //    val res = arr.par.sum

    // reduce进行聚合
    //    val res = arr.reduce((x, y) => x + y)
    //    val res = arr.reduce(_ + _)
    //    val res = arr.reduceLeft(_ + _) // ((1+2)+3)+4 ...

    // reduce进行聚合(按照非特定顺序),并行聚合
    //    val res = arr.par.reduce(_+_)

    // 例外
    //    val res = arr.par.reduceLeft(_+_) // ((1+2)+3)+4 ...
    //    val res = arr.par.reduceRight(_+_) // ((10+9)+8)+7 ...

    // 并行求差
    //    val res = arr.reduce(_-_)
    //    val res = arr.par.reduce(_-_)


    //折叠:有初始值(有特定顺序)
    //    val res = arr.fold(0)(_+_)
    //    val res = arr.fold(10)(_+_)


    //折叠:有初始值(无特定顺序)
    //    val res = arr.par.fold(0)(_+_)
    // 例如三个线程执行任务:(10+1+2+3+4)+(10+5+6+7)+(10+8+9+10)
    //    val res = arr.par.fold(10)(_+_)
    //    val res = arr.par.fold(10)(_-_)


    //聚合

    val list1 = List(List(1, 2, 3), List(3, 4, 5), List(2), List(0))

    //    val res = list1.flatten.reduce(_+_)
    //    val res = list1.flatten.fold(0)(_ + _)
    //    val res = list1.aggregate(0)(_+_.sum, _+_) // 内部其实还是调用的foldLeft(有特定顺序聚合)
    //    val res = list1.par.aggregate(10)(_+_.sum, _+_)


    // 聚合,需求:结果为有个元组,元组里的第一个值是arr1的总和,第二个值是有多少个数参与聚合运算,(数组聚合的值,数组的长度)
    val arr1 = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)

//    val res = arr1.aggregate((0, 0))(
//      (acc, num) => (acc._1 + num, acc._2 + 1),
//      (par1, par2) => (par1._1 + par2._1, par1._2 + par2._2)
//    )


    val l1 = List(5, 6, 4, 7)
    val l2 = List(1, 2, 3, 4)

    //求并集
//    val res = l1 union l2


    //求交集
//    val res = l1 intersect l2


    //求差集
//    val res = l1.diff(l2)
//    val res = l2.diff(l1)


//    println(res)

JKiller 发表于 2017-10-21 15:01:41

{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}{:2_31:}
页: [1]
查看完整版本: 学习scala的那五天__第二天