如何缩短相同方法的大量调用?

时间:2019-05-10 11:50:40

标签: java random

我想用随机数创建一个二叉树。为此,我有一个生成树的函数和一个生成随机数的函数。作为实例变量,我有以下内容:

DB name

我认为所有generateRandomInt调用看起来都不“美丽”。有没有办法缩短或提高效率?还有没有一种方法可以随机创建一个二叉树(节点数)?我有以下方法可以向树中添加一些东西:

private static final int MIN_VALUE = 1;
private static final int MAX_VALUE = 100;
private static LinkedBinaryTree<Integer> tree = new LinkedBinaryTree<>();
private static Random random = new Random();

addRoot 添加根节点 insertLeftChild insertRightChild 将左侧或右侧子节点添加到节点 insertChild 可以这样做,但是会检查左孩子或右孩子是否空闲, insertChildren 同时向节点添加左孩子和右孩子

addRoot(value)
insertLeftChild(node, value)
insertRightChild(node, value)
insertChild(node, value)
insertChildren(node, value1, value2)
public static int generateRandomInt(int MIN_VALUE, int MAX_VALUE) {
        return random.nextInt((MAX_VALUE - MIN_VALUE) + 1) + MIN_VALUE;
}

3 个答案:

答案 0 :(得分:3)

简单地添加另一个帮助器,例如:

public static int generateRandomInt() {
  return generateRandomInt(MIN_VALUE, MAX_VALUE);
}

接下来,您可以创建简单地创建一个孩子并将其添加到根目录的辅助方法。然后在循环中调用该方法。

基本上,您在这里有一个模式:

  • 您创建Position对象(无论是什么对象,都不应将其称为 Node ?)
  • 您将这些位置添加到树中

所有这些都是在非常低的抽象级别上发生的。您应该添加一些有用的抽象,从而不必总是写下所有细节。

答案 1 :(得分:2)

您可以避免将MIN_VALUEMAX_VALUE传递到各处,因为它们相同,因此可以从函数中删除参数(或创建代理)。

但是您将无法减少通话次数,因为结果无法缓存。

可以“修饰”代码的方法是使用终端递归函数。 像这样:

public static void addChild(int depth, Position<Integer>  currentRoot) {
    Position<Integer> leftChild = currentRoot.insertLeftChild(generateRandomInt());
    Position<Integer> rightChild = currentRoot.insertRightChild(generateRandomInt());
    if(depth > 0) {
        addChild(depth - 1, leftChild);
        addChild(depth - 1, rightChild);
    }
}

您可能必须编辑insertChild()方法以返回插入的节点。

编辑:调用方法两次以获取二叉树。

答案 2 :(得分:2)

类似于@GhostCat的建议,但是除了定义另一个函数外,您还可以在方法范围内定义一个Supplier<Integer>。特别是如果随机函数的参数并不总是相同的(在另一种方法中使用时,边界可能不同),这可能是有利的。 而且,它又短了一点,因为本地声明的Supplier不必具有过于描述性的名称。

public static void generateBinaryTree() {
    Supplier<Integer> rand = () -> generateRandomInt(MIN_VALUE, MAX_VALUE);

    Position<Integer> root = tree.addRoot(rand.get());
    Position<Integer> child1 = tree.insertChild(root, rand.get());
    ...
}

更新:了解了addChildaddChildren之间的区别之后,很明显,您确实可以以递归方式将函数重写为addChildren(root, depth),如下所示:由@Kevin建议。