Я ищу простой метод или оператор, который позволяет мне повторять некоторые строки n раз. Я знаю, что мог бы написать это, используя цикл for, но я хочу избегать циклов for всякий раз, когда это необходимо, и где-то должен существовать простой прямой метод.
String str = "abc";
String repeated = str.repeat(3);
repeated.equals("abcabcabc");
Относится к:
Повторите строку javascript Создайте NSString, повторяя другую строку заданное количество раз
Edited
Я стараюсь избегать циклов for, когда они не являются полностью необходимыми, потому что:
Они добавляют к числу строк кода, даже если они спрятаны в другой функции.
Кто-то, читающий мой код, должен понять, что я делаю в цикле for. Даже если он прокомментирован и имеет значимые имена переменных, они все равно должны убедиться, что он не делает ничего «умного».
Программисты любят помещать умные вещи в циклы, даже если я пишу это для того, чтобы «делать только то, для чего они предназначены», что не исключает появления кого-то и добавления некоторого дополнительного умного «исправления».
Их очень часто легко ошибиться. Для циклов, включающих индексы, склонны генерировать по одной ошибки.
Для циклов часто используются одни и те же переменные, что увеличивает вероятность того, что действительно трудно найти ошибки в области видимости.
Для циклов увеличьте количество мест, которые должен искать охотник за насекомыми.
Ответы:
String::repeat
Новым в Java 11 является метод,
String::repeat
который делает именно то, что вы просили:Его Javadoc говорит:
источник
"abc".repeat(3)
Вот самая короткая версия (требуется Java 1.5+):
Где
n
количество раз, которое вы хотите повторить строку иs
строка для повторения.Нет импорта или библиотеки не требуется.
источник
char[]
в данном случае) создаются с нулями, затем изString
них создается achar[]
, а с нулями -replaced()
тот символ, который вам нуженs
...replace('\0', str)
следует использовать вместо версии String.replace(char oldChar, char newChar)
иreplace(CharSequence target, CharSequence replacement)
поэтому я не вижу, как это могло бы работатьЕсли вы используете Java <= 7 , это так "кратко", как это получается:
В Java 8 и выше есть более читаемый способ:
Наконец, для Java 11 и выше, есть новый
repeat(int count)
метод специально для этого ( ссылка )Кроме того, если ваш проект использует библиотеки Java, есть больше вариантов.
Для Apache Commons :
Для Google Guava :
источник
n
равен нулю.s
должна быть строка, а неChar
Commons Lang StringUtils.repeat ()
Применение:
источник
Java 8
String.join
обеспечивает аккуратный способ сделать это в сочетании сCollections.nCopies
:источник
Вот способ сделать это, используя только стандартные функции String и без явных циклов:
источник
replace()
. В Java 1.5+, есть перегруженная версия ,replace()
которая принимает дваCharSequence
с (которые включают в себяString
ы): download.oracle.com/javase/1.5.0/docs/api/java/lang/...n=3
: сначала форматирует строку, чтобы она выглядела примерно так%03d
(%%
чтобы избежать знака процента), который представляет собой код форматирования для добавления трех нулей заполнения, затем форматирует0
с этим, приводя к000
, и, наконец, заменяет каждое0
на строкиЕсли вы похожи на меня и хотите использовать Google Guava, а не Apache Commons. Вы можете использовать метод repeat в классе Guava Strings.
источник
С Java-8Вы также можете использовать
Stream.generate
.и вы можете обернуть его в простой служебный метод, если это необходимо:
источник
return IntStream.range(0, times).mapToObj(i -> str).collect(joining());
что распараллеливает лучшеТак ты хочешь избежать петель?
Вот оно:
(конечно я знаю, что это некрасиво и неэффективно, но у него нет петель :-p)
Вы хотите, чтобы это было проще и красивее? использовать Jython:
Изменить : давайте немного оптимизировать это :-D
Edit2 : я сделал быстрый и грязный тест для 4 основных альтернатив, но у меня нет времени, чтобы запустить его несколько раз, чтобы получить средства и построить график для нескольких входов ... Так вот код, если кто-то хочет попробовать это:
Он принимает 2 аргумента, первый - количество итераций (каждая функция запускается с временем повтора arg от 1..n), а второй - строка для повторения.
Пока что быстрая проверка времени, проведенного с разными входами, оставляет рейтинг примерно таким (лучше или хуже):
Я никогда не догадывался, что рекурсивная функция была быстрее
for
цикла: -oВеселитесь (Ction XD).
источник
Это содержит меньше символов, чем ваш вопрос
источник
commons-lang3.3.1-sources
и ты уже не так хорош;) Но если у кого-то уже естьcommons-lang
, я поддержу твой ответ.основываясь на ответе Фортрана, это рекурсивная версия, которая использует StringBuilder:
источник
использовать Dollar просто:
PS: повтор работает также для массива, списка, набора и т. Д.
источник
Я хотел, чтобы функция создавала разделенный запятыми список вопросительных знаков для целей JDBC, и нашел этот пост. Итак, я решил взять два варианта и посмотреть, какой из них работает лучше. После 1 миллиона итераций садовый сорт StringBuilder занял 2 секунды (fun1), а загадочная, предположительно, более оптимальная версия (fun2) - 30 секунд. Какой смысл снова быть загадочным?
источник
ООП решение
Почти каждый ответ предлагает статическую функцию в качестве решения, но, думая об объектно-ориентированном (для целей повторного использования и ясности), я придумал решение через делегирование через интерфейс CharSequence (который также открывает удобство использования на изменяемых классах CharSequence-Classes).
Следующий класс может использоваться с или без Separator-String / CharSequence, и каждый вызов toString () создает последнюю повторяемую строку. Input / Separator не только ограничен String-Class, но может быть любым классом, который реализует CharSequence (например, StringBuilder, StringBuffer и т. Д.)!
Исходный код:
Использование-Пример:
Пример-выход:
источник
используя только классы JRE ( System.arraycopy ) и пытаясь минимизировать количество временных объектов, вы можете написать что-то вроде:
РЕДАКТИРОВАТЬ
и без петель вы можете попробовать с:
РЕДАКТИРОВАТЬ 2
использование коллекций еще короче:
Однако мне все еще нравится первая версия.
источник
Не самый короткий, но (я думаю) самый быстрый способ - использовать StringBuilder:
источник
Если вам важна скорость, вы должны использовать как можно меньше памяти. Таким образом, требуется работать с массивами символов.
Чтобы проверить скорость, подобный оптимальный метод с использованием StirngBuilder выглядит следующим образом:
и код для проверки:
И вот результаты запуска из моей системы:
Обратите внимание, что тест для цикла состоит в том, чтобы запустить JIT и иметь оптимальные результаты.
источник
для удобства чтения и переносимости:
источник
Если вы беспокоитесь о производительности, просто используйте StringBuilder внутри цикла и выполните .toString () при выходе из цикла. Черт возьми, напиши свой собственный класс Util и используй его снова. 5 строк кода макс.
источник
Мне очень нравится этот вопрос. Здесь много знаний и стилей. Так что я не могу оставить это без шоу моего рок-н-ролла;)
Вам это нравится?
источник
источник
Простой цикл
источник
times
к конструктору StringBuilder.Попробуйте это:
источник
Используя рекурсию, вы можете сделать следующее (используя троичные операторы, максимум одна строка):
Я знаю, это уродливо и, вероятно, не эффективно, но это одна строка!
источник
простое однострочное решение:
требуется Java 8
источник
Несмотря на ваше желание не использовать циклы, я думаю, вы должны использовать цикл.
Ваши причины не использовать цикл for не очень хорошие. В ответ на вашу критику:
источник
repetitions = -5
. б) скачать Commons Lang и запуститьrepeatString('a', 1000)
миллион раз подряд; сделать то же самое с вашим кодом; сравните время. Для дополнительного кредита сделайте то же самое сrepeatString('ab', 1000)
.StringUtils.repeat("ab",1000)
? Потому что это был мой ответ, что ты проголосовал. Он также работает лучше и не имеет ошибок.Если вы знаете только длину выходной строки (и она может не делиться на длину входной строки), используйте этот метод:
Демонстрация использования:
Не используйте с пустым
s
иlength
> 0, так как в этом случае невозможно получить желаемый результат.источник
вот последняя версия Stringutils.java StringUtils.java
он даже не должен быть таким большим, может быть превращен в него, и может быть скопирован и вставлен в служебный класс в вашем проекте.
Итак, e5, я думаю, что лучший способ сделать это - просто использовать вышеупомянутый код или любой из ответов здесь. но общий язык слишком велик, если это маленький проект
источник
Я создал рекурсивный метод, который делает то же самое, что вы хотите .. не стесняйтесь использовать это ...
У меня есть тот же ответ на Могу ли я умножить строки в Java, чтобы повторить последовательности?
источник
StringBuilder
вместо этого.Вы можете использовать этот рекурсивный метод для достижения желаемой цели.
источник