Как я могу сделать это более разумным способом без конфликтов?

Таким образом, он возвращает некоторые ошибки, и кажется, что основными примерами являются символы из двух символов, например, "++" заменяется на "# ++ #", в то время как он близок к замене All () "на" ## + ## + ## ".

return lexeme.replaceAll(
        "= = ", "#==#"
    ).replaceAll(
        "&&", "#&&#"
    ).replaceAll(
        " = ", "#=#"
    ).replaceAll(
        ">", "#>#"
    ).replaceAll(
        "++", "#++#"
    ).replaceAll(
        "< = ", "#<=#"
    ).replaceAll(
        "!", "#!#"
    ).replaceAll(
        "-", "#-#"
    ).replaceAll(
        "--", "#--#"
    ).replaceAll(
        "+", "#+#"
    ).replaceAll(
        "+ = ", "#+=#"
    ).replaceAll(
        "*", "#*#"
    ).replaceAll(
        ",", "#,#"
    ).replaceAll(
        ".", "#.#"
    ).replaceAll(
        "[", "#[#"
    ).replaceAll(
        "{", "#{#"
    ).replaceAll(
        "(", "#(#"
    ).replaceAll(
        ")", "#)#"
    ).replaceAll(
        "}", "#}#"
    ).replaceAll(
        "]", "#]#"
    ).split( "#");
}

Сложность этой функции равна O (k (n)), где k - количество замен, которые необходимо сделать. Вы можете сделать это за O (n), но вы должны переопределить этот метод или определить новую функцию и проверить строку слово за словом и заменить ее, если совпадение найдено в любом из вышеуказанных условий.

Hamza Anis 12.04.2018 08:31

Вы можете сделать это с помощью одного вызова replaceAll, используя обратную ссылку $1 в строке замены: return lexeme.replaceAll("(==?|&&|\\+[+=]?|<=|--?|[>!*,.\\[{()}\\]]‌​)", "#$1#").split("#");

Andreas 12.04.2018 08:34

Большое спасибо, но мне нужно знать, есть ли способ без проблем, потому что способ, которым я написал, возвращает некоторые проблемы.

Igor Nunes 12.04.2018 08:35

Спасибо @Andreas! Я попробую так!

Igor Nunes 12.04.2018 08:35

@Andreas, у меня все еще проблема со следующим примером: "++ k". В этой лексеме метод split не возвращает массив строк. Вы что-нибудь об этом знаете?

Igor Nunes 12.04.2018 08:57

И @Andreas для ";" символ, только этот случай работал для split: ");". Остальные случаи: 45; не работает.

Igor Nunes 12.04.2018 09:12

не могли бы вы показать использование некоторых входных и ожидаемых результатов, пожалуйста?

YCF_L 12.04.2018 09:44

@IgorNunes В вашем коде нет ;, поэтому не знаю, о чем вы говорите. Что касается "++k", то с приведенным мной кодом в результате я получаю [, ++, k], поэтому он работает нормально ("++k" превращается в "#++#k", который разделяется на ["", "++", "k"]).

Andreas 12.04.2018 19:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
8
33
1

Ответы 1

Основная проблема правильности, возможно, заключается в том, что вы вызываете replaceAll() в результате предыдущей замены, поэтому, например, == сначала заменяется на #==# из-за правила, которое нацелено на ==, а затем на ##=##=## из-за замены, нацеленной на =.

Кроме того, ваш подход не гарантирует, что будет выбрана самая длинная совпадающая цель / игла, поэтому += заменяется на +#=#, а затем на #+##=#, прежде чем он даже достигнет цели +=.

Другие вопросы по теме