Почему один оператор println изменяет весь вывод моего кода? - PullRequest
0 голосов
/ 01 апреля 2019

Задача

В настоящее время я создаю программу для чтения файла и поиска пары переменных. Я сталкиваюсь с этой проблемой, когда изменение одного println изменяет весь вывод моего кода. Я никогда не сталкивался с этим раньше и не уверен, является ли это ошибкой затмения или моей ошибкой?

Мой код

import java.io.File;
import java.io.IOException;
import java.util.Scanner;
public class FileAnalyzer {
    public static void main(String args[]) throws IOException {
        Scanner input = new Scanner(System.in);
        String fileName;
        int words = 0, letters = 0, blanks = 0, digits = 0, miscChars = 0, lines = 0;

        System.out.print("Please enter the file path of a .txt file: ");
        fileName = input.nextLine();

        File text = new File(fileName);
        //System.out.println(text.exists());

        Scanner word = new Scanner(text);
        while(word.hasNext()) {
            //System.out.println(word.next());
            words++;
        }
        word.close();

        Scanner letter = new Scanner(text);
        while(letter.hasNext()) {
            String currentWord = letter.next().toLowerCase();
            for(int i = 0; i < currentWord.length(); i++) {
                if(Character.isLetter(currentWord.charAt(i))) {
                    letters++;
                }
            }
        }
        letter.close();

        Scanner blank = new Scanner(text);
        while(blank.hasNextLine()) {
            String currentWord = blank.nextLine();
            for(int j = 0; j < currentWord.length(); j++) {
                if (currentWord.charAt(j) == ' ') {
                    blanks++;
                }
            }
        }
        blank.close();

        System.out.println("Words: " + words);
        System.out.println("Letters: " + letters);
        System.out.println("Blanks: " + blanks);


    }
}

Однако

Простое изменение System.out.println(word.next()) в первом экземпляре сканера изменяет весь вывод. Если я оставлю это, я получу три печатных заявления внизу и то, что я ищу. Если я удалю его, так как я не хочу, чтобы каждое слово печаталось в файле, оно показывалось как ничего в консоли. Не уверен, почему один оператор печати в операторе while изменяет весь вывод. Единственная причина, по которой он был там, была в первую очередь, чтобы убедиться, что сканер вводил данные так, как я хотел.

Ответы [ 3 ]

1 голос
/ 01 апреля 2019

Используя System.out.println(word.next());, вы циклически просматриваете элементы в коллекции из-за метода next().Поэтому прямой вызов next() позволит вам пройти через итерацию.

При комментировании //System.out.println(word.next());, word.hasNext() заставит вас зацикливаться вечно (при условии, что есть слово), так как вы не будетевозможность перейти к следующему токену.

Приведенный ниже фрагмент поможет вам достичь желаемого результата

while(word.hasNext()){
   word.next();
   words++;
}
1 голос
/ 01 апреля 2019

Не уверен, почему один оператор печати внутри оператора while изменяет весь вывод

Потому что, когда присутствует оператор, вы потребляете токен из сканера. Когда это закомментировано, вы не. Токен потребляет не печать, а вызов next().

С закомментированным, ваш цикл:

while (word.hasNext()) {
    words++;
}

hasNext() не изменяет состояние сканера, поэтому будет просто зацикливаться вечно, если вообще попадет в тело цикла.

Если вы хотите, чтобы строка была закомментирована или нет, измените код на:

while (word.hasNext()) {
    String next = word.next(); // Consume the word
    System.out.println(next); // Comment this out if you want to
    words++;
}
0 голосов
/ 01 апреля 2019

Не уверен, почему вы хотите просмотреть текст три раза.Но если вам действительно нужно, я бы закрыл первый сканер, прежде чем открывать следующий.

...