1

如果我有这样的课程:

class Component (val name, val description, var subElements : Set[Component])

如何测试组件内部是否包含循环(使用布尔函数)以及谁启动了这个循环。我很清楚,如果我使用 val 而不是 var 避免循环,但我不能使用 val。

4

2 回答 2

3

Component返回下图中开始循环的所有元素的成员。如果没有循环,则返回一个空集。

def descendantsWithCycle = {
  def findCycle(current: Component, checked: Set[Component]): Set[Component] =
    if (checked contains current) Set(current)
    else {
      val newChecked = checked + current
      current.subElements.flatMap(findCycle(_, newChecked))
    }

  findCycle(this, Set())
}
于 2012-11-27T10:05:15.603 回答
0

如果您不需要 var,请不要使用它!val 或 var 也一样:

class Component (val name : String, val description : String,  val subElements : Set[Component]){
    def hasCyle(val seen) : Boolean = (seen contains this ||
                                       subElements.exists(item => item.hasCycle(seen + this)))
    def isCyclic = hasCycle(Set())
  }
}

如果您看到的列表包含当前项目,或者如果您看到的集合中包含任何子元素以及当前项目,则您可以读取 hasCycle,因为它有一个循环。

于 2012-11-27T10:25:46.050 回答