Как я могу дополнить строку в Java?

sprintf () обычно не является «быстрым». Поскольку вы знаете, что предварительно ожидающий memmove () дважды, вероятно, будет предпочтительнее для скорости.

Если вы выделяете строки с помощью malloc (), вы можете использовать realloc () для изменения размера массивов символов они могут содержать новую строку.

   char* p = malloc( size_of_first_string );
   ...
   p = realloc( p, size_of_first_string + size_of_prepended_string );
   memmove( p + size_of_prepended_string, p, size_of_first_string );
   memmove( p, prepended_string, size_of_prepended_string );
390
задан Jason Plank 21 September 2011 в 17:20
поделиться

9 ответов

  • 1
    Очень полный ответ и подробный, большое спасибо. – Petr Pudlák 30 August 2012 в 15:33

Начиная с Java 1.5, String.format() может использоваться, чтобы слева/справа дополнить данную строку.

public static String padRight(String s, int n) {
     return String.format("%-" + n + "s", s);  
}

public static String padLeft(String s, int n) {
    return String.format("%" + n + "s", s);  
}

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}

И вывод:

Howto               *
               Howto*
586
ответ дан RealHowTo 21 September 2011 в 17:20
поделиться

Помимо Apache палата общин, также см. String.format, который должен быть в состоянии заботиться о простом дополнении (например, с пробелами).

21
ответ дан Miserable Variable 21 September 2011 в 17:20
поделиться
  • 1
    Большой шаблон! Спасибо за совместное использование:) – apostolov 10 April 2013 в 15:12

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

public class RightPadder {

    private int length;
    private String padding;

    public RightPadder(int length, String pad) {
        this.length = length;
        StringBuilder sb = new StringBuilder(pad);
        while (sb.length() < length) {
            sb.append(sb);
        }
        padding = sb.toString();
   }

    public String pad(String s) {
        return (s.length() < length ? s + padding : s).substring(0, length);
    }

}

Как альтернатива, можно сделать длину результата параметром к pad(...) метод. В этом случае сделайте корректировку скрытого дополнения в том методе вместо в конструкторе.

(Подсказка: Для дополнительного кредита сделайте его ориентированным на многопотоковое исполнение!;-)

4
ответ дан joel.neely 21 September 2011 в 17:20
поделиться

Взгляните на телефон org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar).

, Но алгоритм очень прост (клавиатура прямо до символов размера):

public String pad(String str, int size, char padChar)
{
  StringBuffer padded = new StringBuffer(str);
  while (padded.length() < size)
  {
    padded.append(padChar);
  }
  return padded.toString();
}
22
ответ дан Arne Burmeister 21 September 2011 в 17:20
поделиться
  • 1
    можно улучшить это использование HtmlHelper. AnonymousObjectToHtmlAttributes () метод. – Bart Calixto 7 April 2014 в 19:06

java.util.Formatter сделает левое и правое дополнение. Никакая потребность в нечетных сторонних зависимостях (был бы Вы хотеть добавить их для чего-то таким образом тривиального).

[я не учел детали и сделал это сообщение 'сообществом Wiki', поскольку это не что-то, в чем у меня есть потребность.]

1
ответ дан Tom Hawtin - tackline 21 September 2011 в 17:20
поделиться
  • 1
    Спасибо. Я попробовал оба метода, и они оба работали, но как Вы сказал, что Быстрый Метод позволяет Вам управлять именем таблицы, таким образом, я предпочитаю тот метод. Еще раз спасибо. – Sean 24 February 2012 в 23:55

Как насчет того, чтобы использовать рекурсию? Решение, данное ниже, совместимо со всеми версиями JDK и никакими внешними требуемыми библиотеками :)

private static String addPadding(final String str, final int desiredLength, final String padBy) {
        String result = str;
        if (str.length() >= desiredLength) {
            return result;
        } else {
            result += padBy;
            return addPadding(result, desiredLength, padBy);
        }
    }

ПРИМЕЧАНИЕ : Это решение добавит дополнение с небольшой тонкой настройкой, можно снабдить префиксом значение клавиатуры.

0
ответ дан 22 November 2019 в 23:28
поделиться

Вот параллельная версия для тех из Вас, которые имеют очень длинные Строки :-)

int width = 100;
String s = "129018";

CharSequence padded = IntStream.range(0,width)
            .parallel()
            .map(i->i-(width-s.length()))
            .map(i->i<0 ? '0' :s.charAt(i))
            .collect(StringBuilder::new, (sb,c)-> sb.append((char)c), (sb1,sb2)->sb1.append(sb2));
0
ответ дан 22 November 2019 в 23:28
поделиться

вы можете использовать встроенные в StringBuilder методы append () и insert (), для заполнения строк переменной длины:

AbstractStringBuilder append(CharSequence s, int start, int end) ;

Например:

private static final String  MAX_STRING = "                    "; //20 spaces

    Set<StringBuilder> set= new HashSet<StringBuilder>();
    set.add(new StringBuilder("12345678"));
    set.add(new StringBuilder("123456789"));
    set.add(new StringBuilder("1234567811"));
    set.add(new StringBuilder("12345678123"));
    set.add(new StringBuilder("1234567812234"));
    set.add(new StringBuilder("1234567812222"));
    set.add(new StringBuilder("12345678122334"));

    for(StringBuilder padMe: set)
        padMe.append(MAX_STRING, padMe.length(), MAX_STRING.length());
2
ответ дан 22 November 2019 в 23:28
поделиться
Другие вопросы по тегам:

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