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

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

String str = "abc";
String repeated = str.repeat(3);

repeated.equals("abcabcabc");

Относится к:

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

отредактированный

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

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

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

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

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

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

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

34 ответа

Сводка для быстрого ознакомления:

public class StringRepeat {

// Java 11 has built-in method - str.repeat(3);
// Apache - StringUtils.repeat(3);
// Google - Strings.repeat("",n);
// System.arraycopy

static String repeat_StringBuilderAppend(String str, int n) {

    if (str == null || str.isEmpty())
        return str;

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < n; i++) {
        sb.append(str);
    }
    return sb.toString();
}

static String repeat_ArraysFill(String str, int n) {
    String[] strs = new String[n];
    Arrays.fill(strs, str);
    return Arrays.toString(strs).replaceAll("\\[|\\]|,| ", "");
}

static String repeat_Recursion(String str, int n) {
    if (n <= 0)
        return "";
    else
        return str + repeat_Recursion(str, n - 1);
}

static String repeat_format1(String str, int n) {
    return String.format(String.format("%%%ds", n), " ").replace(" ", str);
}

static String repeat_format2(String str, int n) {
    return new String(new char[n]).replace("\0", str);
}

static String repeat_format3(String str, int n) {
    return String.format("%0" + n + "d", 0).replace("0", str);
}

static String repeat_join(String str, int n) {
    return String.join("", Collections.nCopies(n, str));
}

static String repeat_stream(String str, int n) {
    return Stream.generate(() -> str).limit(n).collect(Collectors.joining());
}

public static void main(String[] args) {
    System.out.println(repeat_StringBuilderAppend("Mani", 3));
    System.out.println(repeat_ArraysFill("Mani", 3));
    System.out.println(repeat_Recursion("Mani", 3));
    System.out.println(repeat_format1("Mani", 3));
    System.out.println(repeat_format2("Mani", 3));
    System.out.println(repeat_format3("Mani", 3));
    System.out.println(repeat_join("Mani", 3));
    System.out.println(repeat_stream("Mani", 3));

}

}

public static String rep(int a,String k)

       {
           if(a<=0)
                return "";
           else 
           {a--;
               return k+rep(a,k);
       }

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

repeated = str + str + str;

Иногда просто лучше. Каждый, кто читает код, может видеть, что происходит.

И компилятор будет делать причудливые вещи с StringBuilder за кулисами для вас.

Вот простой способ повторить звезду несколько раз (до некоторого известного максимума):

String stars = "*****".substring(0, n);
Другие вопросы по тегам