Как реализовать 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 требует копирования конечных данных).

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