有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在Java方法中避免无用的返回?

理论上,我遇到了一种情况,嵌套在两个for循环中的return语句总是可以到达的

编译器不同意,需要在for循环外使用return语句。我想知道一种优雅的方法来优化这个方法,这超出了我目前的理解,而且我尝试的break实现似乎都不起作用

Attached是一个来自赋值的方法,它生成随机整数,并返回循环经过的迭代,直到找到第二个随机整数,在作为int参数传递给该方法的范围内生成

private static int oneRun(int range) {
    int[] rInt = new int[range+1]; // Stores the past sequence of ints.
    rInt[0] = generator.nextInt(range); // Inital random number.

    for (int count = 1; count <= range; count++) { // Run until return.
        rInt[count] = generator.nextInt(range); // Add randint to current iteration.
        for (int i = 0; i < count; i++) { // Check for past occurence and return if found.
            if (rInt[i] == rInt[count]) {
                return count;
            }
        }
    }
    return 0; // Never reached
}

共 (3) 个答案

  1. # 1 楼答案

    编译器的启发法永远不会让您忽略最后一个return。如果你确定永远都联系不到它,我会用一个throw来代替它,把情况弄清楚

    private static int oneRun(int range) {
        int[] rInt = new int[range+1]; // Stores the past sequence of ints.
        rInt[0] = generator.nextInt(range); // Inital random number.
    
        for (int count = 1; count <= range; count++) {
            ...
        }
    
        throw new AssertionError("unreachable code reached");
    }
    
  2. # 2 楼答案

    而断言是一个很好的快速解决方案。一般来说,这种问题意味着你的代码太复杂了。当我查看你的代码时,很明显你并不真的想要一个数组来保存以前的数字。你想要一个Set

    Set<Integer> previous = new HashSet<Integer>();
    
    int randomInt = generator.nextInt(range);
    previous.add(randomInt);
    
    for (int count = 1; count <= range; count++) {
        randomInt = generator.nextInt(range);
        if (previous.contains(randomInt)) {
           break;
        }
    
        previous.add(randomInt);
    }
    
    return previous.size();
    

    现在请注意,我们返回的实际上是集合的大小。代码复杂度已从二次型降低到线性型,并且可读性更高

    现在我们可以意识到,我们甚至不需要count索引:

    Set<Integer> previous = new HashSet<Integer>();
    
    int randomInt = generator.nextInt(range);
    
    while (!previous.contains(randomInt)) {          
        previous.add(randomInt);      
        randomInt = generator.nextInt(range);
    }
    
    return previous.size();
    
  3. # 3 楼答案

    使用临时变量,例如“result”,并删除内部返回。 在适当的条件下,将for循环更改一段时间。 对我来说,只有一个返回作为函数的最后一个语句总是更优雅的