Как я могу выполнить цикл ввода, который завершает программу?

#java #loops

Вопрос:

«Введите слово или нажмите» Q», чтобы выйти», но я не знаю, как это сделать. Это кажется мне немного запутанным.

Это мой первый раз, когда я пишу на Java, и я все еще учусь.

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

            String stringArray = "";
            
            do {
                System.out.print("Enter a word or 'Q' to quit: ");
                String str = scan.nextLine();
                for (int i = 0; i < str.length(); i  ) {
                    if (str.charAt(i) > 64 amp;amp; str.charAt(i) <= 122) { //returns true if both conditions returns true    
                        //adding characters into empty string
                        stringArray = stringArray   str.charAt(i);
                    }
                    System.out.print("Input string without special characters: "   stringArray); //string results
                }
            }
            while (stringArray != "q" || stringArray != "Q");
        }
    }
}


THIS IS THE SAMPLE OUTPUT:
Enter a word or 'Q' to quit: Black?204123,.Scoop (input)
Input string without special characters: BlackScoop (output)
Enter a word or 'Q' to quit: q (input)
(end program)


terminal output:
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit: q
Enter a word or 'Q' to quit:
 

Комментарии:

1. если («Q».равно(str)) { перерыв; } поместите это в начало вашего цикла. он должен вырваться из цикла for, если вы введете Q

Ответ №1:

Используйте цикл while для считывания входных данных и прерывания цикла, если вход «Q».

 public static void main(String[] args) 
{
    try(Scanner sc = new Scanner(System.in))
    {
        while(true)
        {
            System.out.print("Enter a word or press 'Q' to quit: ");
            String word = sc.nextLine();
            
            if ("q".equalsIgnoreCase(word))
                break;
            
            System.out.println(word);
        }
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }

    System.out.println("Exiting... ");
}
 

Комментарии:

1. лучше рекомендовать !»q».equalsIgnoreCase(слово). В этом случае это не будет иметь большого значения, но если вы привыкли использовать строковый литерал в качестве параметра, рано или поздно это приведет к NPE

2. Я согласен, это обоснованное утверждение

Ответ №2:

 
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {

        try (Scanner scan = new Scanner(System.in)) {
            while (true) {
                String inputdata = scan.nextLine();

                if (inputdata.length() == 1 amp;amp; (inputdata.charAt(0) == 'Q' || inputdata.charAt(0) == 'q')) {
                    break;
                }

                String stringArray = "";
                for (int i = 0; i < inputdata.length(); i  ) {
                    if (inputdata.charAt(i) > 64 amp;amp; inputdata.charAt(i) <= 122) { // returns true if both conditions
                                                                                  // returns true
                        // adding characters into empty string
                        stringArray = stringArray   inputdata.charAt(i);
                    }

                }
                System.out.print("Input string without special characters: "   stringArray);

            }

        }
    }
}
 

Комментарии:

1. Спасибо за комментарий. Это работает сейчас, и я официально узнал об этом. Благодаря тебе. Покой вон!

Ответ №3:

Взгляните на эту строку:

 while (stringArray != "q" || stringArray != "Q")
 

Это повторяется, пока stringArray нет "q" или нет "Q" . Другими словами, это должно быть и "q" то и другое и "Q" в то же время, чтобы он вышел, что невозможно.

То, что вы на самом деле хотели, — это использовать amp;amp; :

 while (stringArray != "q" amp;amp; stringArray != "Q")
 

Повторяйте, пока нет, "q" и также нет "Q" .

Хотя в этом корень вашей проблемы, я все равно посоветую вам использовать ответ, который вы уже приняли.

Изменить: Как уже отмечалось, вы также не должны сравнивать строки с == или != .

 while (!"q".equals(stringArray) amp;amp; !"Q".equals(stringArray))
 

И тогда вы могли бы использовать equalsIgnoreCase то же самое, что и в другом ответе. Я просто хотел указать на главный недостаток в логике использования || вместо amp;amp; здесь.

Комментарии:

1. нет, он не хочет этого делать. Вы никогда не должны сравнивать значения объектов с == или !=. То, что вы делаете, является ссылочным сравнением, а не сравнением, основанным на ценности.

2. Спасибо за полезные комментарии, но он все еще не работает, но код в порядке

3. @Stultuske Добавил правку, касающуюся == строк и != для строк. Хотя, это был не тот момент, который я имел в виду в этом ответе.