scala平均温度案例、共同好友案例、线段重叠案例的实现

平均温度案例

package com.doit.day03

/**
 * 需求:求最近几天每个城市的平均温度
 */
object AvgTem {
  def main(args: Array[String]): Unit = {
    val d1 = Array(("beijing", 28.1), ("shanghai", 28.7), ("guangzhou", 32.0), ("shenzhen", 31.0))
    val d2 = Array(("beijing", 27.3), ("shanghai", 30.1), ("guangzhou", 33.3))
    val d3 = Array(("beijing", 28.2), ("shanghai", 29.1), ("guangzhou", 32.0), ("shenzhen", 32.0))

    //1.将所有的数据都放在一个数组或者集合中
    val allData: Array[(String, Double)] = d1 ++ d2 ++ d3
    //Array(("beijing", 28.1), ("shanghai", 28.7), ("guangzhou", 32.0), ("shenzhen", 33.1),("beijing", 27.3), ("shanghai", 30.1), ("guangzhou", 33.3),("beijing", 28.2), ("shanghai", 29.1), ("guangzhou", 32.0), ("shenzhen", 32.1))

    //按照城市分组
    val grouped: Map[String, Array[(String, Double)]] = allData.groupBy(tp => tp._1)

    //方式一,获取到所有的温度,sum求和后求平均
    val res: Map[String, Double] = grouped.map(tp => {
      //数组中每一个元素的key都是一样的,只是温度不一样,现在需要将整个数组转换成城市,平均温度
      val value: Array[(String, Double)] = tp._2
      val avg: Double = value.map(_._2).sum / value.length
      (tp._1, avg)
    })
    println(res)


    //方式二,只对value进行处理
    val res1: Map[String, (String, Double)] = grouped.mapValues(tp => {
      val avg: Double = tp.reduce(_._2 + _._2) / tp.length
      (tp(0)._1, avg)
    })

  }
}

共同好友案例

package com.doit.day03

import scala.io.{BufferedSource, Source}

/**
 * 数据如下  :每个字母代表一个人 ,  统计任意一个人和其他人的共同好友
 * A:B,C,D,F,E,O
 * B:A,C,E,K
 * C:F,A,D,I
 * D:A,E,F,L
 * E:B,C,D,M,L
 * F:A,B,C,D,E,O,M
 * G:A,C,D,E,F
 * H:A,C,D,E,O
 * I:A,O
 * J:B,O
 * K:A,C,D
 * L:D,E,F
 * M:E,F,G
 * O:A,H,I,J
 */
object SameFriends {
  def main(args: Array[String]): Unit = {
     val lines: Iterator[String] = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\friends").getLines()
     val myAndFriends: List[(String, Array[String])] = lines.toList.map(line => {
        //        A:B,C,D,F,E,O   :前面的是我自己,:后面的是我的朋友们
        val arr: Array[String] = line.split(":")
        //获取到我自己
        val user: String = arr(0)
        //获取到我的朋友们,朋友们都放在数组里面,里面的元素就是一个个的朋友对象
        val friends: Array[String] = arr(1).split(",")
        (user, friends)
     })

     //获取共同好友。。。
     for(i <- 0 until myAndFriends.length){
        for(j <- i+1 until myAndFriends.length){
           //从第一个元素开始取
           val tuple: (String, Array[String]) = myAndFriends(i)
           val tuple1: (String, Array[String]) = myAndFriends(j)
           //看是不是有共同好友,是不是取交集
           val sameFriends: Array[String] = tuple._2.intersect(tuple1._2)
           println("用户:"+tuple._1+"用户:"+tuple1._1+"的共同好友是:"+sameFriends.mkString(","))
        }
     }
  }
}

线段重叠案例

1,4
2,5
4,6
2,4
3,6
4,6
1,5

package com.doit.day03

import scala.io.Source

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

    val list: List[String] = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\line.txt").getLines().toList

    //生成一个个的点
    val points: List[Range.Inclusive] = list.map(line => {
      val arr: Array[String] = line.split(",")
      val start: String = arr(0)
      val end: String = arr(1)
      //按照起始得位置确定这一行中一共有哪些点,后面才能判断哪些点是重合的
      //根据开始和结束得点
      val range: Range.Inclusive = start.toInt to end.toInt
      range
    })

    //将点压平
    val flattened: List[Int] = points.flatten
    //对点分组
    val intToInts: Map[Int, List[Int]] = flattened.groupBy(point => point)
    //获取到最后的个数
    val res: Map[Int, Int] = intToInts.map(tp => (tp._1, tp._2.size))

    res.foreach(println)
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值