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

use*_*763 2 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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

System.out.print("Enter a letter: ");
letter = scan.nextLine();
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*idt 10

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

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

\n

(另请注意变量声明letter已移至内部作用域,因为外部作用域不再需要它。\xc2\xa0 这是一个小的积极指示。)

\n

作为某些语言的替代方案,while (true)允许退化 for 循环,如下所示for(;;).

\n
\n

下面反转了条件循环退出测试的逻辑,但牺牲了更多的控制流逻辑。

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

(在效率方面,这些之间没有区别 \xe2\x80\x94 这些在机器代码级别上是等效的。)

\n


小智 6

执行 while 循环

import java.util.Scanner;

public class Main
{   
    public static void main(String[] args)
    {
        Scanner scan = new Scanner(System.in);

        String letter;
        
        do{   
            System.out.print("Enter a letter: ");
            letter = scan.nextLine();
            System.out.println("You entered: " + letter);

        }while(letter.equals("a") || letter.equals("b"));
    }
}
Run Code Online (Sandbox Code Playgroud)

它将首先循环一次,如果语句为真,则再次继续。