Считаем кол-во слов world - ПРОШУ ПОМОЩИ

Ни в какую не хочет проходить тест((( В чем моя ошибка? Вот код с заданием:
package com.javarush.test.level19.lesson05.task02;

/* Считаем слово
Считать с консоли имя файла.
Файл содержит слова, разделенные знаками препинания.
Вывести в консоль количество слов "world", которые встречаются в файле.
Закрыть потоки. Не использовать try-with-resources
*/

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;


public class Solution {
    public static void main(String[] args) throws IOException {

        int counter = 0;

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        BufferedReader fileReader = new BufferedReader(new FileReader(reader.readLine()));

        String[] words = fileReader.readLine().split("\\W+");

        for (int i = 0; i < words.length; i++) {
            if ("world".equals(words[i])) {
                counter++;
            }
        }

        System.out.println(counter);

        reader.close();
        fileReader.close();
    }
}

6 комментариев

XOPYC
  • XOPYC
  • 0
  • Комментарий отредактирован 2017-03-17 16:35:01 пользователем XOPYC
Возможно проблема в кодировке, FileReader считывает русские буквы вот в таком виде "???????????"
Archie369
Измените кодировку текстового файла в нижнем правом углу окна IDEA
FullHD
  • FullHD
  • 0
  • Комментарий отредактирован 2017-03-17 18:47:20 пользователем FullHD
Сам в своё время долго бился над этой задачей. Проблема в том, что split по Вашей регулярке строки «world,123world» даст массив [world,123world] и в результате только одно слово будет засчитано. Хотя по факту строка содержит два слова «world». Предвидя возражения, могу сказать, что сам долго возмущался, ибо из условия ясно следует, что словом считается только то, что находится между знаками препинания.

Но в итоге прошло решение, в котором из букв собиралось слово. Как только встречается «не буква» — проверяем, соответствует ли набранное слово искомому. Можно проверять сначала длину, если не соответствует — проверять через equals не имеет смысла.

И линий в файле может быть несколько, кстати.
imp
если будет world,123world — только 1 слово world.
у автора проблема в том, что он будет пропускать пробелы таким сплитом. например…
world, world, world,

тут у него будет 1 слово wolrd, хотя на самом деле их тут 3.
FullHD
Сейчас специально нашёл решение, которое я в своё время после многочисленных безуспешных попыток всё же сдал — так и есть, файл читается посимвольно, из букв (проверяем Сhar.isLetter())собираются слова, как только встречается первый символ (char), который не проходит проверку isLetter() — проверяется длина набранного слова, если соответствует искомому, проверяем на world.equals().

Со сплитом ты неправ. W+ соответствует любому символу, который не входит в диапазон [a-zA-Z0-9_]. Т.е., с пробелами всё будет нормально. Пруф: https://regex101.com/r/6RpxEm/2. Обрати внимание, там второй строкой твой пример. Разделители подсвечиваются, и видно, что пробелы ничем не мешают. А вот слово вроде world123 засчитано не будет, хотя само слово world как таковое в файле содержится. Не знаю, возможно, глюк валидатора, но у меня он принял именно такой вариант, который я описал выше.
Yuri_0504
  • Yuri_0504
  • 0
  • Комментарий отредактирован 2017-03-18 23:27:43 пользователем Yuri_0504
В этой задаче некорректный валидатор.
\W+ сделает сплит по всем символам отличным от букв/цифр. Надо делать только по знакам пунктуации.
Удалил, все что писал, хрен его знает что этому валидатору надо :), но 123world точно не должно считаться.

PS при \W+ словo №world будет засчитано, а оно не должно считаться
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.