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

  • 10
  • Недоступна
Давайте найдем нужные нам строки, и вот что мы должны для этого сделать. Считать с консоли имя файла. Вывести в консоль все строки из файла, которые содержат всего 2 слова из списка words. Закрыть потоки.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (103)
  • популярные
  • новые
  • старые
Для того, что бы оставить комментарий вы должны авторизоваться
Роман20 уровень
21 декабря 2018, 01:46
Не увидел тут коментов об использовании связки этих интересных классов, забыли про них совсем?
Pattern pattern;     //это шаблон того что мы хотим искать
Matcher matcher;  //тут есть метод для поиска текста в строках
//Делаю строгий шаблон указывая начало и конец строки иначе может найти слово в слове :)
pattern = Pattern.compile("\\b"+words+"\\b");  \\words - естественно это наши строки в Liste
...
...
Максим20 уровень, Москва
позавчера, 15:41
сделал через find, но вот про \\b - не знал, спасибо :)
NazFarr27 уровень
28 августа 2018, 13:40
с первой попытки ??? неужели??
Andry Max35 уровень, Минск
11 августа 2018, 22:39
потратил первую попытку чтобы узнать что список words может быть любой длины, а я сделал конкретно под этот сразу( ну ладно, после предыдущих задач, которые были либо сложные либо валидатор ********** эта расслабляет.
Роман20 уровень, Харьков
2 августа 2018, 17:49
а я, по старинке, счетчиком)))
while (fr.ready()) {
    String str = fr.readLine();
    List<String> list = new ArrayList<>(Arrays.asList(str.split(" ")));
    int count = 0;
    for (String s : words) count += Collections.frequency(list, s);
    if (count == 2) System.out.println(str);
}
Артем38 уровень, Москва
10 августа 2018, 08:41
Можно еще более олдскульно )
if (words.contains(str)) counter++;
NazFarr27 уровень
28 августа 2018, 13:47
я так и сделал. а че я уже старый? я ж еще начинаю свои первые шаги... уже старый??))))
Taras Kutselya22 уровень
3 ноября 2018, 09:32
По логике валидатор это не пропустит. Если str будет частью слова, contains(str) все равно вернет true.
Taras Kutselya22 уровень
3 ноября 2018, 10:09
String reg = "\\p{all}*" + word + "(\\s|\\p{Punct}|$)+\\p{all}*";
if (line.matches(reg)) count++;
У меня так получилось. Если кто придумает как упростить регулярку напишите в комментах.
Марина20 уровень
26 декабря 2018, 09:18
Странно, но у меня работает через contains(str), а если часть слова, то не пропускает такую строку, но ВАЛИДАТОР и правда не принимает((((
Игорь22 уровень, Нижний Новгород
6 января, 10:03
А что в этой конструкции с чем сравнивается? Что содержится в str?
Максим20 уровень, Москва
позавчера, 15:42
как подсказали выше - "\\b" + word + "\\b"
Диего26 уровень, Новосибирск
2 июля 2018, 21:57
Файл для проверки.
файл вид В
файл вид
урна тополь файл
кракен вишня птица параход
бритва монитор В вид
файл
файлфайл
вид
вид файл
Вывод:
файл вид
бритва монитор В вид
вид файл
Vitaly Khan35 уровень
12 июля 2018, 22:06
у меня программа выводит:  файл вид В файл вид бритва монитор В вид вид файл (в начале первой строки некий символ в виде маленькой точки. здесь в комментах он не отображается) кто-нибудь пояснит, откуда берется этот невидимый символ в начале текстового файла? не могу от него избавиться... ведь из-за него первая строка обрабатывается некорректно.
Диего26 уровень, Новосибирск
13 июля 2018, 09:12
Это zero width no-break space. Решение проблемы гуглится по запросу
маркер последовательности байтов
Victoria Sedletskaya32 уровень, Одесса
5 ноября 2018, 16:03
Помогло пересохранить файл в кодировке UTF-8 без BOM (это спец символ в начале файла)
item24 уровень
2 июля 2018, 10:17
Хотябы одно слово из списка words должно встречаться дважды. Проверяем по equals, бьем строки split(" ")
Юрий Гончаров20 уровень
27 июня 2018, 23:14
ВАЖНО - слово из спика не должно быть частью слова в строке. Кому сложно понять, вот рабочий вариант
Pavel Berdyuhin23 уровень
1 января, 15:13
Потратил из-за этого 5 попыток((( Далее додумался до
Matcher matcher1 = Pattern.compile("\\b" + wordsString + "\\b").matcher(s);
И Bingo)
Ярослав35 уровень
23 июня 2018, 13:29
Вы решили задачу лучше, чем 0% учеников. Зато получил бесценные знания :))
Артем28 уровень, Минск
28 мая 2018, 17:55
Долго мучался с кодировкой, просрал несколько попыток, в итоге все начало читать нормально, когда везде выставил windows-1251
Алексей Горяйнов20 уровень, Москва
3 июля 2018, 14:15
очень рекомендую Notepad++ - там очень просто устанавливать любые кодировки и можно видеть скрытые символы, что иногда помогает в вопросе: "@##%%, должно же работать!?"
Андрей40 уровень, Москва
9 апреля 2018, 18:03
С регуляркой "\W", убирающей все, кроме слов, не проходит, прошло с обычным пробелом. Можно обойтись без коллекций, просто 2 цикла перебора элементов внутри while.