Java: String - добавить символ n раз

Есть ли простой способ добавить символ или другую строку n-раз в существующую строку? Я не мог ничего найти в String, Stringbuilder, так далее.

15 ответов

Решение

Вы можете сделать это, используя потоковые API Java 8. Следующий код создает строку "cccc" от "c":

String s = "c";
int n = 4;
String sRepeated = IntStream.range(0, n).mapToObj(i -> s).collect(Collectors.joining(""));

Апаш commons-lang3 имеет StringUtils.repeat(String, int), с этим вы можете сделать (для простоты, а не с StringBuilder):

String original;
original = original + StringUtils.repeat("x", n);

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

В случае Java 8 вы можете сделать:

int n = 4;
String existing = "...";
String result = existing + String.join("", Collections.nCopies(n, "*"));

Выход:

...****

В Java 8 String.join метод был добавлен. Но Collections.nCopies есть даже в Java 5.

В случае повторения одного символа (не String) вы можете использовать Arrays.fill:

  String original = "original ";
  char c = 'c';
  int number = 9;

  char[] repeat = new char[number];
  Arrays.fill(repeat, c);
  original += new String(repeat);

Использовать этот

String input = "original";
String new = "new"; //new string to be added
int n = 10 // no of times we want to add
input = input + new String(new char[n]).replace("\0", new);`

Вы можете использовать метод Strings.repeat в Guava:

String existingString = ...
existingString += Strings.repeat("foo", n);

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

for(int i = 0; i < n; i++) {
    existing_string += 'c';
}

но вы должны использовать вместо этого StringBuilder и сохранить память

int n = 3;
String existing_string = "string";
StringBuilder builder = new StringBuilder(existing_string);
for (int i = 0; i < n; i++) {
    builder.append(" append ");
}

System.out.println(builder.toString());

В дополнение к ответам выше, вы должны инициализировать StringBuilder с соответствующей способностью, особенно, что вы уже знаете это. Например:

int capacity = existingString.length() + n * appendableString.length();
StringBuilder builder = new StringBuilder(capacity);
public String appendNewStringToExisting(String exisitingString, String newString, int number) {
    StringBuilder builder = new StringBuilder(exisitingString);
    for(int iDx = 0; iDx < number; iDx++){
        builder.append(newString);
    }
    return builder.toString();
}
 String toAdd = "toAdd";
 StringBuilder s = new StringBuilder();
 for(int count = 0; count < MAX; count++) {
     s.append(toAdd);
  }
  String output = s.toString();

Чтобы иметь представление о снижении скорости, я протестировал две версии: одну с Array.fill и одну с StringBuilder.

public static String repeat(char what, int howmany) {
    char[] chars = new char[howmany];
    Arrays.fill(chars, what);
    return new String(chars);
}

а также

public static String repeatSB(char what, int howmany) {
    StringBuilder out = new StringBuilder(howmany);
    for (int i = 0; i < howmany; i++)
        out.append(what);
    return out.toString();
}

с помощью

public static void main(String... args) {
    String res;
    long time;

    for (int j = 0; j < 1000; j++) {
        res = repeat(' ', 100000);
        res = repeatSB(' ', 100000);
    }
    time = System.nanoTime();
    res = repeat(' ', 100000);
    time = System.nanoTime() - time;
    System.out.println("elapsed repeat: " + time);

    time = System.nanoTime();
    res = repeatSB(' ', 100000);
    time = System.nanoTime() - time;
    System.out.println("elapsed repeatSB: " + time);
}

(обратите внимание, что цикл в основной функции - это пнуть в JIT)

Результаты приведены ниже:

elapsed repeat: 65899
elapsed repeatSB: 305171

Это огромная разница

Как я это сделал:

final int numberOfSpaces = 22;
final char[] spaceArray = new char[numberOfSpaces];
Arrays.fill(spaces, ' ');

Теперь добавьте его в свой StringBuilder

stringBuilder.append(spaceArray);

или же String

final String spaces = String.valueOf(spaceArray);

Имейте в виду, что если "n" большое, возможно, было бы не очень хорошей идеей использовать +=, поскольку каждый раз, когда вы добавляете еще одну строку через +=, JVM будет создавать новый объект (достаточно информации об этом вокруг).

Что-то вроде:

StringBuilder b = new StringBuilder(existing_string);
for(int i = 0; i<n; i++){
    b.append("other_string");
}
return b.toString();

На самом деле это не кодирование в IDE, поэтому могут возникнуть незначительные недостатки, но это основная идея.

Вот простой способ..

for(int i=0;i<n;i++)
{
  yourString = yourString + "what you want to append continiously";
}
Другие вопросы по тегам