Я знаю, что мы можем добавлять строки, используя StringBuilder
. Есть ли способ, которым мы можем добавить строки (т.е. добавить строки перед строкой), используя, StringBuilder
чтобы мы могли сохранить предлагаемые преимущества производительности StringBuilder
?
c#
java
stringbuilder
Burnt1ce
источник
источник
Ответы:
Использование метода вставки с параметром позиции, установленным на 0, будет таким же, как добавление в начале (т.е. вставка в начало).
Пример:
varStringBuilder.insert(0, "someThing");
Работает как для C #, так и для Java.
источник
Добавление строки обычно требует копирования всего, что находится после точки вставки, обратно в массиве поддержки, поэтому это будет не так быстро, как добавление в конец.
Но в Java можно сделать так (в C # то же самое, но метод вызывается
Insert
):источник
Если вам требуется высокая производительность с большим количеством препендов, вам нужно будет написать свою собственную версию
StringBuilder
(или использовать чужую). Со стандартомStringBuilder
вставке (хотя технически она может быть реализована иначе) для вставки требуется копирование данных после точки вставки. Вставка n фрагментов текста может занять время O (n ^ 2).Наивный подход заключался бы в добавлении смещения в
char[]
буфер поддержки, а также длины. Если места для добавления не хватает, переместите данные на большее значение, чем это строго необходимо. Это может снизить производительность до O (n log n) (я думаю). Более совершенный подход - сделать буфер циклическим. Таким образом, свободное пространство на обоих концах массива становится непрерывным.источник
Вы можете попробовать метод расширения:
источник
Вы можете построить строку в обратном порядке, а затем обратить результат. Вы понесете стоимость O (n) вместо затрат O (n ^ 2) в худшем случае.
источник
Я не использовал его, но Ropes For Java звучит интригующе. Название проекта - игра слов, для серьезной работы используйте веревку вместо струны . Обходит снижение производительности за добавление и другие операции. Стоит взглянуть, если вы собираетесь много заниматься этим.
источник
Вот что вы можете сделать, если хотите добавить в начало класса Java StringBuilder:
источник
Если я вас правильно понял, похоже, метод вставки сделает то, что вы хотите. Просто вставьте строку со смещением 0.
источник
Попробуйте использовать Insert ()
источник
Судя по другим комментариям, стандартного быстрого способа сделать это не существует. Использование StringBuilder
.Insert(0, "text")
примерно в 1–3 раза быстрее, чем использование мучительно медленной конкатенации строк (на основе> 10000 конкатенаций), поэтому ниже приведен класс, который потенциально может добавлять в тысячи раз быстрее!Я включил некоторые другие базовые функции, такие как
append()
,subString()
иlength()
т. Д. И добавление, и добавление различаются от примерно в два раза быстрее до 3 раз медленнее, чем добавления StringBuilder. Как и StringBuilder, буфер в этом классе автоматически увеличивается, когда текст превышает старый размер буфера.Код был протестирован достаточно много, но я не могу гарантировать, что он не содержит ошибок.
источник
Вы можете сами создать расширение для StringBuilder с помощью простого класса:
Затем просто добавьте:
В верхней части любого класса, в котором вы хотите использовать StringBuilder, и каждый раз, когда вы используете intelli-sense с переменной StringBuilder, будут отображаться методы Prepend и PrependLine. Просто помните, что, когда вы используете Prepend, вам нужно будет Prepend в обратном порядке, чем если бы вы использовали Appending.
источник
Это должно работать:
источник
string
, но не работает со значениями типаStringBuilder
. Ответ от @ScubaSteve работает хорошо.