Во-первых, запустите и профилируйте все приложение с помощью простого соответствия / замены.Это может показать вам, что:
- ваше приложение уже работает достаточно быстро, или
- ваше приложение тратит большую часть своего времени на выполнение чего-то другого, поэтому оптимизация кода соответствия / замены не являетсястоит.
Предполагая, что вы определили, что сопоставление / замена является узким местом, напишите себе небольшое приложение для тестирования производительности, которое позволяет вам проверять производительность и правильность ваших алгоритмов-кандидатов на представительных входных данных.Это также хорошая идея, чтобы включить входные данные «крайний случай», которые могут вызвать проблемы;Например, для подстановок в вашем примере входные данные, содержащие последовательность «bazoo», могут быть крайним случаем.Что касается производительности, убедитесь, что вы избегаете ловушек Java-микробанчмаркинга;например, эффекты разогрева JVM.
Далее реализуем несколько простых альтернатив и опробуем их.Один из них достаточно хорош?Готово!
В дополнение к вашим идеям вы можете попробовать объединить поисковые термины в одно регулярное выражение (например, "(foo | baz)"), использовать Matcher.find(int)
, чтобы найти каждое вхождение, использовать HashMap
для поиска замещающих строк и StringBuilder для построения выходной строки из подстрок входных строк и замен.(Хорошо, это не совсем тривиально, и это зависит от эффективной обработки чередования шаблонов / совпадений ... но я не уверен, что так. Но именно поэтому вы должны тщательно сравнивать кандидатов.)
В(маловероятно, что IMO), когда простая альтернатива его не обрезает, на этой странице википедии есть некоторые сведения, которые могут помочь вам в реализации собственного эффективного сопоставления / замены.