我正在树上编写一个类似结构的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
的返回类型?我愿意就更好地实施上述方法提出建议。
答案 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)
。空遍历什么都不做。
此外,这可能看起来不那么实用,但有一个优点,就是一旦找到节点就停止搜索,而不是评估所有孩子。一个常见的陷阱恕我直言。