首页 > 解决方案 > break 语句的控制流如何在嵌套循环中工作?(爪哇)

问题描述

我用 Java 编程已经有一段时间了,但是今天我遇到了一些我认为很奇怪的事情。我记得当在嵌套循环中使用 break 语句时,控制流会返回到外部循环的头部。如图所示。

控制流程图(我知道你们喜欢内联,但根据声誉要求,我是不允许的)

也许,这个图形和我的记忆是不正确的。我这样说是因为当我运行以下代码时,控制流会将每个标记添加到 LinkedList listOfAllPalindromes。我已经验证了包含 break 语句的 if 块在它应该被访问的时候被访问。简而言之,我的记忆错了吗,当它遇到 break 语句时的控制流是否应该像它看起来正在做的那样跳转到 listOfAllPalindromes.add(token) ?

 public static void main(String[] args) throws FileNotFoundException {

    File dictionary = new File("english3.txt");
    Scanner s = new Scanner(dictionary);
    String token;
    LinkedList<String> listOfPalindromes = new LinkedList<>();

    while (s.hasNext())
    {
        token = s.next().toLowerCase();

        for (int i = 0; i <= (token.length()-1)/2; i++)
        {
            if(token.charAt(i) != token.charAt(token.length()-(i+1)))
            {
                break;
            }
        }
        
        listOfPalindromes.add(token);
    }

    for(String word : listOfPalindromes)
    {
        System.out.println(word);
    }
}

标签: javaloopscontrol-flow

解决方案


您应该使用continue标签而不是break这样。

Scanner s = new Scanner("lever level canoe kayak carrace racecar mademoiselle madam");
String token;
LinkedList<String> listOfPalindromes = new LinkedList<>();

L: while (s.hasNext()) {
    token = s.next().toLowerCase();

    for (int i = 0; i <= (token.length() - 1) / 2; i++) {
        if (token.charAt(i) != token.charAt(token.length() - (i + 1))) {
            continue L;
        }
    }

    listOfPalindromes.add(token);
}

for (String word : listOfPalindromes) {
    System.out.println(word);
}

输出

level
kayak
racecar
madam

推荐阅读