Создайте строку с n символами

Существует ли путь в Java для создания строки с конкретным количеством указанного символа? В моем случае я должен был бы создать строку с 10 пробелами. Мой текущий код:

StringBuffer outputBuffer = new StringBuffer(length);
for (int i = 0; i < length; i++){
   outputBuffer.append(" ");
}
return outputBuffer.toString();

Есть ли лучший способ выполнить то же самое. В особенности я хотел бы что-то, что быстро (с точки зрения выполнения).

125
задан Andrew Tobilko 3 February 2018 в 09:22
поделиться

8 ответов

Цикл for будет оптимизирован компилятором. В таких случаях, как ваш, не нужно заботиться об оптимизации самостоятельно. Доверьтесь компилятору. :)

Edit: Btw если есть способ создать строку с n пробельными символами, то это кодируется так же, как вы только что сделали.

35
ответ дан 24 November 2019 в 00:56
поделиться

Я не знаю встроенного метода того, о чем вы спрашиваете. Однако для небольшой фиксированной длины, такой как 10, ваш метод должен быть достаточно быстрым.

-3
ответ дан 24 November 2019 в 00:56
поделиться

Хм теперь, когда я думаю об этом, может быть Arrays.fill :

char[] charArray = new char[length];
Arrays.fill(charArray, ' ');
String str = new String(charArray);

Конечно, я предполагаю, что Метод fill делает то же самое, что и ваш код, поэтому он, вероятно, будет работать примерно так же, но, по крайней мере, это меньше строк.

63
ответ дан 24 November 2019 в 00:56
поделиться

Как насчет этого?

char[] bytes = new char[length];
Arrays.fill(bytes, ' ');
String str = new String(bytes);
3
ответ дан 24 November 2019 в 00:56
поделиться

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

1
ответ дан 24 November 2019 в 00:56
поделиться

Просто замените ваш 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).

0
ответ дан 24 November 2019 в 00:56
поделиться

Вероятно, самый короткий код, использующий 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 ) );
158
ответ дан 24 November 2019 в 00:56
поделиться

Вы можете заменить 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 как переменную экземпляра, вы можете сэкономить время на создании экземпляров.

Это не потокобезопасно, если у вас несколько потоков, каждый поток должен иметь свою собственную копию.

0
ответ дан 24 November 2019 в 00:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: