Java - Создает новый Строковый экземпляр с указанной длиной и заполненный определенным символом. Лучшее решение? [дубликат]

У Miguel было сообщение об отладке Моно работы Linux с удаленной отладкой на Visual Studio. Это может быть чем-то, что Вы хотите изучить... Используя Visual Studio для отладки Моно . Существует также новый проект, названный CloverLeaf, цель которого позволяет отладить Моно в Windows в Visual Studio.

79
задан Stephen Denne 26 November 2009 в 10:40
поделиться

8 ответов

Apache Commons Lang (возможно, достаточно полезно, чтобы быть в пути к классам любого нетривиального проекта) имеет StringUtils.repeat () :

String filled = StringUtils.repeat("*", 10);

Easy!

91
ответ дан 24 November 2019 в 10:02
поделиться

Вышесказанное нормально. Не возражаете, если я задам вам вопрос - это вызывает у вас проблемы? Мне кажется, что вы оптимизируете еще до того, как узнаете, нужно ли вам это делать.

Теперь о моем чрезмерно спроектированном решении. Во многих (но не во всех) случаях вы можете использовать CharSequence вместо String.

public class OneCharSequence implements CharSequence {
  private final char value;
  private final int length;
  public OneCharSequence(final char value, final int length) {
    this.value = value;
    this.length = length;
  }
  public char   charAt(int index)  {
     if(index < length) return value;
     throw new IndexOutOfBoundsException();
  }
  public int length() {
    return length;
  }
  public CharSequence subSequence(int start, int end) {
     return new OneCharSequence(value, (end-start));
  }
  public String toString() {
    char[] array = new char[length];
    Arrays.fill(array, value);
    return new String(array);
  }
}
4
ответ дан 24 November 2019 в 10:02
поделиться

Для повышения производительности у вас может быть одно предопределенное sting, если вы знаете максимальную длину, например:

String template = "###### ############################# ";

А затем просто выполните подстроку, как только вы узнаете длину.

5
ответ дан 24 November 2019 в 10:02
поделиться
public static String fillString(int count,char c) {
    StringBuilder sb = new StringBuilder( count );
    for( int i=0; i<count; i++ ) {
        sb.append( c ); 
    }
    return sb.toString();
}

Что не так?

5
ответ дан 24 November 2019 в 10:02
поделиться

Нет необходимости выполнять цикл и использовать только стандартные классы библиотеки Java:

protected String getStringWithLengthAndFilledWithCharacter(int length, char charToFill) {
  if (length > 0) {
    char[] array = new char[length];
    Arrays.fill(array, charToFill);
    return new String(array);
  }
  return "";
}

Как видите, я также добавил подходящий код для length == 0 чехол.

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

Просто используйте класс StringUtils из проекта apache commons lang . У вас есть метод leftPad :

StringUtils.leftPad("foobar", 10, '*'); // Returns "****foobar"
100
ответ дан 24 November 2019 в 10:02
поделиться

Одно дополнительное примечание: похоже, что все публичные способы создания нового экземпляра String обязательно включают в себя копию любого буфера, с которым вы работаете, будь то char [] , StringBuffer или StringBuilder . Из javadoc String (и повторяется в соответствующих методах toString из других классов):

Содержимое символьного массива копируется; последующая модификация массив символов не влияет вновь созданная строка.

Таким образом, вы получите операцию копирования, возможно, большого объема памяти после "быстрого заполнения" массива. Единственное решение, которое может избежать этой проблемы, - это решение от @mlk, если вы можете управлять работой напрямую с предлагаемой реализацией CharSequence (что может быть так).

PS: Я бы опубликовал это как комментарий, но у меня пока недостаточно репутации для этого.

2
ответ дан 24 November 2019 в 10:02
поделиться

Использование DOLLAR прост:

String filled = $("=").repeat(10).toString(); // produces "=========="
4
ответ дан 24 November 2019 в 10:02
поделиться
Другие вопросы по тегам:

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