用FoldLeft在Scala中生成邻接表
给定这个函数用FoldLeft在Scala中生成邻接表,scala,graph,immutability,scala-collections,Scala,Graph,Immutability,Scala Collections,给定这个函数 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
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), (S2,D1), (S3,E1), (S3,D2))
但是,该函数的输出为
[E1 -> [S1, S3], D1 -> [S1, S2], E2 -> [S2], D2 -> [S3]]
[S1 -> [E1, D1], S2 -> [E2, D1], S3 -> [E1], E1 -> [S1, S3], D1 -> [S1, S2], E2 -> [S2], D2 -> [S3]]
但我期望的结果是
[E1 -> [S1, S3], D1 -> [S1, S2], E2 -> [S2], D2 -> [S3]]
[S1 -> [E1, D1], S2 -> [E2, D1], S3 -> [E1], E1 -> [S1, S3], D1 -> [S1, S2], E2 -> [S2], D2 -> [S3]]
似乎foldLeft(
acc+(curr.\u 1->(acc(curr.\u 1):+curr.\u 2))
的第一行被忽略了,我不太清楚为什么。如注释中所述,案例
块中的两行代码都会产生一个结果,但只有第二个结果会返回并成为下一个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)
如注释中所述,
案例
块中的两行代码都会产生一个结果,但只返回第二个结果,并成为下一个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)
第一个
acc+…
生成一个未保存的结果,因此它被丢弃。第二个acc+…
生成一个结果,由于这是代码块的最后一行,因此返回的值。第1个acc+…
生成的结果未保存,因此被丢弃。第二个acc+…
生成一个结果,因为这是代码块的最后一行,所以返回的值就是这个值。