微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Scala 中使用 FoldLeft 制作邻接表

如何解决在 Scala 中使用 FoldLeft 制作邻接表

给定这个函数

  def makeAdjacencyList(edgeList: Seq[(String,String)]): Map[String,Seq[String]] = {
    val emptyMap = Map[String,Seq[String]]().withDefaultValue(Seq[String]())

    edgeList.foldLeft(emptyMap) {
      case (acc,curr) => {
        acc + (curr._1 -> (acc(curr._1) :+ curr._2))
        acc + (curr._2 -> (acc(curr._2) :+ curr._1))
      }
    }
  }

它接收一个无向图的edgeList,例如:

Vector((S1,E1),(S1,D1),(S2,E2),(S3,D2))

然而,该函数给出了

输出
[E1 -> [S1,S3],D1 -> [S1,S2],E2 -> [S2],D2 -> [S3]]

但我期待输出

[S1 -> [E1,D1],S2 -> [E2,S3 -> [E1],E1 -> [S1,D2 -> [S3]]

似乎 foldLeft (acc + (curr._1 -> (acc(curr._1) :+ curr._2))) 的第一行被忽略了,我不太确定为什么。

解决方法

case 块中的两行代码都会产生一个结果,但只返回第二个结果并成为下一个 acc 值。

这会解决它。

edgeList.foldLeft(emptyMap) {
  case (acc,curr) =>
    acc + (curr._1 -> (acc(curr._1) :+ curr._2)) +
          (curr._2 -> (acc(curr._2) :+ curr._1))
}

另一方面,这是实现所需输出的不同方法。

def makeAdjacencyList(edgeList: Seq[(String,String)]): Map[String,Seq[String]] =
  edgeList.flatMap(edge => Seq(edge,edge.swap))
          .groupMap(_._1)(_._2)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。