Количество слов в Java, дающее неверный вывод

#java

#java

Вопрос:

Я новичок в Java. Я написал код для подсчета появления определенного слова из файла. Слово, которое нужно подсчитать, запрашивается у пользователя. Я написал два кода. Первый код выполняется правильно, и количество правильное. Тогда как во втором коде количество меньше. Я не могу понять причину этого. Может ли кто-нибудь помочь мне найти ошибку во втором коде?

Абзац, который считывается из файла, и два кода приведены ниже.

Абзац :

В текстовой обработке и настольной публикации жесткий возврат или разрыв абзаца указывает на новый абзац, который следует отличать от мягкого возврата в конце строки внутри абзаца. Это различие позволяет переносу слов автоматически перенаправлять текст по мере его редактирования без потери разрывов абзацев. Программное обеспечение может применять вертикальные пробелы или отступы при разрывах абзацев, в зависимости от выбранного стиля.

То, как на самом деле хранятся такие документы, зависит от формата файла. Например, HTML использует

тег как контейнер абзаца. В текстовых файлах существует два распространенных формата. Предварительно отформатированный текст будет иметь новую строку в конце каждой физической строки и две новые строки в конце абзаца, создавая пустую строку. Альтернативой является добавление только новых строк в конце каждого абзаца и оставление переноса слов приложению, которое отображает или обрабатывает текст (если это вообще необходимо).

Код 1: выдает правильный вывод

 package prac3;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class FromFile {

    private String word;

    FromFile() {
    }

    int Count(String word1) throws IOException {
        this.word = word1;
        String abc;
        int count = 0, total = 0;
        try {
            BufferedReader in = new BufferedReader(
                    new FileReader(
                            "C:\Documents and Settings\Administrator.EGOVPC79\Desktop\file.txt"));

            while ((abc = in.readLine()) != null) {
                String abc1 = abc;
                Scanner s = new Scanner(abc1);
                while (s.hasNext()) {
                    total  ;
                    if (s.next().equals(word)) {
                        count  ;
                    }
                }
            }
            in.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        System.out.println("total"   total);
        return count;
    }

    public static void main(String[] args) throws IOException {
        FromFile obj = new FromFile();
        String word;
        Scanner abc = new Scanner(System.in);
        System.out.println("Enter the word you want to count");
        word = abc.nextLine();
        int count = obj.Count(word);
        System.out.println("The occurence is :"   count);

    }
}
  

Код 2: это дает неверный вывод.

 package prac3_2;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

public class File {

    private String word;
    private String abc1;

    File() throws IOException {
        String abc;
        BufferedReader in = new BufferedReader(
                new FileReader(
                        "C:\Documents and Settings\Administrator.EGOVPC79\Desktop\file.txt"));
        while ((abc = in.readLine()) != null) {
            abc1 = abc;
            System.out.println(abc1);
        }
        in.close();
    }

    int Count(String word1) {
        this.word = word1;
        int count = 0, total = 0;
        Scanner s = new Scanner(abc1);
        while (s.hasNext()) {
            total  ;
            if (s.next().equals(word)) {
                count  ;
            }
        }
        System.out.println("total"   total);
        return count;
    }

    public static void main(String[] args) throws IOException {
        File obj = new File();
        String word;
        Scanner abc = new Scanner(System.in);
        System.out.println("Enter the word you want to count");
        word = abc.nextLine();
        int count = obj.Count(word);
        System.out.println("The occurence is :"   count);
    }
}
  

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

1. Вы пробовали использовать отладчик для отслеживания выполнения программы и выяснения, где программа отличается от ваших ожиданий?

2. В первой (хорошей) реализации count() считывает файл и обрабатывает его. Во второй (плохой) реализации — count() на самом деле ничего не делает…

Ответ №1:

Проблема в том, что abc1 содержит не весь текст, и при подсчете он учитывает предоставленное слово только в последней прочитанной строке (сохраненной в abc1)

Используя StringBuilder при чтении файла, добавляйте каждую строку, которая читает файл, чтобы заставить работать логику подсчета.

 private StringBuilder abc1 = new StringBuilder();
....
....
 abc1.append(abc);
...
...
Scanner s = new Scanner(abc1.toString()); 
  

Это позволит прочитать весь текст и отсканировать word

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

1. Хорошая альтернатива списку, просто следует добавить пробел между каждой строкой, иначе он не найдет слово, если оно находится в конце или начале строки, поскольку OP использует equals для сравнения с ключевым словом поиска.

Ответ №2:

Я конструктор File

 String abc;
while((abc = in.readLine()) != null)
        {
        abc1=abc;
        System.out.println(abc1);
        }       
    in.close();
  

вы читаете файл hole в aloop, но сохраняете только последнюю строку в переменной-члене abc1

Подсчет позже выполняется только в этой последней строке.

Возможно, вы захотите изменить свой membervariable на List<String> , куда вы добавляете строку, которую вы прочитали в конструкторе. При подсчете вы могли бы выполнить итерацию по этому списку и подсчитать слова в каждом элементе списка.

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

1. Большое спасибо. Это помогло.

2. да. Извините. Я тоже здесь новый участник. 🙂