【问题标题】:label doesn't work, I tried my best标签不起作用,我尽力了
【发布时间】:2016-10-08 19:26:05
【问题描述】:

我尝试在 java 中继续和中断标签,但它会抛出错误。

代码如下:

private int search(int[] seq, int key, int low, int high){
    int mid = low + (high - low) / 2;
    out :  //label
    if (key == mid) {
        return mid;
    }
    if (key <  mid) {
        high = mid;
        if (key != mid) {
            break out;
        }
    }
    return 1;
}

【问题讨论】:

  • 请将问题中的代码发布给未来的读者,以防该图像的链接不再有效。
  • 邮政编码不是图片。一方面,我不喜欢导航到新用户发布的随机 Imgur 链接。
  • @BoristheSpider 好的,我复制了它。
  • @nickzoum 干得好;谢谢。
  • 你只能跳出你所在的范围,你只能继续一个循环。

标签: java label binary-search goto


【解决方案1】:

如果您有 3 个循环并且需要调用 break,则标签将与循环一起使用;在最内层循环中,您将使用标签中断到外层循环,因为如果您只是调用 break;它将打破最里面并进入中间循环。您使用错误的标签,您可以通过使用 if .. if else 和 else 语句或使用 switch 语句轻松解决您的问题。

【讨论】:

  • Sean 和 Peter 是正确的:标签仅适用于 循环。 不是像 OP 那样的 if 语句,也不是其他代码块。正如 Sean 所提到的,如果您正确地构建 if,就很容易摆脱它。
【解决方案2】:

标记为 break 仅适用于循环。 请注意,它们goto 等效,因为它们在中断循环之后将控制权转移到下一个语句。 p>

这里是从 Oracle 网站上的 language basics tutorial - break statement 复制的示例(如果有其他好的示例,我懒得做原创):

public static void main(String[] args) {

        int[][] arrayOfInts = { 
            { 32, 87, 3, 589 },
            { 12, 1076, 2000, 8 },
            { 622, 127, 77, 955 }
        };
        int searchfor = 12;

        int i;
        int j = 0;
        boolean foundIt = false;

    search:
        for (i = 0; i < arrayOfInts.length; i++) {
            for (j = 0; j < arrayOfInts[i].length;j++) {
                if (arrayOfInts[i][j] == searchfor) {
                    foundIt = true;
                    break search;
                }
            }
        }

        if (foundIt) // etc
    }
}

以防万一您对如何解决二进制搜索而不是如何使用breaking 来标记更感兴趣。下面的代码与使用 goto 的代码具有相同的性能(如果它们实际上存在于 java 中)。

private static int search(int[] seq, int key, int low, int high) {

    while (low <= high) {
        // this is as good as low+(high-low)/2. 
        int mid = (low + high) >>> 1; // this is (low+high)/2

        int midVal = seq[mid];

        if (midVal < key) {
            low = mid + 1;
        }
        else if (midVal > key) {
            high = mid - 1;
        }
        else {
            // why break when you can return?
            return mid; // key found
        }
    }
    // key not found. Return the 2's complement of the insert position:
    // that is -(insertPosition+1)
    return -(low + 1);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-29
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 2014-09-20
    • 2017-08-09
    相关资源
    最近更新 更多