Есть ли способ в Java, чтобы создать строку с указанным номером указанного символа? В моем случае мне нужно создать строку с 10 пробелами. Мой текущий код:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Есть ли лучший способ сделать то же самое. В частности, я хотел бы что-то, что быстро (с точки зрения исполнения).
java
string
stringbuffer
Пересекать
источник
источник
append(' ')
вместо этого ... это требует немного меньше вычислений ...Ответы:
Цикл for будет оптимизирован компилятором. В таких случаях, как ваш, вам не нужно заботиться об оптимизации самостоятельно. Доверься компилятору.
Кстати, если есть способ создать строку с n пробелами, то она закодирована так же, как вы только что это сделали.
источник
static Dictionary<int, String>
?" ".substring(0, 10);
Вероятно, самый короткий код с использованием
String
API, исключительно:Как метод, без непосредственного создания экземпляра
char
:Вызвать используя:
источник
Хм, теперь, когда я думаю об этом, может быть
Arrays.fill
:Конечно, я предполагаю, что
fill
метод делает то же самое, что и ваш код, поэтому он, вероятно, будет работать примерно так же, но, по крайней мере, это меньше строк.источник
Arrays.fill()
функция используется последовательно для выполнения этой работы в вашем коде и (стандартном и внешнем) коде библиотеки, то она является хорошим кандидатом для компиляции Hotspot и дает больше шансов найти ваш кэш ЦП. Будущие JVM могут назначить его как встроенную функцию. Роллинг сам по себе отрезает вас от всего этого совершенства в исполнении ...Я настоятельно рекомендую не писать цикл вручную. Вы будете делать это снова и снова в течение своей карьеры программиста. Люди, читающие ваш код, включая вас, всегда должны тратить время, даже если это всего лишь несколько секунд, чтобы переварить смысл цикла.
Вместо того, чтобы повторно использовать один из доступных библиотек , обеспечивающих код , который делает именно это , как
StringUtils.repeat
из Apache Commons Lang :Таким образом, вам также не нужно беспокоиться о производительности, поэтому все подробности
StringBuilder
, оптимизация компилятора и т. Д. Скрыты. Если функция будет работать медленно, это будет ошибкой библиотеки.С Java 11 это становится еще проще:
источник
В Java 8 вы можете использовать
String.join
:источник
Если вы хотите только пробелы, то как насчет:
что приведет к abs (n) пробелам;
источник
начиная с Java 11 :
начиная с Java 8 :
где:
источник
Начиная с Java 11 вы можете просто использовать
String.repeat(count)
для решения вашей проблемы.Таким образом, вместо цикла ваш код будет выглядеть так:
источник
Я думаю, что это меньше кода, это возможно, он использует класс Guava Joiner:
источник
pubic String n(int n) { ... }
который позволит создавать еще «меньший» код:n(10)
но, опять же, не имеет никакого смысла.Вы можете использовать стандартную
String.format
функцию для генерации N пробелов. Например:Делает строку с 5 пробелами.
или
Делает строку из 15 пробелов.
Если вы хотите, чтобы другой символ повторялся, вы должны заменить пробелы на нужный символ:
Вывод:
источник
Мой вклад основан на алгоритме быстрого возведения в степень.
Я проверил алгоритм по двум другим подходам:
String.concat()
для объединения строкStringBuilder
Тестовый код (конкатенация с использованием цикла for и
String.concat()
замедление для большогоn
, поэтому я пропустил его после 5-й итерации).Полученные результаты:
Вывод:
n
- используйте рекурсивный подходn
- петля имеет достаточную скоростьисточник
if
утверждения могут испортить предсказание ветвления ЦП. Это должно быть действительно переделано с использованием JMH ( openjdk.java.net/projects/code-tools/jmh ), иначе это немного бессмысленно.Как насчет этого?
источник
Учитывая, что мы имеем:
Java 8 (используя Stream)
Java 8 (Использование nCopies)
источник
Collectors.joining(EMPTY_STRING)
эквивалентноCollectors.joining()
У RandomStringUtils есть условие для создания строки из заданного размера ввода. Не могу прокомментировать скорость, но это один вкладыш.
создает вывод
желательно, если вы не хотите видеть \ 0 в вашем коде.
источник
Использовать StringUtils: StringUtils.repeat ('', 10)
источник
В большинстве случаев вам нужны только строки определенной длины, скажем, 100 пробелов. Вы можете подготовить массив строк, где порядковый номер равен размеру строки, заполненной пробелами, и найти строку, если требуемая длина находится в допустимых пределах, или создать ее по требованию, если она находится за пределами границы.
источник
Самое короткое решение с гуавой:
Через простой способ повторить строку в Java .
источник
Просто замените ваш StringBuffer на StringBuilder . Трудно победить это.
Если ваша длина - большое число, вы можете реализовать более эффективное (но более неуклюжее) самостоятельное добавление, дублируя длину в каждой итерации:
Кроме того, вы можете попробовать
Arrays.fill()
подход ( ответ FrustratedWithFormsDesigner ).источник
Вы можете заменить
StringBuffer
наStringBuilder
(последний не синхронизирован, может быть быстрее в однопоточном приложении)И вы можете создать
StringBuilder
экземпляр один раз, вместо того, чтобы создавать его каждый раз, когда вам это нужно.Что-то вроде этого:
И используйте это так:
Если вы храните вашу
createA
переменную экземпляра, вы можете сэкономить время на создании экземпляров.Это не является потокобезопасным, если у вас есть несколько потоков, каждый поток должен иметь свою собственную копию.
источник
Для хорошей производительности объедините ответы от aznilamir и от FrustratedWithFormsDesigner
Отрегулируйте размер в
BLANKS
зависимости от ваших требований. Моя конкретнаяBLANKS
строка имеет длину около 200 символов.источник
Есть такой метод. Это добавляет необходимые пробелы в конце данных,
String
чтобы сделать данныеString
для длины определенной длины.источник
Хотите, чтобы String был фиксированного размера, чтобы вы могли дополнять или усекать для табулирования данных ...
Отличная ссылка здесь .
источник
Это сработало для меня без использования каких-либо внешних библиотек в Java 8
И вывод
источник
int c = 10; Строковые пробелы = String.format ("%" + c + "c", ''); это решит вашу проблему.
источник
Простой метод, как показано ниже, также может быть использован
источник
как насчет этого?
РЕДАКТИРОВАТЬ: я написал простой код для проверки концепции и вот что я нашел.
Способ 1: добавление одного пробела в цикле:
Метод 2: добавить 100 пробелов и цикл, затем подстрока:
В результате я получаю 12,345,678 пробелов:
и на 10 000 000 мест:
Объединение прямого распределения и итерации всегда занимает меньше времени, в среднем на 60 мс при создании огромных пространств. Для меньших размеров оба результата незначительны.
Но, пожалуйста, продолжайте комментировать :-)
источник
Я не знаю встроенного метода для того, о чем вы спрашиваете. Однако для небольшой фиксированной длины, например 10, ваш метод должен быть достаточно быстрым.
источник