1.找好友列表中的共同好友
有如下文件,:前面的代表用户,后面的内容代表好友列表,获取任意两个人的共同好友
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
2,思路
- 将用户与好友列表处理成用户为key,单个好友为value的(K,V)对的形式,然后指定任意两个好友(此步骤也可提到处理为(K,V)之前提升性能),按V聚合,如果聚合后的第二个字段的长度为2说明当前的value就是指定用户的共同好友
2.将用户与好友列表切分成(k,v)然后依次遍历当前用户和剩余用户的好友列表,并求其交集,指定两个用户数据即为所求
代码实现
思路1
import java.io.File
import scala.io.Source
object CommonFriend {
def main(args: Array[String]): Unit = {
getComFrdBy2User("a", "b")
}
/**
* A: B,C,D,F,G
* B: C, D, H, J,K
* @param userName1
* @param userName2
*/
def getComFrdBy2User(userName1: String, userName2: String) = {
//读取文件内容到bufferSource
val bufSur = Source.fromFile(new File("src/demo/friendsList.data"))
/**按行遍历并将行数据按 : 切分 遍历([a], [b,c,d,e])数据将好友列表数据按 , 切分并遍历数据重组数据为(user, friend)的形式并压平得到用户为key,好友为valuse的k-v数据 */
bufSur.getLines().map(e => e.split(":")).flatMap(e => {
e(1).split(",").map(e1 => (e(0), e1) )
})
//过滤出目标好友数据(未优化)
.filter(e => (e._1 == userName1.toUpperCase() || e._1 == userName2.toUpperCase()))
//聚合并过滤出目标数据
.toList.groupBy(_._2).filter(_._2.length > 1).map(e => e._1).foreach((println))
// 记得关闭资源哦
bufSur.close()
}
}
思路2
import scala.io.Source
object CommonFriends {
def main(args: Array[String]): Unit = {
val sb = Source.fromFile("src/demo/friendsList.data")
//切分数据为user,friends的数据类型
val kvs = sb.getLines().map(_.split(":")).toList
//将所有用户与未匹配用户遍历(改程序遍历了所有用户,并未对两用户进行限定
for(i <- 0 to kvs.length-1; j <- i+1 to kvs.length-1 ) {
//将当前用户好友列表切分并与别的用户切分的好友列表取交集(交集即为所求)
val fs = kvs(i)(1).split(",").intersect(kvs(j)(1).split(","))
//打印结果集
fs.foreach(e => println(kvs(i)(0) + "\t" + kvs(j)(0) + "\tcommon friends is: " +e))
}
sb.close()
}
}