Может ли кто-нибудь помочь мне понять этот код

1

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

Я нашел этот код ниже, и я начал его комментировать, однако я не знаю, правильно ли мои комментарии, и я не уверен, что делать без раскопок. Если бы кто-то мог написать короткое объяснение мне или чему-то, я был бы очень благодарен.

    //Loops through the file until it has counted everything. 
     while (in.hasNext()) {
        String tmpStr = in.nextLine();
        if (!tmpStr.equalsIgnoreCase("")) {
            String replaceAll = tmpStr.replaceAll("\\s+", "");
            // Counts the number of characters within the file.
            charsCount += replaceAll.length();
            // Counts the number of words within the file.
            wordsCount += tmpStr.split(" ").length;
        } 
        // Counts number of lines
        ++linesCount;
     } //Ends While Loop. 

Я предполагаю, что, когда код подсчитывает символы, он игнорирует пробелы. Что бы я изменил, чтобы он также учитывал пробелы.

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

  • 0
    Там, где код считает символы (вызов метода .length ()), он считает пробелы, как и любой другой символ.
  • 3
    Нет. Пробелы удаляются вызовом replaceAll .
Показать ещё 1 комментарий
Теги:

4 ответа

1
Лучший ответ

У вас, похоже, больше всего. Я попытаюсь подробно объяснить каждый аспект.

while (in.hasNext()) {
  ...
}

Это основной цикл. Он просто проверяет, есть ли что-нибудь еще на входе, которое вы читаете. Если есть, то он выполняет код между фигурными скобками.

String tmpStr = in.nextLine();

Считывает следующую строку со сканера и назначает ее tmpStr. Здесь есть небольшая пропасть. nextLine() не возвращает символы возврата каретки или новой строки. Если вы должны считать их как символы в своем проекте, ваш счет будет отключен.

if (!tmpStr.equalsIgnoreCase("")) {
  ...
}

Этот оператор if проверяет, является ли это просто пустой строкой (т.е. Никакими символами), и если это так, пропускает обработку строки. Это оптимизация и не требуется строго для достижения вашей цели.

String replaceAll = tmpStr.replaceAll("\\s+", "");

Это вызов регулярного выражения. Он удаляет все пробелы из строки и сохраняет их как временную переменную. Пробелы включают в себя такие символы, как пробел, вкладка, вертикальная вкладка, фид формы, возврат каретки и т.д. Вы почти наверняка не хотите этого делать, если ваша проблема не определена так, что вам не нужно считать пробелы. Если проблема требует количества символов (пробелы и все), и ваш вход гарантированно будет ASCII, то самым простым решением для подсчета символов будет вернуть размер файла с 1 символа = 1 байт в ASCII. В противном случае проблема становится немного волосатой. Если вы укажете, что определяет персонаж для целей вашего проекта, я могу, вероятно, лучше дать вам рекомендации.

charsCount += replaceAll.length();

Это позволяет считать количество символов без пробелов. Оператор + = принимает значение charsCount раньше и добавляет к нему длину строки в символах после удаления пробела.

wordsCount += tmpStr.split(" ").length;

Split принимает строку и возвращает массив подстрок, которые были разделены по предоставленному символу. В этом случае этот символ является пространством. Таким образом, линия "Быстрая коричневая лиса" вернет массив из четырех предметов "The", "quick", "brown" и "fox". Обратите внимание, что пробелы удаляются. Затем длина массива добавляется к текущему количеству слов. Это довольно наивный способ подсчета слов, поскольку существуют границы слов, которые не являются пробелами. Это включает в себя такие вещи, как tab, em dashes и т.д. Это может работать для ваших целей, но опять же это будет зависеть от параметров вашего проекта.

++linesCount;

Это подсчитывает строки. ++ просто означает "добавить 1" к переменной. Поэтому для каждой итерации цикла while линияCount будет увеличиваться на единицу.

0

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

//Loops through the file until it has counted everything. 
 while (in.hasNext()) {
    String tmpStr = in.nextLine();
    if (!tmpStr.equalsIgnoreCase("")) {
        // Counts the number of characters within the file.
        charsCount += tmpStr.length();
        // Counts the number of words within the file.
        wordsCount += tmpStr.split(" ").length;
    } 
    // Counts number of lines
    ++linesCount;
 } //Ends While Loop. 
0

Я попытаюсь объяснить в несколько шагов, как работает этот код

  1. Поскольку ваш "in" имеет больше значений, временная строка берет строку из вашего. Это цикл, который будет выполняться так долго, как ваши значения.
  2. Если эта временная строка не пуста ("" = пустая строка), количество символов будет подсчитываться по длине (количеству символов) вашей временной строки, например: String "hello" содержит 5 символов.
  3. Словосочетания происходит с разбиением 1 пробела (""). Это делает из вашей String набор слов. Количество слов из строки будет добавлено к глобальной переменной wordsCount.
  4. Наконец, число строк равно числу d + 1 (++LinesNumber). Таким образом, вы также знаете, сколько строк есть.

Надеюсь, это все ясно.

0

Еще несколько комментариев:

// Get the next line from the input
String tmpStr = in.nextLine();
// If the line is not empty ...
if (!tmpStr.equalsIgnoreCase("")) {
  // Remove all whitespace from the line
  String replaceAll = tmpStr.replaceAll("\\s+", "");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню