Подтвердить что ты не робот

Как обрезать строку StringBuilder?

Как мы можем обрезать значение StringBuilder без накладных расходов, вызванных использованием StringBuilder.toString().trim() и после создания нового экземпляра строки StringBuilder?

4b9b3361

Ответ 1

Почему у StringBuilder нет метода trim()

  • Потому что так оно и было спроектировано. Попробуйте спросить дизайнеров.
  • Потому что его не так много.
  • Поскольку строка trim() семантика и подпись плохой подходит для изменяемых строк, хотя это спорно.

В любом случае ответ не имеет отношения к решению вашей проблемы.

и как мы можем обрезать значение StringBuilder?

Самый простой способ - использовать StringBuilder.toString().trim()...

Я не хочу использовать StringBuilder.toString(). trim().

В этом случае вам нужно сделать то, что trim() делает под обложками: совпадение и удаление верхнего и заднего пробелов. Поскольку у API-интерфейса StringBuilder нет поддержки регулярных выражений, вам нужно сделать это сложным образом; то есть путем итерации символов спереди вперед и конца назад, чтобы увидеть, какие символы нужно удалить и т.д.

Вы уверены, что не хотите, чтобы это было легко? Если нет, то этот Q & A имеет некоторые примеры реализаций, анализа, бенчмаркинга и т.д.:


На самом деле я в цикле, где мне нужно сравнить эту строку StringBuilder со многими другими значениями, поэтому, если я вызову StringBuilder.toString(). trim() каждый раз, он создаст новый экземпляр, и я не хочу каждый раз создавайте новый объект String.

Флип-сторона заключается в том, что удаление символов с начала StringBuilder влечет за собой копирование всех остальных символов.

Возможно, вам лучше было бы превратить полный StringBuilder в String для начала, тогда, когда вы будете использовать trim() и substring() и т.п., вы не будете копировать символы. (Эти методы работают путем создания новой строки, которая разделяет массив подстановки исходной строки... так что вы только копируете информацию управления строкой. UPDATE. В Java 7 они изменили поведение trim и substring, так что они использовали конструктор String, который копирует подмассив массива подкачки.)

Ответ 2

Я не знаю, чего вы пытаетесь достичь, но если вы беспокоитесь о производительности, возможно, вы можете выполнить обрезку, поскольку вы добавляете к StringBuilder.

stringbuilder.append(string.trim())

Ответ 3

Почему у StringBuilder нет метода trim()?

Hmm.. StringBuilder похож на String, просто небольшое различие, которое можно изменить после создания else, это то же самое, что и строка.

StringBuilder

Как указано в ссылке выше, основными операциями в StringBuilder являются методы добавления и вставки. Я предполагаю, что им предлагается поддерживать изменяемые строки, так же как и с StringBuffer. И если вы можете сделать все, сделав небольшой вызов другому методу, а затем желаемому методу, то в чем дело. Почему вы хотите, чтобы одна реализация выполнялась в нескольких классах.

Как мы можем обрезать значение StringBuilder?

Как говорят другие stringBuilder.toString().trim();

Я не хочу использовать StringBuilder.toString().trim().

Хм... вопрос выбора, любая конкретная причина для этого?

Ответ 4

Используйте StringBuilder.toString().trim(), но сохраните его в переменной.

Например:

String myTrimmedString = myStringBuilder.toString().trim();

У него нет метода trim(), потому что очень просто и несколько предпочтительнее использовать неизменяемые объекты. Представьте, что один поток обрезает StringBuilder, а другой добавляет к нему. Представьте себе ошибки и странности, которые могут возникнуть в вашем коде.

Ответ 5

Вы можете преобразовать экземпляр StringBuilder в string, который позже можно обрезать.

sb.toString().trim();//sb is stringBuilder Instance.