Ищем нужные строки

  • 12
  • Недоступна
Давайте найдем нужные нам строки, и вот что мы должны для этого сделать. Считать с консоли имя файла. Вывести в консоль все строки из файла, которые содержат всего 2 слова из списка words. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (225)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Anonymous #2996742
Уровень 30, Санкт-Петербург, Russian Federation
22 июня, 17:27
Решал через регулярные выражения. Вроде бы ответ сходился, но валидатор не пропускал. И в очередной раз он был прав. Попробуйте в файле написать (например) не "Д файл файл Д", а "Д файл файл1 Д". Так вот, если в Pattern.compile("файл"), то оба выражения подойдут т.к. "файл1" содержит "файл". Поэтому стоит воспользоваться метасимволом границы слова \b.
comrade_b
Уровень 27, Амстердам, Нидерланды
6 июня, 11:11
Валидатор не принимает решение через стрим:
Long count = Arrays.stream(line.split(" "))
                        .toList()
                        .stream()
                        .filter(word -> words.contains(word))
                        .count();
В стриме считаю количество совпадений. Ошибка в файле com/javarush/task/task19/task1922/Solution.java в строке : 32 Не найден метод "toList()" в интерфейсе "java.util.stream.Stream<java.lang.String>" Меняю на:
Long count = Arrays.stream(line.split(" "))
                        .toList()
                        .stream()
                        .filter(word -> words.contains(word)).toList().stream()
                        .count();
что масло масленное, но то же самое. Та же ошибка. Хотя и первый, и второй код работает, и выдают правильные результаты. От себя добавлю, кому интересна тема: через стрим решение всегда в 3-4 раза медленнее, чем через цикл вызов метода .contains. Просто потому, что в потоке мы фильтруем весь, полученный из файла, а contains намного быстрее в Collections. Тестировал на файле из 5 тысяч строк.
MapXyZ
Уровень 33, Минск, Belarus
31 мая, 09:23
Вывод был правильный, но валидатор ругался на последний пункт. Оказалось... я в цикле проверял строку на соответствие условию и если она подходила - выводил в консоль, Создал ArrayList<String> для хранения подходящих строк, и после цикла уже их все вывел в консоль - валидатор пропустил.. Ну, ребята, в условии не сказано, что нужно выбрать строки, а потом вывести... главное вывести. Лан.. может кому поможет.
Олег
Уровень 32, Москва, Russian Federation
30 мая, 12:58
Валидатор: Учитывай, что в списке words может быть сколько угодно слов. Сразу писать полное условие - для слабаков!
Anonymous #3036451
Уровень 27, Falls Church, United States
13 мая, 11:44
Хочу заметить что решение через words.contains(s) не лучший вариант при большом количестве элементов в words, т. к. сложность функции contains составляет O(n). В этом случае словарь разумнее перегнать в HashSet, где сложность функциии contains составляет O(1). Подробнее P. S. решил через regexp:
private static String compileRegex() {
    StringBuilder sb = new StringBuilder();
    sb.append("(?<=^|\\s)(");
    sb.append(words.stream().collect(Collectors.joining("|")));
    sb.append(")(?=\\s|$)");

    return sb.toString();
}
artinsky
Уровень 20, Киев, Украина
29 марта, 16:51
Ковырял regexp. Интересовало, можно ли вычислить заданное слово в строке с ограничением количества вхождений сразу, без сплитов, чтобы не организовывать цикл с подсчётом частоты? То есть, что-то вроде (\\bword\\b){1}. Только в данном случае квантификатор {1} не работает. Может, кто знает как? Здорово бы сократило код
Yuri_S Инженер-конструктор 2к.
7 февраля, 07:37
if (words.contains(line[i]).....
public abstract boolean contains(Object o) Returns true if this list contains the specified element. More formally, returns true if and only if this list contains at least one element e such that (o==null ? e==null : o.equals(e))
PROaction
Уровень 23, Москва, Россия
29 января, 10:58
Ошибка при получении правильного решения с сервера
Михаил Кладовщик с кучей времени
17 января, 12:36
Была проблема в том, что русские буквы из файла считывались корректно, а русские буквы из статического блока записывались как кракозябры. Из-за этого всегда было 0 совпадений. По совету топ популярного коммента изменил Global Encoding на UTF-8. После этого все русские буквы стали отображаться корректно.
Yuriy Platonov
Уровень 36, Краснодар, Russian Federation
28 декабря 2021, 19:51
Не проходил валидацию по последнему пункту из-за того, что вынес Pattern в статическое поле и инициализировал его в статическом блоке отдельным методом. Валидатор ругался - "Программа должна выводить в консоль все строки из файла, которые содержат всего 2 слова из списка words".