scala小案例找共同好友

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,思路

  1. 将用户与好友列表处理成用户为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()
  }
}

思路1A和B的共同好友

思路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()
  }
}

思路2部分结果

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值