|
|
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Можно ли упростить мой код? Задача: -удаляет все гласные буквы, -перед каждой согласной буквой ставит символ ".", -все прописные согласные буквы заменяет на строчные. Гласными буквами считаются буквы "A", "O", "Y", "E", "U", "I", а согласными — все остальные. На вход программе подается ровно одна строка, она должна вернуть результат в виде одной строки, получившейся после обработки. входные данные aBAcAba выходные данные .b.c.b Мой код: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 17:49 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Вариант. Возможно не самый короткий но по крайней мере он более-менее поддерживаемый. По крайней мере виден конвейер операций. Если гнаться за компактностью то можно потерять опции debugging и общий смысл. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Лет несколько назад наш форум посетил создатель "ультра-коротких" языков. Сообщество его побило и отвергло. Вот так вот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 18:28 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Dmitry56, Код: java 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 18:44 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Dmitry56, Компиляция на основе варианта от Usman (добавлен toLowerCase()); вариант от mayton падал когда на входе первая согласная. Не описано что делать с точками на входе - в примере они удаляются. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Опасаюсь regex если честно... мощная штука но опасная (багами). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 20:32 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid unique, о каких багах ты говоришь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 21:06 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
mayton, этот тест падает Код: java 1. org.junit.ComparisonFailure: Expected :.b.c.b Actual :b.c.b Что делает regex (поправьте если нужно так как я не спец в регексе, скорее дилетант): Код: java 1. 2. 3. а что нужно было сделать по заданию: Dmitry56 -удаляет все гласные буквы, -перед каждой согласной буквой ставит символ ".", -все прописные согласные буквы заменяет на строчные. Тест упал там где нет гласной перед согласной; замена гласной на . нежелательна, нужно заменять согласную, как сделано в примере от Usman. Можно усложнить задачку и менять на lowercase не все символы а только часть, это будет более интересная задача, именно с применением Java API. Что то мне все больше напоминает topcoder arena , несколько лет назад у нас народ подсел на него, потом успокоился, там была песочница но к сожалению соревнование было по скорости создания решения а не его эффективности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 21:34 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
maytonuid unique, о каких багах ты говоришь? Извини mayton, не сразу понял, наверное вопрос был о багах в целом при применении regex? Часто regex применяется в конфигах для расширения функционала, набьет администратор regex в конфиг, программа отработает, что то не так поменяет с бизнес данными. Regex в конфигах это минное поле. Даже в коде не всегда есть возможность хорошо протестировать и сделать полное покрытие тестами, особенно сложных, развесистыех выражений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 21:48 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid uniquemaytonuid unique, о каких багах ты говоришь? Извини mayton, не сразу понял, наверное вопрос был о багах в целом при применении regex? Часто regex применяется в конфигах для расширения функционала, набьет администратор regex в конфиг, программа отработает, что то не так поменяет с бизнес данными. Regex в конфигах это минное поле. Даже в коде не всегда есть возможность хорошо протестировать и сделать полное покрытие тестами, особенно сложных, развесистыех выражений. 1) Конешно в целом. Мой сорс я написал за 2 минуты и даже не тестил как следует. Собственно он не интересен как объект для улучшения. По поводу возможных багов. Мало кто вкурсе что если вы конфигурируете композитное выражение которое состоит из пользовательского ввода и регулярки то пользовательский ввод нужно эскейпить через Код: java 1. Это одна из самый попсовых причин багов. Альтернативный кейс который был предложен Усманом - неплох но мне не нравится дублирование исходного шаблона "aoyeui" который повторяется аж три раза. Этот код компактен но его сложно поддерживать. Мне больше нравится вариант когда "код обслуживает данные" а не наоборот. 2) По поводу развесистых выражений. КМК есть разумный предел когда 1 регулярку лучше заменить на ковейер из более простых (или даже элементарных фунцкий-предикатов) которые делают последовательные проверки или реплейсменты. Это - по Фаулеру. Функции максимально просты. И их легко тестить. И по ним можно ходить дебаггером. Контр-пример - это написание регулярки которая проверять емейл на корректность. https://habrahabr.ru/post/175375/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 22:02 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
mayton2) По поводу развесистых выражений. КМК есть разумный предел когда 1 регулярку лучше заменить на ковейер из более простых (или даже элементарных фунцкий-предикатов) которые делают последовательные проверки или реплейсменты. Это - по Фаулеру. Функции максимально просты. И их легко тестить. И по ним можно ходить дебаггером. Контр-пример - это написание регулярки которая проверять емейл на корректность. https://habrahabr.ru/post/175375/ Мэйтон, опять пугаете меня ссылками, я человек от сохи, книг почти не читал. Согласен что отдельные специализированные функции (модули) есть благо для надежности и повторного использования кода, но к сожалению, regex не всегда сидит в коде а приходит из конфигов (от пользователей). Прижился он именно в скриптах и конфигах. Второй вопрос - использование разных паттернов под высокой нагрузкой - может оказаться что использование модулей (цепочки) жрет ресурсы (создание и сканирование строки несколько раз ) и красивый правильный подход не эффективен... Уходим в сторону, мое дело маленькое, поправил чуток тестик и пошел спать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 23:00 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
mayton Это - по Фаулеру. Функции максимально просты. И их легко тестить. И по ним можно ходить дебаггером. меня терзают смутные сомнения что еще чуть чуть и перейдем к функциональному программированию. ;-) хорошие уроки были от парней из netflix, как раз по поводу повторного использования фунций и развитию "функционально ориентированного" мышления (в обработке ассинхронных событий). Правда это была не Java, а JS но ведь у нас сейчас есть Scala. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 23:10 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid uniqueСогласен что отдельные специализированные функции (модули) есть благо для надежности и повторного использования кода, но к сожалению, regex не всегда сидит в коде а приходит из конфигов (от пользователей). Прижился он именно в скриптах и конфигах. Я - большой противник наполнять конфиги регулярками. Если есть любой другой механизм - определять бизнес логику - то это всё что угодно кроме регулярок. Регулярки - это необоснованное усложнение кода там, где решение может быть получено более просто. В примере где пользователь просит делать функцию подобную soundex или сворачивает гласные буквы, оставляя эдакое себе "письмо на идиш", я проведу code-review только в том случае когда необходимость регулярок будет мне доказана. Мой собственный пример с регулярками который я привел во втором посте - неудачен да и то я его писал по просьбе автора о минимизации объема кода. Яркий пример подобного овер-проектирования - это язык Perl который положили в гроб так и не проникнувшись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 23:49 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid uniqueменя терзают смутные сомнения что еще чуть чуть и перейдем к функциональному программированию. ;-) хорошие уроки были от парней из netflix, как раз по поводу повторного использования фунций и развитию "функционально ориентированного" мышления (в обработке ассинхронных событий). Правда это была не Java, а JS но ведь у нас сейчас есть Scala. Сомнения совершенно верные. И хотя я сам с ФП - пока "на вы" тоесть не являюсь его регулярным пользователем но тем не менее вижу в нем положительный эффект почти для любой логики. Особенно когда мы делаем применение цепочки фильтров. Например вместо Код: java 1. 2. 3. 4. Используем Код: java 1. на неком гипотетическом ФП языке. И если в верхнем варианте - функция-монолит имеющая повышенный complexity (попробуйте ее покрыть тестами!), то в нижнем варианте у нас несколько примитивных функций каждая очень проста и выполняет узкую задачу. А форма записи с pipeline - достаточно наглядна чтобы не вводить еще одну никому не нужную функцию transform() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.01.2017, 23:56 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid uniqueЧто то мне все больше напоминает topcoder arena , несколько лет назад у нас народ подсел на него, потом успокоился, там была песочница но к сожалению соревнование было по скорости создания решения а не его эффективности. Я - самый далекий человек от Олимпиад, контестеров, хакатонов и топкодеров. Мне органически претит идея очень быстрого кодинга. Я - мыслитель и философ в программировании. А также - воинствующий эстет. И если войду в соревнование - то солью по времени сразу же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 00:17 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Искал вариант преобразования регистра средствами самой регулярки... в Jаве не нашел, но есть в Intellij Idea : Character Description \l Changes the case of the next character to the lower case. \u Changes the case of the next character to the upper case. \L Changes the case of all the subsequent characters up to \E to the lower case. \U Changes the case of all the subsequent characters up to \E to the upper case. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 05:34 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
maytonна неком гипотетическом ФП языке. И если в верхнем варианте - функция-монолит имеющая повышенный complexity (попробуйте ее покрыть тестами!), то в нижнем варианте у нас несколько примитивных функций каждая очень проста и выполняет узкую задачу. А форма записи с pipeline - достаточно наглядна чтобы не вводить еще одну никому не нужную функцию transform() Наглядность хорошая но цепочки хороши при работе с потоками а не пересоздаваемыми массивами (строками в java), для больших массивов это малоэффективно (выше расход памяти и скорость ниже при обработке в цепочке), но для понимания и наглядности/отладки это хорошо. Функциональное программирование (и фильтры в частности) хороши (эффективны) для потоков. Пример того как можно использовать regex на потоках в скала: http://matt.might.net/articles/parsing-with-derivatives/ http://matt.might.net/articles/nonblocking-lexing-toolkit-based-on-regex-derivatives/ Пришлось столкнуться с Аpache Spark недавно (коннекторы к нему нужно делать под кастомный датасорс), в него scala органично вписалась, интерфейс к Спарку есть на Java но выглядит он каракатицей по сравнению со скала API. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 16:42 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
UsmanИскал вариант преобразования регистра средствами самой регулярки... в Jаве не нашел, но есть в Intellij Idea : Character Description \l Changes the case of the next character to the lower case. \u Changes the case of the next character to the upper case. \L Changes the case of all the subsequent characters up to \E to the lower case. \U Changes the case of all the subsequent characters up to \E to the upper case. Java похоже не поддерживает эти расширения (можно через матчер ручками делать но красоты не будет). В Java много ограничений в паттерне: Perl constructs not supported by this class: The preprocessing operations \l \u, \L, and \U. https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 16:49 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
КМК здесь суть не том как сделать case-insensitive поиск. А в том что надо заменить заглавные согласные на строчные. И регулярка здесь вообще не нужна. Учитесь смотреть на вещи проще. Без овер-проектирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 22:40 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
maytonКМК здесь суть не том как сделать case-insensitive поиск. А в том что надо заменить заглавные согласные на строчные. И регулярка здесь вообще не нужна. Учитесь смотреть на вещи проще. Без овер-проектирования. Это мы в сторону отвлекались. Вот пример с потоковым АПИ из Java 8 (без regex): Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. или так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.01.2017, 23:52 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Давайте сделаем альтернативный вариант. Без использования сложных структур данных типа HashSet и функций высшего порядка. Простой минимализм. Я считаю что данную задачу можно решить через FSM. И нам достаточно только строковых операций над 1 символом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 02:01 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
maytonДавайте сделаем альтернативный вариант. Без использования сложных структур данных типа HashSet и функций высшего порядка. Простой минимализм. Я считаю что данную задачу можно решить через FSM. И нам достаточно только строковых операций над 1 символом. Зачем state machine то сюда тащить? Можно чуть укоротить изначальный вариант то автора топика: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 02:26 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid unique, давайте еще меньше. Без String-API. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 10:28 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
maytonuid unique, давайте еще меньше. Без String-API. Можно и так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. или так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. или так Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 11:37 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
uid unique, я немного не это имел в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 12:34 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
Давай вернемся к заданию Код: java 1. 2. 3. 4. Обращаю внимание на то что автор ничего не говорит про строковый тип данных. (На самом деле я щас играю постановкой - но пускай будет так). Поэтому возможно нас устроит работа с потоками. Допустим будет System.in куда идет входной поток символов. А результат будет на System.out. Я с одной стороны усложняю API (Нельзя юзать String) а с другой стороны - снимаю все лимиты на размер. Теперь можно на вход подать строку больше чем 2 Гига-символов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 13:08 |
|
||
|
Строки java. Упрощение программы.
|
|||
|---|---|---|---|
|
#18+
maytonДавай вернемся к заданию Код: java 1. 2. 3. 4. Обращаю внимание на то что автор ничего не говорит про строковый тип данных. (На самом деле я щас играю постановкой - но пускай будет так). Поэтому возможно нас устроит работа с потоками. Допустим будет System.in куда идет входной поток символов. А результат будет на System.out. Я с одной стороны усложняю API (Нельзя юзать String) а с другой стороны - снимаю все лимиты на размер. Теперь можно на вход подать строку больше чем 2 Гига-символов. Можно что то подобное слепить Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но внутри используется массив так что чанки нельзя использовать (строка до нажатия Enter длинее чем максимальная длина массива в Java (2 гига, мах положительное значение int), везде используются буффера на массивах. Можно читать нажатия клавишь на клавиатуре и переключить терминал в символьный режим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2017, 13:58 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39379081&tid=2123234]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 192ms |
| total: | 337ms |

| 0 / 0 |
