Scala学习-函数式编程,计算两个人的共同好友
Posted Mr.zhou_Zxy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scala学习-函数式编程,计算两个人的共同好友相关的知识,希望对你有一定的参考价值。
通过Scala函数式编程,计算两个人的共同好友
- 数据
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
- 代码
object Friends{
/**
* file:Friends
* author:zxy
* date:2021-06-03
* desc:读取数据,并通过求交集的方式找到两个人之间的共同好友
*/
def main(args: Array[String]): Unit = {
// 读取数据,得到数据缓冲流
val bs: BufferedSource = Source.fromFile("E:\\\\BigData\\\\bd\\\\resource\\\\date.txt")
//将数据以行读取
val lines: Iterator[String] = bs.getLines()
//处理数据 获取每个人和他们对应的好友列表
val res1: Iterator[(String, Array[String])] = lines.map(line => {
//以":"为切割符,取分号左边的数据作为user
val user = line.split(":", -1)(0)
//以":"为切割符,取分号右边的数据,并以","为切割符存在friends中
val friends: Array[String] = line.split(":", -1)(1).split(",", -1)
//将user,friends存储在res1中
(user, friends)
})
//res1的输出数据格式为:(A,[Ljava.lang.String;@47f6473),将res1转为Array数组
val arr: Array[(String, Array[String])] = res1.toArray
//双层遍历 依次获取两个人好友的交集
val res = for (i <- 0 until (arr.length - 1); j <- i + 1 until (arr.length))
//将满足yield后条件的数据,重新存入Array数组res中
yield {
//intersect:求两者得交集,arr(i)._2即为获取friends的Array数组数据
val same: Array[String] = arr(i)._2.intersect(arr(j)._2)
//arr(i)._1即为获取user的Array数组数据
(arr(i)._1 + "和" + arr(j)._1 + "的好友有: ", same)
}
//res的数据输出格式为:(A和B的好友有: ,[Ljava.lang.String;@5dfcfece)
// 过滤空值输出结果
res.map(tp => {
val key: String = tp._1
val list: List[String] = tp._2.toList
(key, list)
}).filter(_._2.size > 0).foreach(println)
}
}
以上是关于Scala学习-函数式编程,计算两个人的共同好友的主要内容,如果未能解决你的问题,请参考以下文章