问题描述
给定这个函数
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))
}
}
}
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)