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";
}