Как убрать дубликаты вывода строки в консоль в решении задачи

213
23 апреля 2019, 23:00

Данную задачу:

Напишите программу, которая получает символы, введенные с клавиатуры, до тех пор, пока не встретится точка. Предусмотрите в программе счетчик пробелов. Сведения о количестве пробелов должны выводиться в конце программы.

Решил так:

public static void main(String args[])
        throws java.io.IOException {
    char choice, exit;
    int space;
    exit = '.';
    space = 0;
    for (; ; ) {
        System.out.println("Press any key please. Press '.' for exit:");
        choice = (char) System.in.read(); // Получили символ от пользователя.
        if (choice == ' ') space += 1; // Добавили пробел если он был нажат.
        else if (choice == '.') System.out.print("Programm stopped by exit. " +
                "Space pressed " + space + " times."); /* Закончили на точке и показали пробелы. */
    }
}

Вывод получается такой.

Press any key please. Press '.' for exit:
Press any key please. Press '.' for exit:
Programm stopped by exit. Space pressed 2 times.Press any key please. Press '.' for exit:Press any key please. Press '.' for exit:

Почему строки повторяются и как убрать дубликаты?

Answer 1
  1. Вы выводите "Press any key..." на каждой итерации цикла. Поэтому сколько символов было введено - столько раз сообщение и будет выведено
  2. При получении . вы не останавливаете цикл, так что программа будет работать бесконечно

Первую проблему можно решить вынесением сообщения за цикл, а вторую - добавлением break-а при нахождении .:

char choice, exit;
int space;
exit = '.';
space = 0;
System.out.println("Press any key please. Press '.' for exit:");
for (; ; ) {
    choice = (char) System.in.read(); // Получили символ от пользователя.
    if (choice == ' ')
    {
        space += 1; // Добавили пробел если он был нажат.
    }
    else if (choice == '.')
    {
        System.out.print("Programm stopped by exit. " +
            "Space pressed " + space + " times."); /* Закончили на точке и показали пробелы. */
        break;
    }
}

А ещё в коде можно немного прибраться:

int spacesCount = 0;
boolean gotExitSymbol = false;
System.out.println("Press any key please. Press '.' for exit:");
while (!gotExitSymbol)
{
    char symbol = (char)System.in.read(); // Получили символ от пользователя.
    if (symbol == ' ')
    {
        spacesCount++; // Добавили пробел если он был нажат.
    } 
    else if (symbol == '.')
    {
        gotExitSymbol = true;
    }
}
System.out.println("Program stopped by exit. " + "Space pressed " + spacesCount + " times."); /* Закончили на точке и показали пробелы. */

Убрал лишние переменные, другие переименовал, использовал ++ вместо += 1, а while (true) (он же for (; ; )) заменил на while с флагом (очень не люблю while (true) за то как он выглядит)

Или несколько короче при использовании в while сложного условия вместо флага:

int spacesCount = 0;
System.out.println("Press any key please. Press '.' for exit:");
char symbol;
while ((symbol = (char)System.in.read()) != '.')
{
    if (symbol == ' ')
        spacesCount++; // Добавили пробел если он был нажат.
}
System.out.println("Program stopped by exit. " + "Space pressed " + spacesCount + " times."); /* Закончили на точке и показали пробелы. */
READ ALSO
AdMob показ рекламы в авиарежиме

AdMob показ рекламы в авиарежиме

Мне показали приложение в App Store в котором реклама показывается даже в авиарежиме, причём каждый раз разная (речь о Rewarded Video и Interstitial)Как это...

165
Исключение работает не верно [дубликат]

Исключение работает не верно [дубликат]

На данный вопрос уже ответили:

139
Изменение заставочной картинки на телефоне Android

Изменение заставочной картинки на телефоне Android

Возможно ли изменить заставочный экран на телефоне Android программно(на изображение, например)? Если да, то как, используя Java

114
Java посимвольный вывод, запись в файл

Java посимвольный вывод, запись в файл

Как после ввода слова, вывести в консоль все буквы а не только первую? С применением forEach не получиться решить второй вопрос по моему̶К̶а̶к̶...

159