大数据计算-Scala编程

1.创建一个Person单例,在Person中定义一个List((“xiaoming1”,“男”,18), (“xiaohua1”,“女”,20), (“xiaomeng”,“男”,18), (“xiaoli1”,“女”,19), (“xiaoming2”,“男”,22), (“xiaoli2”,“女”,17), (“xiaoming4”,“男”,28)

(1)把每个人的年龄改成之前的3倍;
(2)过滤年龄小于20的;
(3)过滤别是女的过滤掉;
(4)计算一下所有人的总年龄;
(5)请按照年龄从小到大排序;
(6)请按照年龄从大到小排序;
(7)把每个人的姓名性别年龄合成一个输出;
(8)把年龄为奇数和偶数的人分开

程序代码:
object Person{

  def main(args:Array[String]): Unit = {
    var list = List(("xiaoming1","man",18),("xiaohua","woman",20),("xiaomeng","man",18),("xiaoli1","woman",19),("xiaoming2","man",22),("xiaoli2","woman",17),("xiaoming4","man",28))
    println()

    var res1 = list.map(a  => List(a._1,a._2,a._3 * 3))
    println(res1)
    println()

    var res2 = list.map(a => List(a._1,a._2,a._3 * 2 - 1))
    println(res2)
    println()

    var res3 = list.filter(a => if(a._3 < 20) false else true)
    println(res3)
    println()

    var res4 = list.filter(a => if(a._3.equals( "woman")) false else true)
    println(res4)
    println()
    
    var res5 = list.map(a => a._3).reduce((a,b) => a+b)
    println(res5)
    println()

    list.sortBy(x => x._3).foreach(println)
    println()

    list.sortBy(x => -x._3).foreach(println)
    println()

    var res6 = list.map(a => a._1+a._2+a._3)
    println(res6)
    println()

    var res7 = list.partition({x =>x._3 % 2 == 0})
    println(res7)
  }
}
运行结果:

在这里插入图片描述

2. 计算级数

编程计算并输出下列级数的前n项之和Sn,直到Sn刚好大于或等于q为止,其中q为大于0的整数,其值通过键盘输入。

例如,若q的值为50.0,则输出应为:Sn=50.416695。在REPL模式下测试运行,测试样例:q=1时,Sn=2;q=30时,Sn=30.891459;q=50时,Sn=50.416695。

程序代码:
import scala.io.StdIn._
import scala.util.control.Breaks._
import scala.util.{Try, Success, Failure}
 
object project_two {
  def main(args: Array[String]): Unit = {
    breakable {
      //通过一个死循环,加一个循环控制实现连续输入功能
      while (true) {
        println("请输入一个正整数:")
        println("输入q或Q退出......")
        //因为从键盘输入的数据,包括各种类型,为了增加容错,故选用readLine()
        val input = readLine()
        //调用Try类,通过模式匹配实现容错处理
        Try(input.toLong) match {
            //判断输入值是否是正数
          case Success(q) if (q <= 0) =>
            println("请输入一个大于0的正整数。")
          case Success(q) =>
            try {
              //实现级数计算的逻辑
              var sn = 0.0
              var n = 1
              var an = 1.0
              while (sn < q) {
                //通过Math.addExact()函数对数据溢出异常进行处理
                an = Math.addExact(n , 1) / n.toDouble
                sn = sn + an
                n = Math.addExact(n, 1)
              }
              printf("当q=%d, sn=%.6f",q,sn)
              println()
            } catch {
                  //对捕获的异常进行处理
              case _: ArithmeticException =>
                println("计算中发生了溢出异常。请尝试输入较小的正整数。")
              case _: Exception =>
                println("发生了未知异常。")
            }
            //实现程序退出功能
          case Failure(_: NumberFormatException) if input.equalsIgnoreCase("q") =>
            println("程序已退出......")
            break
            //异常处理
          case Failure(_: NumberFormatException) =>
            println("输入无效,请输入一个有效的正整数或q退出。")
          case Failure(exception) =>
            println(s"发生了未知异常:${exception.getMessage}")
        }
      }
    }
  }
}

运行结果:

在这里插入图片描述

3. 模拟图形绘制

对于一个图形绘制程序,用下面的层次对各种实体进行抽象。定义一个Drawable的特质,其包括一个draw方法,默认实现为输出对象的字符串表示。定义一个Point类表示点,其混入了Drawable特质,并包含一个shift方法,用于移动点。所有图形实体的抽象类为Shape,其构造函数包括一个Point类型,表示图形的具体位置(具体意义对不同的具体图形不一样)。Shape类有一个具体方法moveTo和一个抽象方法zoom,其中moveTo将图形从当前位置移动到新的位置, 各种具体图形的moveTo可能会有不一样的地方。zoom方法实现对图形的放缩,接受一个浮点型的放缩倍数参数,不同具体图形放缩实现不一样。继承Shape类的具体图形类型包括直线类Line和圆类Circle。Line类的第一个参数表示其位置,第二个参数表示另一个端点,Line放缩的时候,其中点位置不变,长度按倍数放缩(注意,缩放时,其两个端点信息也改变了),另外,Line的move行为影响了另一个端点,需要对move方法进行重载。Circle类第一个参数表示其圆心,也是其位置,另一个参数表示其半径,Circle缩放的时候,位置参数不变,半径按倍数缩放。另外直线类Line和圆类Circle都混入了Drawable特质,要求对draw进行重载实现,其中类Line的draw输出的信息样式为“Line:第一个端点的坐标–第二个端点的坐标)”,类Circle的draw输出的信息样式为“Circle center:圆心坐标,R=半径”。如下的代码已经给出了Drawable和Point的定义,同时也给出了程序入口main函数的实现,请完成Shape类、Line类和Circle类的定义。

程序代码:
//模拟图形绘制
//所有图,用一个接口实现
trait Drawable{
  def draw():Unit={
    println(this.toString)
  }
}
//创建一个点样例类,所有图形都包括点,用一个样例类对点实现封装
case class Point(var x:Double,var y:Double) extends Drawable{
  //点移动方法
  def shift(deltaX:Double,deltaY:Double)={
    x = x + deltaX
    y = y + deltaY
  }
}
//所有图形的父类是抽象类
abstract class Shape(var position:Point){
  //移动
  def moveTo(newPosition:Point)={
    position = newPosition
  }
  //伸缩
  def zoom(scaleFactor:Double):Unit
  override def toString: String = s"Shape:position($position)"
}
//直线类
class Line(start:Point,end:Point) extends Shape(start) with Drawable{
  //末点
  private var endPoint = end
  //移动
  override def moveTo(newPosition:Point):Unit={
    val deltaX = newPosition.x-position.x
    val deltaY = newPosition.y - position.y
    super.moveTo(newPosition)
    endPoint.shift(deltaX,deltaY)
  }
//伸缩
  override def zoom(scaleFactor: Double): Unit = {
    val newEndX = position.x + (endPoint.x - position.x)*scaleFactor
    val newEndY = position.y + (endPoint.y - position.y)*scaleFactor
    endPoint = Point(newEndX,newEndY)
  }
  override def toString:String = s"Line:$position--$endPoint"
 
}
//圆类
class Circle(center:Point,radius:Double) extends Shape(center) with Drawable{
  private var circleRadius:Double=radius//半径
  //伸缩
  def zoom(scaleFactor:  Double): Unit = {
    circleRadius = circleRadius*scaleFactor
  }
  override def toString: String = s"Circle center:$position,R=$circleRadius"
}
object project_three {
  def main(args:Array[String])={
   try{
     //创建一个点对象
     val p = new Point(10,30)
     //输出对象
     p.draw()
     //创建一个直线对象
     val line1 = new Line(Point(0,0),Point(20,20))
     //输出直线对象本身
     line1.draw()
     //将直线移动到Point(5,5)
     line1.moveTo(Point(5,5))
     //输出直线对象的位置
     line1.draw()
     //将直线伸长为原来的两倍
     line1.zoom(2)
     //输出直线对象
     line1.draw()
     //创建一个圆
     val cir = new Circle(Point(10,10),5)
     //输出圆
     cir.draw()
     //移动到点(30,20)
     cir.moveTo(Point(30,20))
     //输出圆的参数
     cir.draw()
     //缩小为原来的一半
     cir.zoom(0.5)
     //输出圆的参数
    cir.draw()
   } catch {
     case ex:Exception => println(s"Exception is ${ex.getMessage}")
   }
  }
}
运行结果:

在这里插入图片描述

4. 创建一个ListOperation的单例,在ListOperation中

(1)创建一个名为list的List(6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 1, 2, 3, 4, 5)列表
(2)使用map方法和foreach方法list遍历
(3)将集合内数据+10产生一个新的列表L2
(4)将L2中的所有偶数取出来产生一个新的列表L3
(5)计算L3数据的总和
(6)将L3倒序排序
(7)将L3反转
(8)创建新list1数据为 List(Array(11,22,33), Array(44,55,66))
(9)使用flatten将list1列表合并成一个新的列表
(10)将list奇数偶数分开打印.

程序代码:
object ListOperation{

  def main(args:Array[String]): Unit = {
    var list = List(6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5)
    println()

    list.map(println)
    println()

    list.foreach(println)
    println()

    var L2 = list.map(_ + 10)
    L2.foreach(println)
    println()

    var L3 = L2.filter(x => if(x % 2 ==0) true else false)
    L3.foreach(println)
    println()

    println(L3.reduce((a,b) => a+b))
    println()
    
    println(L3.sortBy(x => -x))
    println()

    println(L3.reverse)
    println()

    var list1 = List(Array(11,22,33),Array(44,55,66))
    list1.foreach(println)
    println()

    var list2 = list1.flatten
    list2.foreach(println)
    println()

    var list3 = list2.partition(x => x%2 == 0)
    list3._1.map(println)
    println()
    list3._2.map(println)
  }
}
运行结果:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值