Считаем слово

  • 20
  • Недоступна
Считать с консоли имя файла. Файл содержит слова, разделенные знаками препинания. Вывести в консоль количество слов "world", которые встречаются в файле. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (405)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Александр GoProшкин19 уровень, Чехов
вчера, 19:14
Задала задачка жару, то больше то меньше слов. В итоге победил вот таким RegEx:
line.split("\\pP|\\W");
И очень расстроило и удивило, что не принял валидатор
Pattern pattern = Pattern.compile("\\bworld\\b");
  Matcher matcher = pattern.matcher(allText.toString());
  while (matcher.find()) {
     count++;
}
вторник, 20:41
"Файл содержит слова, разделенные знаками препинания."..пробелами и переносами строк. Почему нельзя было сразу так написать?
вторник, 19:57
В одной строке считаешь – вале мало:
System.out.println(Arrays.stream(bufferedReader.lines().findFirst().get().split("\\p{Punct}")).filter(word -> word.contains("world")).count());
Хотя не написано, что слова разделены переносами строк. Во всех строках считаешь – ЕМУ МНОГО
System.out.println(bufferedReader.lines().mapToLong(line -> Arrays.stream(line.split("\\p{Punct}")).filter(word -> word.contains("world")).count()).sum());
Посвящаю этой задаче стих: Читаю я файлы в Stream API обутый. То ли Валя не пашет, то ли я е\w{5}ый!
вторник, 20:31
Это что за волшебный байты в первом слове? 0 и 1 – это понятно, что кодировка указана, а 3,5,7,9,11 – это что за нули?
Алексей Чумаков19 уровень, Ногинск
позавчера, 15:32
есть предположение, что это из-за кириллицы т.к. она шифруется 2 битами, а не одним. Соответственно для одного символа выделяется 2 бита, и второй просто не заполняется
позавчера, 15:52
Что-то не похоже. Такое только в первой строке и символы в файле только латинские.
Nikita Shirman19 уровень, Rishon leZion
понедельник, 10:15
Нашел интересный ресурс для тренировки регулярок. Может кому-то будет полезно. https://regex101.com/ Вводите текст, потом свой regexp и он сразу показывает совпадения. Есть также блок с описанием спецсимволов
Александр 20 уровень, Екатеринбург
27 мая, 07:27
Удалось решить с первого раза без регулярных выражений. Правда пришлось ночь подумать. Мой ход размышлений: 1. Я не знаю, что Валя считает знаками препинания; 2. Я точно знаю, что Валя хочет найти слово состоящее из строчных букв латинского алфавита; 3. Искомое слово может быть частью какого-нибудь другого слова, в этом случае его считать не надо. После этого принял решение пойти от обратного, еще немного подумал и реализовал такой алгоритм: 1. Считал имя файла, используя BufferedReader согласно условия; 2. В цикле while (fileReader.ready()) стал читать байты из файла с такой логикой:
data = fileReader.read();
if (data >= 97 && data <=122) string = string.concat(Character.toString((char) data));
else string = string.concat(" ");
3. В результате у меня конкатенировалась строка, которая все символы не являющиеся строчными буквами латинского алфавита заменила пробелами. 4. Далее сплитом по регексу пробел разрезал строку на слова:
String[] strings = string.split(" ");
5. Далее пробежался форичем по массиву и если находил искомое слово - инкрементировал счетчик
for (String s : strings) if ("world".equals(s)) count++;
6. Вывел на печать значение счетчика. PS. Вот написал и подумал, что если совсем строго, то условие if надо бы дополнить еще прописными буквами (с 65 по 90), чтобы выловить слова типа baDworld, но это наверное уже совсем иезуитство? )))
вторник, 20:02
Я не хочу вас огорчать но "регекс" (это надо так русский язык не любить) как раз и является регулярным выражением, которое находится в вашем коде в кавычках тут:
String[] strings = string.split(" ");
RegEx == regular expressions Так что без регулярных выражений не получилось)
Александр 20 уровень, Екатеринбург
позавчера, 06:02
Вы меня ничуть не огорчили. Спасибо вам большое за ваше замечание.
Андрей19 уровень, Львов
24 мая, 11:53
Задачу если решать чистым Filereader (без BufferedReader(filereader)) еще та заморочка. Используйте бафередридер чтобы легче доступиться к стрингу на всю линию.
Alex Go22 уровень, Apatity
23 мая, 07:15
Победил через
regex: "[\\p{Punct}\\s]+"
Итай23 уровень, Новосибирск
23 мая, 06:58
Для тех кто решает без регулярок, пара подсказок от того, кто победил с 15 попытки. Учтите табуляцию, знаки препинания в середине слов, регистр. Потрачено три часа времени.
Дмитрий Малигон20 уровень, Санкт-Петербург
11 мая, 08:52
Вот статья помогла ссылка
Артём Кравченко20 уровень, Таганрог
10 мая, 09:48
Интересная задача - спасибо комментаторам за подсказку о регулярках и разделении строки на слова через \\W
Alexey Doynikov20 уровень, Санкт-Петербург
13 мая, 18:03
\\b - граница слова
Дмитрий Малигон20 уровень, Санкт-Петербург
16 мая, 08:44
$ конец строки