Java repeat не работает

Простой способ повторить строку в java

Я ищу простой метод или оператор commons, который позволяет мне повторить некоторую строку n раза. Я знаю, что могу написать это, используя цикл for, но я хочу избежать циклов for, когда это необходимо, и где-то должен существовать простой прямой метод.

связанные с:

повторить строку javascript создайте NSString, повторяя другую строку заданное число раз

редактировать

Я стараюсь избегать циклов, когда они не совсем необходимы, потому что:

они добавляют к числу строк кода, даже если они спрятаны в другой функции.

кто-то, читающий мой код, должен выяснить, что я делаю в этом цикле for. Даже если он комментирует и значимые имена переменных, они все равно должны убедиться, что он ничего не делает «умный.»

программисты любят вставлять умные вещи в циклы, даже если я пишу это «только делать то, что он должен делать», что не исключает, что кто-то придет и добавит некоторые дополнительные умные «исправления».

они очень часто легко ошибиться. Для циклов, включающих индексы, как правило, генерируются одним багом.

для циклов часто повторно использовать одни и те же переменные, увеличивая вероятность действительно трудно найти поиск Жуков.

для циклов увеличьте количество мест, которые должен искать охотник за ошибками.

29 ответов

С Java 11 on,есть способ String::repeat что делает именно то, что вы просили:

вот самая короткая версия (требуется Java 1.5+):

здесь n — это количество раз, когда вы хотите повторить строку и s — строка для повторения.

не требуется импорт или библиотеки.

если вы используете Java , это так просто, как он получает:

на Java 8 и выше есть простой способ:

Java 11 добавлен новый repeat​(int count) способ специально для этого(ссылке)

в Java 8-х String.join обеспечивает аккуратный способ сделать это в сочетании с Collections.nCopies :

вот способ сделать это, используя только стандартные строковые функции и нет явных петель:

Если вы похожи на меня и хотите использовать Google Guava, а не Apache Commons. Вы можете использовать повторить метод в классе строк Guava.

С java-8, вы также можете использовать Stream.generate .

и вы можете обернуть его в простой способ программу, если требуется:

Итак, вы хотите, чтобы избежать петли?

(конечно, я знаю, что это уродливо и неэффективно, но у него нет циклов : — p)

вы хотите, чтобы это проще и красивее? используйте jython:

редактировать: давайте немного оптимизируем его: — D

Edit2: я сделал быстрый и грязный тест для 4 основных варианта, но у меня нет времени, чтобы запустить его несколько раз получить средства и график времени для нескольких входов. Итак, вот код, если кто-то хочет попробовать:

требуется 2 аргумента, первый-это количество итераций (каждая функция выполняется с повторением раз arg от 1..n)и вторая-строка для повторения.

до сих пор, быстрый осмотр времени работает с различными входами оставляет рейтинг что-то вроде этого (лучше хуже):

  1. итеративный StringBuilder добавить (1x).
  2. рекурсивные вызовы Log2 конкатенации (

3x).
рекурсивные линейные вызовы конкатенации (

30x).
итеративная линейная конкатенация (

Я бы никогда не догадался, что рекурсивная функция была быстрее, чем for цикл: — o

получайте удовольствие(ctional xD).

Это содержит меньше символов, чем ваш вопрос

на основе ответ Фортрана, это recusive версия, которая использует то StringBuilder:

С помощью доллар — это просто наберите:

PS:повторить работает также для массива, списка, набора и т. д.

Я хотел, чтобы функция создавала разделенный запятыми список вопросительных знаков для целей JDBC, и нашел этот пост. Поэтому я решил взять два варианта и посмотреть, какой из них лучше. После 1 миллиона итераций StringBuilder Садового сорта занял 2 секунды (fun1), а загадочная, предположительно более Оптимальная версия (fun2) заняла 30 секунд. Какой смысл снова быть загадочным?

ООП решение

почти каждый ответ предлагает статическую функцию в качестве решения, но, думая об объектно-ориентированных (для целей повторного использования и ясности), я придумал решение через делегирование через интерфейс CharSequence (который также открывает удобство использования на изменяемых классах CharSequence).

следующий класс может использоваться как с разделителем-String/CharSequence, так и без него, и каждый вызов «toString()» создает окончательную повторяющуюся строку. Вход / Разделитель не только ограничены String-Class, но может быть каждый класс, который реализует CharSequence (например, StringBuilder, StringBuffer и т. д.)!

Исходный Код:

Использование-Пример:

Пример-Выход:

используя только классы JRE (

если скорость ваша забота,то вы должны использовать как можно меньше копирования памяти. При этом требуется работать с массивами символов.

чтобы проверить скорость, аналогичную оптимальным методом, используя StirngBuilder, как это:

и код для его проверки:

и здесь результаты запуска из моей системы:

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

Не самый короткий, но (Я думаю) самый быстрый способ-использовать StringBuilder:

Если вы беспокоитесь о производительности, просто используйте StringBuilder внутри цикла и выполните a .toString () при выходе из цикла. Черт, напишите свой собственный класс Util и повторно используйте его. 5 строк кода максимум.

Мне очень нравится этот вопрос. Есть много знаний и стилей. Поэтому я не могу оставить его без шоу моего рок — н-ролла 😉

используя рекурсию, вы можете сделать следующее (используя троичные операторы, максимум одну строку):

Я знаю, это уродливо и, вероятно, не эффективно, но это одна строка!

для удобства чтения и переносимости:

несмотря на ваше желание не использовать циклы, я думаю, вы должны использовать цикл.

ваши причины не использовать цикл for не хорошие. В ответ на вашу критику:—2—>

  1. любое решение, которое вы используете, почти наверняка будет дольше, чем это. С использованием встроенной функции только прячет его под одеяло.
  2. кто-то, читающий ваш код, должен будет выяснить, что вы делаете в этом не-для-цикла. Учитывая, что for-loop является идиоматическим способ сделать это, было бы намного легче выяснить, если вы сделали это с помощью цикла for.
  3. Да кто-то может добавить что-то умное, но, избегая цикла вы are делаешь что-то умное. Это как стрелять себе в ногу намеренно, чтобы случайно не выстрелить себе в ногу.
  4. Off-by-one ошибки также умопомрачительно легко поймать с помощью одного теста. Учитывая, что вы должны тестировать свой код, off-by — one ошибка должна быть легко исправить и поймать. И стоит отметить: приведенный выше код не содержит ошибки off-by-one. Ибо петли одинаково легко получить правильно.
  5. поэтому не используйте переменные повторно. Это не вина for-loop.
  6. опять же, как и любое решение, которое вы используете. И как я уже отмечал ранее; охотник за жуками, вероятно, ожидает, что вы сделаете это с циклом for, поэтому им будет легче найти его, если вы используете цикл for.

Источник

Простой способ повторить строку в Java

Я ищу простой метод или оператор, который позволяет мне повторять некоторые строки n раз. Я знаю, что мог бы написать это, используя цикл for, но я хочу избегать циклов for всякий раз, когда это необходимо, и где-то должен существовать простой прямой метод.

Относится к:

Edited

Я стараюсь избегать циклов for, когда они не являются полностью необходимыми, потому что:

Они добавляют к числу строк кода, даже если они спрятаны в другой функции.

Кто-то, читающий мой код, должен понять, что я делаю в цикле for. Даже если он прокомментирован и имеет значимые имена переменных, они все равно должны убедиться, что он не делает ничего «умного».

Программисты любят помещать умные вещи в циклы, даже если я пишу это для того, чтобы «делать только то, для чего они предназначены», что не исключает появления кого-то и добавления некоторого дополнительного умного «исправления».

Их очень часто легко ошибиться. Для циклов, включающих индексы, склонны генерировать по одной ошибки.

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

Для циклов увеличьте количество мест, которые должен искать охотник за насекомыми.

String::repeat

Новым в Java 11 является метод, String::repeat который делает именно то, что вы просили:

Вот самая короткая версия (требуется Java 1.5+):

Где n количество раз, которое вы хотите повторить строку и s строка для повторения.

Нет импорта или библиотеки не требуется.

Если вы используете Java repeat​(int count) метод специально для этого ( ссылка )

Кроме того, если ваш проект использует библиотеки Java, есть больше вариантов.

Java 8 String.join обеспечивает аккуратный способ сделать это в сочетании с Collections.nCopies :

Вот способ сделать это, используя только стандартные функции String и без явных циклов:

Если вы похожи на меня и хотите использовать Google Guava, а не Apache Commons. Вы можете использовать метод repeat в классе Guava Strings.

С Java-8Вы также можете использовать Stream.generate .

и вы можете обернуть его в простой служебный метод, если это необходимо:

Так ты хочешь избежать петель?

(конечно я знаю, что это некрасиво и неэффективно, но у него нет петель :-p)

Вы хотите, чтобы это было проще и красивее? использовать Jython:

Изменить : давайте немного оптимизировать это 😀

Edit2 : я сделал быстрый и грязный тест для 4 основных альтернатив, но у меня нет времени, чтобы запустить его несколько раз, чтобы получить средства и построить график для нескольких входов . Так вот код, если кто-то хочет попробовать это:

Он принимает 2 аргумента, первый — количество итераций (каждая функция запускается с временем повтора arg от 1..n), а второй — строка для повторения.

Пока что быстрая проверка времени, проведенного с разными входами, оставляет рейтинг примерно таким (лучше или хуже):

  1. Итеративное добавление StringBuilder (1x).
  2. Рекурсивные конкатенации log2 вызовов (

3x).
Рекурсивная конкатенация линейных вызовов (

30x).
Итеративная конкатенация линейная (

Я никогда не догадывался, что рекурсивная функция была быстрее for цикла: -o

Веселитесь (Ction XD).

Это содержит меньше символов, чем ваш вопрос

основываясь на ответе Фортрана, это рекурсивная версия, которая использует StringBuilder:

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 строк кода макс.

Мне очень нравится этот вопрос. Здесь много знаний и стилей. Так что я не могу оставить это без шоу моего рок-н-ролла;)

Вам это нравится?

Используя рекурсию, вы можете сделать следующее (используя троичные операторы, максимум одна строка):

Я знаю, это уродливо и, вероятно, не эффективно, но это одна строка!

простое однострочное решение:
требуется Java 8

Несмотря на ваше желание не использовать циклы, я думаю, вы должны использовать цикл.

Ваши причины не использовать цикл for не очень хорошие. В ответ на вашу критику:

  1. Какое бы решение вы ни использовали, оно почти наверняка будет длиннее. Использование предварительно встроенной функции только подправляет ее под большее покрытие.
  2. Кто-то, читающий ваш код, должен будет понять, что вы делаете в этом цикле. Учитывая, что цикл for является идиоматическим способом сделать это, было бы гораздо проще понять, если бы вы сделали это с помощью цикла for.
  3. Да кто — то может добавить что — то умное, но, избегая для цикла вы будете делать что — то умное . Это все равно, что умышленно выстрелить себе в ногу, чтобы случайно не выстрелить себе в ногу.
  4. Одиночные ошибки также легко понять с помощью одного теста. Учитывая, что вы должны тестировать свой код, легко исправить и отловить ошибку «один за другим». И это стоит отметить: приведенный выше код не содержит ошибки «один за другим». Для петель одинаково легко получить права.
  5. Так что не используйте переменные повторно. Это не ошибка цикла.
  6. Опять же, как и любое решение, которое вы используете. И, как я уже отмечал ранее; охотник за ошибками, вероятно, будет ожидать, что вы сделаете это с циклом for, поэтому им будет легче найти его, если вы используете цикл for.

Если вы знаете только длину выходной строки (и она может не делиться на длину входной строки), используйте этот метод:

Не используйте с пустым s и length > 0, так как в этом случае невозможно получить желаемый результат.

Источник

Читайте также:  Универсальный пульт для сплит системы как настроить huayu
Оцените статью