Java как использовать сканер для чтения и подсчета абзаца

Например, если у меня есть следующие строки текста в файле:

это пример. это пример.

это пример. это пример. это пример

это пример это пример это пример это пример это пример это пример это пример это пример это пример это пример это пример

Я хочу иметь возможность считать эти строки как 3 абзаца. Теперь мой код будет считать это как 4 абзаца, так как он не знает, когда абзац начинается и заканчивается.

Scanner file = new Scanner(new FileInputStream("../.../output.txt"));
int count = 0;
while (file.hasNextLine()) { //whilst scanner has more lines
    Scanner s = new Scanner(file.nextLine());
    if(!file.hasNext()){
        break;
    }
    else{
        file.nextLine();
        count++;
    }
    s.close();
}
System.out.println("Number of paragraphs: "+ count);
file.close();

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

Я хочу, чтобы он обрабатывал строки текста, между которыми нет пустой строки, как 1 абзац и подсчитывал все абзацы в файле.


person JD14    schedule 03.03.2014    source источник
comment
Это статически отформатированный файл? Не могли бы вы просто проверить вкладку или «\ t» или пустую строку?   -  person Patrick J Abare II    schedule 03.03.2014
comment
что ты уже испробовал? Продемонстрируйте некоторую работу и/или исследование, чтобы найти решение самостоятельно, а затем попросите помощи в решении конкретных проблем, которые вы не можете решить самостоятельно.   -  person Martin    schedule 03.03.2014
comment
Не понятно чего вы хотите. Вы пытаетесь подсчитать количество слов в абзаце? Если да, то как определить начало и конец абзаца? Это даст вам представление о том, как вы будете это делать. Подсказка: если он подсчитывает нужные вам слова, то Scanner.next() подберет для вас следующее слово.   -  person TA Nguyen    schedule 04.03.2014
comment
Да, я в основном хочу подсчитать количество слов в абзаце, который содержит определенное слово, но перед этим я хочу определить начало и конец абзаца, т.е. если после строки или строк текста есть пустое место, это означает, что это это конец этого абзаца. мой код читает каждую строку как абзац. Я изо всех сил пытался сделать это некоторое время.   -  person JD14    schedule 04.03.2014


Ответы (2)


Вы не сможете увидеть пробелы или символы новой строки с помощью Scanner. Метод nextLine() устраняет \n.

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

Попробуйте использовать read() метод FileInputStream.

person Arjit    schedule 03.03.2014

Сканер, вероятно, не лучший выбор, если вы хотите только подсчитывать строки. BufferedReader, вероятно, лучше.

    BufferedReader in = new BufferedReader(new FileReader("output.txt"));
    String line = in.readLine();
    int count = 0;
    StringBuilder paragraph = new StringBuilder();
    while (true) {
        if (line==null || line.trim().length() == 0) {
            count++;
            System.out.println("paragraph " + count + ":" + paragraph.toString());
            paragraph.setLength(0);
            if(line == null)
                break;
        } else {
            paragraph.append(" ");
            paragraph.append(line);
        }
        line = in.readLine();
    }
    in.close();
    System.out.println("Number of paragaphs: "+ count);    
person Ted Bigham    schedule 03.03.2014
comment
но он считает строки без проблем. я просто хочу, чтобы система могла знать, что такое абзацы, т. е. если есть пробел после строки/строк текста, это конец этого абзаца. atm рассматривает каждую строку текста как абзац - person JD14; 04.03.2014
comment
Вы говорите, что хотите читать каждый абзац как одну строку? Если вас не волнует количество, вы должны удалить это из своего примера (и заголовка). - person Ted Bigham; 04.03.2014
comment
Если вам нужно и то и другое (количество и абзац), просто используйте мой пример плюс StringBuilder для добавления каждой строки, пока не увидите пустую строку. - person Ted Bigham; 04.03.2014
comment
я не уверен, как использовать построитель строк, я новичок в java. Я хочу, чтобы система знала, когда начинается и заканчивается абзац, а затем подсчитывала каждый абзац в файле. Таким образом, в основном он должен читать строки текста, которые находятся вместе без пустой строки между ними, как один абзац. надеюсь это понятно - person JD14; 04.03.2014
comment
код не работает :(. вот результат: Количество строк: 0 Количество строк: 0 Количество строк: 0 Количество строк: 0 Количество строк: 0 ...... - person JD14; 04.03.2014
comment
после редактирования вашего кода теперь он просто повторно печатает первую строку в файле - person JD14; 04.03.2014
comment
Обновил ответ (снова). Мне также нужно было прочитать следующую строку внутри цикла. Не все ответы проверяются на переполнение стека, поэтому вам следует немного изменить ответ. Используйте его скорее в качестве руководства, а не замены капли. - person Ted Bigham; 04.03.2014
comment
ваш обновленный код в настоящее время просто повторно печатает первую строку текста - person JD14; 04.03.2014
comment
Я просто попробовал это, и это сработало для меня с небольшими изменениями. Все, что мне нужно было сделать, это обработать случай для последнего абзаца, когда файл не заканчивается пустой строкой. Я обновил ответ. Этот код протестирован, но идея не изменилась. - person Ted Bigham; 04.03.2014