首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Scala中通过DAG列出路径

如何在Scala中通过DAG列出路径
EN

Stack Overflow用户
提问于 2015-08-31 05:37:41
回答 2查看 246关注 0票数 0

我有一个DAG的单词类型如下:HashMap[String, Set[String]]。我想通过图表建立一个所有路径的集合。但我编写的方法完全不像我所期望的那样:

代码语言:javascript
复制
def buildChain(wordGraph: HashMap[String, Set[String]], path: ListBuffer[String], accumChains: ListBuffer[ListBuffer[String]]): ListBuffer[ListBuffer[String]] = {
  val children = wordGraph(path.last)

  for (word <- children) {
    path += word
    if (wordGraph.keySet.contains(word)) buildChain(wordGraph, path, accumChains)
    else accumChains += path
  } 

  return accumChains
}

当我传入这张图时:

Map("chow" -> Set("how", "cho", "cow"), "how" -> Set("ho", "ow"), "cho" -> Set("ho"), "cow" -> Set("ow"))

我希望得到:

ListBuffer(ListBuffer("chow", "how", "ho"), ListBuffer("chow", "how", "ow"), ListBuffer("chow", "cho", "ho"), ListBuffer("chow", "cow", "ow"))

当我从“周”开始的时候。

相反,我得到了这个:

ListBuffer(ListBuffer(chow, how, ho, ow, cho, ho, cow, ow), ListBuffer(chow, how, ho, ow, cho, ho, cow, ow), ListBuffer(chow, how, ho, ow, cho, ho, cow, ow), ListBuffer(chow, how, ho, ow, cho, ho, cow, ow))

我也搞不懂为什么。我肯定这很简单,但我现在只是错过了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-31 06:16:52

下面是一个简单的解决方案,我对param类型做了一些修改,因为我认为不可变类型足够好:

代码语言:javascript
复制
def _buildChain(wordGraph: Map[String, Set[String]], path: String): List[List[String]] = { 
  wordGraph.get(path) match {
    case Some(w) =>  w.toList.flatMap(_buildChain(wordGraph, _).map(path :: _)) 
    case None =>  List(List(path))
  }
}

def buildChain(wordGraph: Map[String, Set[String]], path: List[String]): List[List[String]] = path.flatMap(_buildChain(wordGraph, _)) 


val a = _buildChain( Map("chow" -> Set("how", "cho", "cow"), "how" -> Set("ho", "ow"), "cho" -> Set("ho"), "cow" -> Set("ow")), "chow")
println(a)
val b = buildChain( Map("chow" -> Set("how", "cho", "cow"), "how" -> Set("ho", "ow"), "cho" -> Set("ho"), "cow" -> Set("ow")), List("chow", "how"))
println(b)

产出如下:

代码语言:javascript
复制
List(List(chow, how, ho), List(chow, how, ow), List(chow, cho, ho), List(chow, cow, ow))


List(List(chow, how, ho), List(chow, how, ow), List(chow, cho, ho), List(chow, cow, ow), List(how, ho), List(how, ow))
票数 2
EN

Stack Overflow用户

发布于 2015-08-31 05:54:11

当您为path += word中的每个word执行行children时,您将附加到同一个缓冲区,因此缓冲区只会增长到容纳所有的子缓冲区(然后将同一个缓冲区多次添加到accumChains中)。您希望为每个单词生成一个新的序列。我可以建议在这里使用不可变的列表吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32304577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档