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学习-函数式编程,计算两个人的共同好友的主要内容,如果未能解决你的问题,请参考以下文章

Scala中的函数式特性|Scala布道师挖财资深架构师王宏江

Scala学习(函数式编程面向对象编程)

Scala学习(函数式编程面向对象编程)

Scala:用于Java的轻量级函数式编程

scala函数式编程

理解Scala的函数式编程思想