Существует ли путь в Java для создания строки с конкретным количеством указанного символа? В моем случае я должен был бы создать строку с 10 пробелами. Мой текущий код:
StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
outputBuffer.append(" ");
}
return outputBuffer.toString();
Есть ли лучший способ выполнить то же самое. В особенности я хотел бы что-то, что быстро (с точки зрения выполнения).
Цикл for будет оптимизирован компилятором. В таких случаях, как ваш, не нужно заботиться об оптимизации самостоятельно. Доверьтесь компилятору. :)
Edit: Btw если есть способ создать строку с n пробельными символами, то это кодируется так же, как вы только что сделали.
Я не знаю встроенного метода того, о чем вы спрашиваете. Однако для небольшой фиксированной длины, такой как 10, ваш метод должен быть достаточно быстрым.
Хм теперь, когда я думаю об этом, может быть Arrays.fill
:
char[] charArray = new char[length];
Arrays.fill(charArray, ' ');
String str = new String(charArray);
Конечно, я предполагаю, что Метод fill
делает то же самое, что и ваш код, поэтому он, вероятно, будет работать примерно так же, но, по крайней мере, это меньше строк.
Как насчет этого?
char[] bytes = new char[length];
Arrays.fill(bytes, ' ');
String str = new String(bytes);
В большинстве случаев вам нужны только строки до определенной длины, скажем, 100 пробелов. Вы можете подготовить массив строк, в котором номер индекса равен размеру заполненной пробелом строки, и выполнить поиск строки, если требуемая длина находится в установленных пределах, или создать ее по запросу, если она находится за пределами границ.
Просто замените ваш StringBuffer на StringBuilder. Трудно превзойти это.
Если ваша длина - большое число, вы можете реализовать некоторые более эффективные (но более неуклюжее) самоприменение, дублируя длину в каждой итерации:
public static String dummyString(char c, int len) {
if( len < 1 ) return "";
StringBuilder sb = new StringBuilder(len).append(c);
int remnant = len - sb.length();
while(remnant > 0) {
if( remnant >= sb.length() ) sb.append(sb);
else sb.append(sb.subSequence(0, remnant));
remnant = len - sb.length();
}
return sb.toString();
}
Также вы можете попробовать подход Arrays.fill()
(ответ FrustratedWithFormsDesigner).
Вероятно, самый короткий код, использующий String
API, исключительно:
String space10 = new String(new char[10]).replace('\0', ' ');
System.out.println("[" + space10 + "]");
// prints "[ ]"
As метод без прямого создания экземпляра char
:
import java.nio.CharBuffer;
/**
* Creates a string of spaces that is 'spaces' spaces long.
*
* @param spaces The number of spaces to add to the string.
*/
public String spaces( int spaces ) {
return CharBuffer.allocate( spaces ).toString().replace( '\0', ' ' );
}
Вызов с использованием:
System.out.printf( "[%s]%n", spaces( 10 ) );
Вы можете заменить StringBuffer
на StringBuilder
(последний не синхронизирован, может быть быстрее в однопоточном приложении)
И вы можете создать экземпляр StringBuilder
один раз, вместо того, чтобы создавать его каждый раз, когда он вам нужен.
Что-то вроде этого:
class BuildString {
private final StringBuilder builder = new StringBuilder();
public String stringOf( char c , int times ) {
for( int i = 0 ; i < times ; i++ ) {
builder.append( c );
}
String result = builder.toString();
builder.delete( 0 , builder.length() -1 );
return result;
}
}
И использовать его так:
BuildString createA = new BuildString();
String empty = createA.stringOf( ' ', 10 );
Если вы будете держать ваш createA
как переменную экземпляра, вы можете сэкономить время на создании экземпляров.
Это не потокобезопасно, если у вас несколько потоков, каждый поток должен иметь свою собственную копию.