1. 好友关系分析
1.1 数据准备:
为了演示如何使用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
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
1.2 代码实现
// 首先读取文件数据,并将其转换为(用户, List(好友列表))的形式 val friends = scala.io.Source.fromFile("path/to/friends.txt").getLines().map(line => { val parts = line.split(":") (parts(0), parts(1).split(",").toList) }).toList
// 对每一对用户进行比较,找出他们的共同好友 val commOnFriends= for ((user1, friends1) <- friends; (user2, friends2) <- friends if user1 != user2) yield (s"$user1 和 $user2 的共同好友为:", friends1.intersect(friends2))
// 过滤掉没有共同好友的用户对,并打印结果 commonFriends.filter(_._2.nonEmpty).foreach(println)
2. 线段重叠计算
2.1 数据准备
本案例的数据包括若干线段的起点和终点坐标:
1,4
2,5
4,6
2,4
3,6
4,6
1,5
2.2 思路分析
线段重叠问题可以通过将每条线段分解成一系列点,然后统计这些点的出现频率来解决。这种方法本质上类似于Word Count算法的应用。
2.3 代码实现
// 读取线段数据 val lines = scala.io.Source.fromFile("path/to/lines.txt").getLines().map(_.split(",").map(_.toInt)).toList
// 将每条线段分解成点,并统计每个点的出现次数 val pointCounts = lines.flatMap(line => (line(0) to line(1)).map(point => (point, 1))).groupBy(_._1).mapValues(_.size)
// 按照出现次数降序排序并打印结果 pointCounts.toSeq.sortBy(-_._2).foreach(println)