-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
HW02. GREP. Громов Павел #6
base: dev
Are you sure you want to change the base?
Conversation
P.S. Вышел не самый лучший код... хотел сначала попробовать со стримами, как в прошлый раз, но столкнулся с проблемами, когда один флаг противоречит другому и как собирать строки при флаге Изначально хотел сделать по примеру
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Почти отлично, но все еще падаем с исключением при неправильно вводе вместо вежливого сообщения
> grep -A -1 plugin build.gradle
> grep _a
> grep smth shell # когда директорию передали
*/ | ||
private String executeGrep(@NotNull CommandLine commandLine) { | ||
List<String> argList = commandLine.getArgList(); | ||
String searchWord = argList.remove(0); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я вот только сейчас обратил внимание, что тут будут только вхождения искаться, но в задании требовалось:
поддерживающую регулярные выражения в строке поиска
if (commandLine.hasOption("i") && commandLine.hasOption("w")) { | ||
if (conditionCaseAndWordEquals(row, searchWord)) { | ||
isAdd = true; | ||
} | ||
} else if (commandLine.hasOption("i")) { | ||
if (conditionCase(row, searchWord)) { | ||
isAdd = true; | ||
} | ||
} else if (commandLine.hasOption("w")) { | ||
if (conditionWordEquals(row, searchWord)) { | ||
isAdd = true; | ||
} | ||
} else { | ||
if (conditionDefault(row, searchWord)) { | ||
isAdd = true; | ||
} | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Попробуйте этот кусок вынести в отдельную функцию и заинлайнить вызовы condition<???>
. Что-то вроде:
if (ignoreCase && onlyWords) {
return Arrays.asList(row.toLowerCase().split(" ")).contains(searchWord.toLowerCase());
} else if (...) {
...
}
Мне это помогло заметить, что случаи, когда регистр не важен и нужно искать вхождение слов очень непохожи и независимы:
- в случае, когда игнорируем регистр, нужно все к одному регистру привести и ничего больше дополнительно не делать,
- в случае, когда нужно искать только слова, нужно сам поиск осуществлять по-другому.
А потому случаи должны быть разделены и код точно получится чище и проще.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
- в случае, когда игнорируем регистр, нужно все к одному регистру привести и ничего больше дополнительно не делать
Я изначально начал так делать, а потом понял, что я привожу в нижний регистр исходную строку, таким образом на выходе я выдавал не оригинальный текст, а преобразованный в нижний регистр, и как по мне - это ведь неверно
(хотя может я неправильно понял Ваш посыл)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Вы можете оставить все, как сейчас есть, но вынести только выделенный кусок в функцию. Она будет принимать на вход текущую строку + какие-то еще параметры, и возвращать boolean:
- true, если строка подходит под паттерн с флагами
- false иначе
Во что она там строку внутри преобразовала не важно, мы продолжим работать с оригинальной строкой
Понял, что можно переделать реализацию на
Поэтому сделал отдельно проверку на регистр и отдельно Тесты:
|
Засчитываю |
Предыдущий PR закрыл, так как в нем нет смысла (код был очень сильно переписан и была выбрана другая библиотека)
Выбор библиотеки:
picocli
, так как именно на нее наткнулся на хабре. Используя ее, понял, что ее функционал несколько оверхед. Опции приходилось указывать через аннотации (предполагаю, что внутри использовалась рефлекия, чтобы запоминать какие аргументы парсить).Commons CLI
. Так как с ней уже встречались на курсе поJava
и она оказалось удобной в данной реализации. Всего стоило добавить несколько опций и все. В отличии отpicocli
, в которой приходилось делать операций в разы больше.В основном опирался на SO