Scala-fy是一个java函数吗?

And*_*yuk 2 scala

我最近把我的作业从Java改为Scala.但是,它仍然看起来像java.例如,下面的函数在范围树上搜索,在里面我做了一些"isInstanceOf"检查.

然而 - 用"匹配"替换它们似乎只会占用更多空间.任何人都可以建议如何"scalify"这段代码?

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
  }
Run Code Online (Sandbox Code Playgroud)

Dan*_*ral 5

嗯,首先,你可以摆脱null,更换可能是参数nullOption.在代码中,然后更改

if (visited != null)
  visited.visit2D(x)
Run Code Online (Sandbox Code Playgroud)

visited foreach (_ visit2D x)
Run Code Online (Sandbox Code Playgroud)

while循环都可以用递归函数替换.您可以将它作为递归函数中的不可变累加器参数传递给而不是将结果添加到可变变量中.

如果Node有一个提取器,你可以使用一个护罩来进行midrange测试.不会增加太多,但更具惯用性.

我觉得这两个while循环都可以包含在一个递归中,但我没有考虑足够的算法来决定它.如果是这样,你可以逃脱common早期的回归.

顺便说一下,那里有一个bug,因为在该范围内可能没有共同的祖先.