Scala 练习

Scala 练习

统计总分年级排名前十学生各科的分数

package com.shujia.scala

import scala.io.{BufferedSource, Source}

object Demo35Student {
  def main(args: Array[String]): Unit = {


    /**
      * 统计总分年级排名前十学生各科的分数
      *
      * 1、统计每个学生的总分
      *
      * 2、按总分排名
      *
      * 3、取前十的学生
      *
      * 4、关联获取学生各科的分数
      *
      */


    //1、读取分数表
    val source: BufferedSource = Source.fromFile("data/score.txt")
    val scores: List[String] = source.getLines().toList

    //2、取出学号和分数
    val idAndScore: List[(String, Double)] = scores.map(s => {
      val split: Array[String] = s.split(",")
      (split(0), split(2).toDouble)
    })

    //3、按学生分组
    val scoreGroup: Map[String, List[(String, Double)]] = idAndScore.groupBy(kv => kv._1)

    //4、计算学生的总分
    val idSumScore: Map[String, Double] = scoreGroup.map {
      case (id: String, scoAndIds: List[(String, Double)]) =>

        //计算学生的总分
        val scos: List[Double] = scoAndIds.map(kv => kv._2)

        val sumScore: Double = scos.sum

        //返回数据
        (id, sumScore)
    }

    //将map转换成list
    val sumScoreList: List[(String, Double)] = idSumScore.toList

    //5、按照总分降序排序
    val sortSumScore: List[(String, Double)] = sumScoreList.sortBy(kv => -kv._2)

    //6、取前十
    val top10: List[(String, Double)] = sortSumScore.take(10)

    //7、取出前十学生的学号
    val top10Ids: List[String] = top10.map(kv => kv._1)

    //8、取出前十学生各科的分数
    val top10Student: List[String] = scores.filter(sco => {
      val id: String = sco.split(",")(0)
      top10Ids.contains(id)
    })

    top10Student.foreach(println)
  }
}

统计偏科最严重的前100名学生

package com.shujia.scala

import scala.io.{BufferedSource, Source}

object Demo36Student {
  def main(args: Array[String]): Unit = {
    /**
      * 统计偏科最严重的前100名学生
      *
      */

    //1、读取文件
    val source: BufferedSource = Source.fromFile("data/score.txt")
    val scores: List[String] = source.getLines().toList

    //2、取出学号和分数
    val idAndScore: List[(String, Double)] = scores.map(sco => {
      val split: Array[String] = sco.split(",")
      val id: String = split(0)
      val score: Double = split(2).toDouble
      (id, score)
    })

    //3、按照学号分组
    val groupBy: Map[String, List[(String, Double)]] = idAndScore.groupBy(kv => kv._1)

    //4、计算方差
    val result: List[(String, List[(String, Double)], Double)] = groupBy
      .toList
      .map {
        case (id: String, idAndSco: List[(String, Double)]) =>
          //取出学生各科的分数
          val scores: List[Double] = idAndSco.map(kv => kv._2)

          //计算平均值
          val avg: Double = scores.sum / scores.length

          //带入公式计算方差
          val std: Double = scores.map(sco => (sco - avg) * (sco - avg)).sum / scores.length

          //返回数据
          (id, idAndSco, std)
      }

    //5、按照方差排序
    val sort: List[(String, List[(String, Double)], Double)] = result.sortBy(kv => -kv._3)

    //6、取前100
    val top100: List[(String, List[(String, Double)], Double)] = sort.take(100)

    top100.foreach(println)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值