java - 如何重写输入循环以不包含代码重复?

标签 java loops

我有以下代码,只要字母是“a”或“b”,它就会继续要求用户输入字母:

import java.util.Scanner;

public class Main
{   
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);
        
        String letter;
        
        System.out.print("Enter a letter: ");
        letter = scan.nextLine();
        
        while(letter.equals("a") || letter.equals("b"))
        {
            System.out.println("You entered: " + letter);
            
            System.out.print("Enter a letter: ");
            letter = scan.nextLine();
        }
    }
}

但是下面的代码重复了两次:

System.out.print("Enter a letter: ");
letter = scan.nextLine();

有没有办法让上面的代码只出现一次?

最佳答案

    while (true) {
        System.out.print("Enter a letter: ");
        String letter = scan.nextLine();
        if (!letter.equals("a") && !letter.equals("b"))
            break;
        System.out.println("You entered: " + letter);
    }

这是循环的经典示例,它既不是自然的 while-do 也不是 do-while — 如果您想要相同的行为并减少代码重复,它需要从中间退出。

(另请注意,变量声明 letter 已移至内部范围,因为外部范围不再需要它。这是一个积极的小迹象。)

作为 while (true) 的替代方案,某些语言允许使用 for(;;) 中的退化 for 循环。


下面以更多的控制流逻辑为代价颠倒了条件循环退出测试的逻辑。

    while (true) {
        System.out.print("Enter a letter: ");
        String letter = scan.nextLine();
        if (letter.equals("a") || letter.equals("b")) {
            System.out.println("You entered: " + letter);
            continue;
        }
        break;
    }

(它们在效率方面没有区别——它们在机器代码级别是等价的。)

关于java - 如何重写输入循环以不包含代码重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72192193/

相关文章:

java - 如何对接收和返回对象列表的方法进行单元测试

java - 简单套接字程序中的错误

matlab - FOR 循环最快的语言

python - 使用 'if... or' 语句迭代两个列表

c - 为什么我的程序循环次数太多?

java - 在 JAVA 中列出远程计算机上目录内特定类型的所有文件

java - Log4j 2.8 无法在 OSGi 环境中加载自定义转换器

javascript - JSP中可以包含javascript吗?

loops - 为什么 Clojure 的范围只迭代 32 次?

c++ - C++ 中有没有办法让循环的输出显示在同一行上?