Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Поскольку он является открытым исходным кодом, вы можете прочитать, как он написан. Для небольших n-s существует небольшая оптимизация, если я правильно помню, но большую часть времени она использует StringBuilder.

Ответ 3

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

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

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

Ответ 4

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

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

Вывод:

...****

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

Ответ 5

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

String input = "original";
String newStr = "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", newStr);

Ответ 6

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

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

Ответ 7

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

Ответ 8

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());

Ответ 9

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

int capacity = existingString.length() + n * appendableString.length();
StringBuilder builder = new StringBuilder(capacity);

Ответ 10

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();
}

Ответ 11

 String toAdd = "toAdd";
 StringBuilder s = new StringBuilder();
 for(int count = 0; count < MAX; count++) {
     s.append(toAdd);
  }
  String output = s.toString();

Ответ 12

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

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

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

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

Ответ 13

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

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

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

stringBuilder.append(spaceArray);

или String

final String spaces = String.valueOf(spaceArray);

Ответ 14

Чтобы получить представление об ограничении скорости, я протестировал две версии: одну с 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

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

Ответ 15

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

for(int i=0;i<n;i++)
{
  yourString = yourString + "what you want to append continiously";
}