Scala练习

wordCount

package com.doit.day03
import scala.io.{BufferedSource, Source}
object WordCountDemo {
 def main(args: Array[String]): Unit = {
 //读取文件,获取到一个Source对象
 val source: BufferedSource = Source.fromFile("D:\\develop\\ideaWorkSpace\\myself\\study\\scalaDemo\\data\\word.txt")
 //调用getLines方法,获取到每一行数据,每一行数据都放在迭代器中
 val lines: Iterator[String] = source.getLines()
 //如果我现在直接这么返回,他的返回值是什么?? Iterator[String] ==》 同样的返回一个迭代器,迭代器里面放得是Array[String] 数组里面每一个元素放得都是一个个的单词
 val arrWord: Iterator[Array[String]] = lines.map(line => {
 //1.需要将每一行数据拿出来进行切割,变成一个个的单词
 //hello hadoop hive
 val wordsArr: Array[String] = line.split("\\s+")
 wordsArr
 })
 //将迭代器转换成了集合
 val list: List[Array[String]] = arrWord.toList
 //将list中的array压平,这样list装的就是每一个单词了
 val word: List[String] = list.flatten
 //对每一个单词进行分组,相同的单词分在一组,key就是单词,value是一个list,所有相同的单词都放在这个list中
 val wordAndList: Map[String, List[String]] = word.groupBy(word => word)
 //转换,将list转换成长度,长度就是单词的个数
 val wordCount: Map[String, Int] = wordAndList.map(tup => (tup._1, tup._2.size))
 //查看结果
 println(wordCount)
 }
}

平均温度案例

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(","))
 }
 }
 }
}
作者:_泡泡原文地址:https://www.cnblogs.com/paopaoT/p/17500207.html

%s 个评论

要回复文章请先登录注册