zoukankan      html  css  js  c++  java
  • 大数据系列修炼-Scala课程09

    Option使用和实现内幕源码揭晓

      1.Option中的sealed关键字解析:Option中用了sealed,定义的case class与case object必须在同一个文件中。Option在模式匹配中匹配项

      2.Option使用内幕实战解析:Some表示匹配项,如果没有就在None中找

    //sealed 表示封闭式抽象类
    sealed abstract class Option[+A] extends Product with Serializable {}
    //而some也是继承了Option对象 case class
    final case class Some[+A](x: A) extends Option[A] {
      def isEmpty = false
      def get = x
    }
    //case object None继承了Option
    case object None extends Option[Nothing] {
      def isEmpty = true
      def get = throw new NoSuchElementException("None.get")
    }
        val scores = Map("Alice" -> 99, "Spark" -> 100)
        scores.get("Alicde") match {
        case Some(score) => println(score)
        case None => println("No score")
        }

    List的基本操作实战与基于模式匹配的List排序算法实现

      1.List的基本操作:isEmpty(),head,tail,排序

      2.基于模式模式的List排序算法实现:用函数的方式排序

         //定义两个常量list
        val bigData = List("Hadoop" , "Spark")
        val data = List(1 , 2 , 3)
        
        //::来连接两个list 
        val bigData_Core = "Hadoop" :: ("Spark" :: Nil)
        val data_Int = 1 :: 2 :: 3 :: Nil
        //isEmpty()方法判断是否为空
        println(data.isEmpty)
        //head方法list的第一个元素
        println(data.head)
        //tail表示除了第一个元素的元素类型为list
        println(data.tail.head)
        //把第一个赋值给a,第二个赋值给b
        val List(a,b) = bigData
        println("a : " + a + " === " + " b: " + b)
        //把第一个赋值给x,把第二个赋值给y 以后的元素赋值给rest rest为list类型
        val x :: y :: rest = data
        println("x : " + x + " === " + " y: " + y + " === " + rest )
        
        val shuffledData = List(6,3,5,6,2,9,1)
        //sortList排序
        println(sortList(shuffledData))
        //定义一个sortList排序函数 如果list为空就返回空的list -->否则就list的头元素与后面的list进行比较
        def sortList(list : List[Int]): List[Int] = list match{
          case List() => List()
          case head :: tail  => compute (head, sortList(tail))
        }
        //定义一个函数compute计算 从小到大
        def compute(data : Int , dataSet : List[Int]) : List[Int] = dataSet match{
          case List() => List(data)
          case head :: tail  => if (data <= head) data :: dataSet
            else  head :: compute(data, tail)    
        }
    

    List中的一阶函数操作实现

      1.List中的drop、take、splitAt、apply、indices、tostring、mkstring等实战

      2.List的toIterator、toArray、copyToArray实现

        //::用于连接两个list的组成新的list
        println(List (1,2,3,4) ::: List (4,5,6,7,8) ::: List (10,11))
        println(List (1,2,3,4) ::: (List (4,5,6,7,8) ::: List (10,11)))
        println(List (1,2,3,4).length)
        
        val bigData = List("Hadoop" , "Spark" , "Kaffka")
        //last表示最后一个元素
        println(bigData.last)
        //init除了最后一个的元素
        println(bigData.init)
        //reverse 表示翻转
        println(bigData.reverse)
        println(bigData)
        //take表示获取前n个元素
        println(bigData take 2)
        //drop截掉第n个元素
        println(bigData drop 1)
        //sqlitAt表示在n个元素的地方分割
        println(bigData splitAt 2)
        //获取序列为n的元素 开始为0
        println(bigData apply 2)
        //这与apply效果一样
        println(bigData(2))
        
        val data=List('a' ,'b', 'c', 'd', 'e', 'f')
        //indoces 获取系列号
        println(data.indices)
        //zip与indices按照序列组合成元素
        println(data.indices zip data)
        //zipwithIndex zip在前
        println(data.zipWithIndex)
        //转换为字符串
        println(data.toString)
        //组合成指定的元素
        println(data.mkString ("[", ",,", "]"))
        println(data.mkString ("******"))
        println(data mkString)
        
        //stringbuilder表示可变的元素
        val buffer = new StringBuilder
        data addString (buffer, "(", ";;", ")")
        println(buffer)
        println(data)
        //list转换为array
        val array = data.toArray
        println(array.toList)
        //转换为char类型的数组
        val new_Array = new Array[Char](10)
        data.copyToArray(new_Array,3)
        new_Array.foreach(print)
        println
        //转换为迭代器进行遍历
        val iterator = data.toIterator
        println(iterator.next)
        println(iterator.next)

    对List进行高效的排序和倒序代码实现

      1.对List进行排序实现

      2.对List进行倒序排序实现

        //定义一个归并排序函数 [T]使用泛型 
        def mergedsort[T] (less: (T, T) => Boolean) (input: List[T]): List[T] = {
          
          /**
         * @param xList 要合并的有序列表
         * @param yList 要合并的有序列表
         * @return 合并后的列表
         */
          //基本思想是把list分为两个list进行排序,先把两个list进行排序
        def merge(xList: List[T], yList: List[T]): List[T] =
          (xList, yList) match {
          case (Nil, _) => yList
          case (_, Nil) => xList
          case (x :: xtail, y :: ytail) =>
            if (less(x, y)) x :: merge(xtail, yList)
            else y :: merge(xList, ytail)
        }
        val n = input.length / 2
        if (n == 0) input
        else {
          val (x, y) = input splitAt n //把要排序的列表input平均分成两个列表
          merge(mergedsort(less)(x), mergedsort(less)(y))  //先对分后的两个列表归并排序,再对排好的有序表进行归并
        }
      }
        println(mergedsort((x: Int, y: Int) => x < y) (List (3, 7, 9, 5)))
      //定义一个倒序的归并排序 val reversed_mergedsort
    =mergedsort((x: Int, y: Int) => x > y) _ println(reversed_mergedsort(List(3, 7, 9, 5)))

    今天主要的内容是关于list的基本操作!明天继续.............

    希望大家关注王家林老师的视频微信号(18610086859)

    最新地址75讲:http://pan.baidu.com/s/1dDFDRmL

    百度云地址31-34讲:http://pan.baidu.com/s/1mgiV7Vq

  • 相关阅读:
    敏捷开发 之 计划、测试 与 重构
    敏捷开发 之 理论概述篇
    第二十章 排查和调试Web程序 之 设计异常处理策略
    第十九章 排查和调试Web程序 之 防止和排查运行时问题
    第十八章 提升用户体验 之 减少带宽占用
    第十七章 提升用户体验 之 使用MVC扩展功能控制程序行为
    第十六章 提升用户体验 之 设计实现routes
    第十五章 提升用户体验 之 设计实现MVC controllers 和 actions
    第十四章 提升用户体验 之 设计实现国际化和本地化
    Nginx系统学习笔记(3)同一端口下设置Alias(虚拟目录)
  • 原文地址:https://www.cnblogs.com/524646016-zhang/p/zhangsh_dt_scala_09.html
Copyright © 2011-2022 走看看