Как реализовать StringBuilder.replace(String, String) с точки зрения String?
String содержит множество полезных методов, таких как String.replace(CharSequence, CharSequence), которые полностью отсутствуют в StringBuilder. Есть ли причина, почему?
Есть ли простой способ реализовать эти методы без огромных накладных расходов на вызов StringBuilder.toString(), который каждый раз копирует строку?
2 ответа
Поскольку StringBuilder
обеспечивает как indexOf(String,int)
а также replace(int,int,String)
можно легко воспроизвести функциональность. Единственным недостатком здесь является то, что аргументы не могут быть CharSequence
объекты, но должны быть String
вместо.
При обработке огромных строковых объектов и выполнении множества операций замены можно использовать специализированный API, такой как Ropes for Java.
Итак, Pattern.matcher() принимает CharSequence, так что вы можете выполнить операцию сопоставления с исходным компоновщиком, не копируя его в новую строку.
Что касается замены, если она нетривиальна (текст не той же длины), вы, скорее всего, все равно захотите скопировать в новый StringBuilder (как это было бы при поиске / замене с использованием Matcher). в противном случае вы можете в конечном итоге повторно скопировать свои данные много раз в исходном StringBuilder (поскольку любая вставка / удаление в середине StringBuilder требует копирования конечных данных).