gpt4 book ai didi

Scala-fy 一个 java 函数?

转载 作者:行者123 更新时间:2023-12-01 10:25:15 27 4
gpt4 key购买 nike

我最近将我的任务从 Java 转到了 Scala。但是,它仍然看起来像 java.lang.例如,下面的函数对范围树进行搜索,并在其中进行一些“isInstanceOf”检查。

但是 - 用“匹配”替换它们似乎只会占用更多空间。谁能就如何“扩展”此代码提出一些改进建议?

def rangeSearch2D(treeRoot: Node, lower: Data2D, upper: Data2D, 
visited: Visited): Seq[Data2D] = {

if (treeRoot == null) {
// return empty list
return Vector()
}
// increment visit count
if (visited != null)
visited.visit2D(treeRoot)

var results = ArrayBuffer[Data2D]()

// Find nearest common ancestor with value between lower.x and upper.x
var common: Node = commonAncestor(treeRoot, lower, upper, visited)

if (common.isInstanceOf[LeafNode]) {
return Vector(common.asInstanceOf[LeafNode].data)
}

/** Common non-leaf node, must process subtree */
/** Process left subtree */
var current = common.left

while (!current.isInstanceOf[LeafNode]) {
if (visited != null)
visited.visit2D(current)

//Find a path from current to lower.x
if (lower.x <= current.midRange) {
results.appendAll(rangeSearch1D(current.right.subTree,
lower, upper, visited))
current = current.left
} else {
current = current.right
}
}
//Check if current leaf node is in range
if (inRange(current, lower, upper)) {

results.append(current.asInstanceOf[LeafNode].data)
}
/** Process right subtree */
current = common.right

while (!current.isInstanceOf[LeafNode]) {
if (visited != null)
visited.visit2D(current)

//Find a path from current to upper.x
if (upper.x >= current.midRange) {

results.appendAll(rangeSearch1D(current.left.subTree,
lower, upper, visited))
current = current.right
} else {
current = current.left
}
}
//Check if current leaf node is in range
if (inRange(current, lower, upper)) {
results.append(current.asInstanceOf[LeafNode].data)
}

return results
}

最佳答案

好吧,首先你可以去掉null,用Option替换可能为null的参数。然后在代码中更改

if (visited != null)
visited.visit2D(x)

visited foreach (_ visit2D x)

两个 while 循环都可以用递归函数代替。您可以将结果作为递归函数中的不可变累加器参数传递,而不是将结果添加到可变变量。

如果 Node 有一个提取器,您可以使用 case guard 来进行 midrange 测试。不会添加太多内容,但更加地道。

我觉得两个 while 循环都可以包含在一个递归中,但我还没有充分考虑算法来决定这一点。如果是这样,您可以使用 common 提前返回。

顺便说一下,那里有一个错误,因为范围内可能没有共同的祖先。

关于Scala-fy 一个 java 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5036543/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com