"Считаем слово" Почему не принимает?

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

com.javarush.task.task19.task1907;
«Считаем слово»
Считать с консоли имя файла.
Файл содержит слова, разделенные знаками препинания.
Вывести в консоль количество слов «world«, которые встречаются в файле.


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 {

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

        int count = 0;

        while (bufferedFileReader.ready()){

            String text = bufferedFileReader.readLine();
            text = text.toLowerCase();
            text = text.replaceAll("\\p{P}"," ");
            String[] mas = text.split(" ");

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

        reader.close();
        fileReader.close();
        bufferedFileReader.close();

        System.out.println(count);


Логика следующая:
1. считываем из файла строку
2. переводим в нижний регистр (на всякий. но и без этого не проходит)
3. заменяем всю пунктуацию на пробелы
4. по пробелам разбиваем строку текста на массив
5. подсчитываем количество совпадений
6. если есть ещё строка, повторяем пункты с 1 по 5
7. закрываем потоки и выводим количество совпадений

Тестовый файл:
«World? world ,world, world.world!world world
world»

Результат: 8

Где я ошибся?

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

alxbb
Используй РВ которое описывает разделитель как «все что не является буквой». Слова так же могут содержать букву ёЁ
Aronofsky
«Слова могут содержать букву ёЁ» — но такие слова никак не мешают алгоритму. Слова на кириллице, да и вообще любые которые не «world», просто не учитываются при подсчете. А слово «worldё» — это не слово «world», а какое-то другое. В задании сказано «Файл содержит слова, разделенные знаками препинания», а регулярка "\\p{P}" матчит любой из символов: !"#$%&'()*+,-./:;<=>?@[\]^_{|}~`. Так в чём же проблема?
LostMichael1987
Текстовый файл еще может содержать числа. world1, например, в текущем варианте кода не посчитается
EleNikIvi
world1 и не должен считаться
Aronofsky
Очередная «готовая» задача, которая повисла… Печельно
Aronofsky
Боги кода, где же вы? Когда закончится эта хрень? Как же достали задачи на интуицию и познание внутреннего мира авторов!
EleNikIvi
Попробуйте убрать строку где replaceAll, а следующую сделать так:
String[] mas = text.split("[\\p{Punct}\\s]+");
Aronofsky
  • Aronofsky
  • 0
  • Комментарий отредактирован 2017-04-07 23:09:26 пользователем Aronofsky
Не сработало :(

Вот ещё вариант реализации, который не прошел:

StringTokenizer st = new StringTokenizer(text," \t\n\r~`!@#$%^&\"№;:?*()-_=+<>,.\\/");
while (st.hasMoreTokens()) {
if («world».equals(st.nextToken())) count++;
}
EleNikIvi
А что говорит валидатор?
Aronofsky
  • Aronofsky
  • 0
  • Комментарий отредактирован 2017-04-07 23:16:46 пользователем Aronofsky
Список требований после проверки:
1. Программа должна считывать имя файла с консоли (используй BufferedReader).
2. BufferedReader для считывания данных с консоли должен быть закрыт.
3. Программа должна считывать содержимое файла (используй FileReader c конструктором String).
4. Поток чтения из файла (FileReader) должен быть закрыт.
5. Программа должна выводить в консоль количество слов «world», которые встречаются в файле.
EleNikIvi
И не один пункт не выполнен?
Программа должна считывать содержимое файла (используй FileReader c конструктором String). — Может надо без BufferedReader считывать из файла?
Aronofsky
  • Aronofsky
  • 0
  • Комментарий отредактирован 2017-04-07 23:22:37 пользователем Aronofsky
Чтобы узнать, какой именно пункт не выполнен, нужна PREMIUM-PODPISKA, очень удобно

В других топиках по этой задаче люди считывали данные по байту, без BufferedReader — тоже не работало
EleNikIvi
Попробуйте переделать без буффередРидера. Скорее всего в нем проблема… По крайней мере у последних решивших эту задачу было без него
EleNikIvi
Покажите код после изменения
Aronofsky
Ещё пробовал строки не отдельно обрабатывать, а сначала склеивать в одну — результат не изменился
Aronofsky
Вот этот код прошел:

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

int count = 0;
String text = "";

while (fileReader.ready()) {
text += (char)fileReader.read();
}

text = text.toLowerCase();
text = text.replaceAll("\\p{P}|\\t|\\n|\\r"," ");
String[] mas = text.split(" ");

for (int i=0;i<mas.length;i++){
if («world».equals(mas[i]))count++;
}

reader.close();
fileReader.close();
System.out.println(count);

Но какого лешего?
1. в коде, который не приняли, для создания потока используется FileReader, как и указано в задании
2. для дальнейшего удобства решения задачи, байтовый поток передается в адаптер, который как раз изучается в данной лекции!

Логика! У меня бомбит от таких задач, где ты стараешься использовать материал лекции, придумать удобный код (насколько позволяют текущие знания), а надо было делать не «как лучше», а «как хочет автор».

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

И если бы во всех задачах был одинаковый подход к решению — буквально выполнить всё что написано в задании, можно было бы привыкнуть. Но нет — в других задачах нужно додумывать условие, чтобы пройти валидацию. И сиди гадай — проявить фантазию или сделать криво, но буквально выполнить требования.

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