scala:使用Optional返回类型在树上查找方法

时间:2015-08-06 19:18:20

标签: scala

我正在树上编写一个类似结构的find方法。这是我的代码:

def find[T](node: Node, findThisGuy: T): Option[Node] = {
    if (node.data == findThisGuy) {
        Some(node)
    } else {
        if (node.children.nonEmpty) {
            node.children.foreach(child => {
                find(child, findThisGuy)
            })
        } else {
            None
        }
    }
}

这里的问题是内部if if的返回类型Unit,它确实符合函数的返回类型,即Option[Node]。那么如何定义内部if的返回类型?我愿意就更好地实施上述方法提出建议。

2 个答案:

答案 0 :(得分:2)

我认为这会解决问题:

def find[T](node: Node, findThisGuy: T): Option[Node] = {
  if (node.data == findThisGuy) {
    Some(node)
  } else {
    node.children.view
      .map(child => find(child, findThisGuy))
      .collectFirst{case Some(guy) => guy}
  }
}

答案 1 :(得分:1)

您的问题是您没有使用自我回复find。您应该使用以下标准:

def find[T](node: Node, findThisGuy: T): Option[Node] = {
  if (node.data == findThisGuy)
    return Some(node)

  for (c <- node.children) {
    val found = find(c, findThisGuy)
    if (found.isDefined)
      return found
  }
  None
}

请注意,如果您稍后遍历数组,则无需询问if (node.children.nonEmpty)。空遍历什么都不做。

此外,这可能看起来不那么实用,但有一个优点,就是一旦找到节点就停止搜索,而不是评估所有孩子。一个常见的陷阱恕我直言。