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 );
Apache StringUtils
имеет несколько методов: leftPad
, rightPad
, center
и repeat
.
, Но обратите внимание на то, что —, поскольку другие упомянули и продемонстрировали в [1 112] этот ответ — String.format()
и эти Formatter
, классы в JDK являются более оптимальными вариантами. Используйте их по коду свободного городского населения.
Начиная с 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*
Помимо Apache палата общин, также см. String.format
, который должен быть в состоянии заботиться о простом дополнении (например, с пробелами).
Можно уменьшить издержки на вызов путем сохранения дополнительных данных, вместо того, чтобы восстановить его каждый раз:
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(...)
метод. В этом случае сделайте корректировку скрытого дополнения в том методе вместо в конструкторе.
(Подсказка: Для дополнительного кредита сделайте его ориентированным на многопотоковое исполнение!;-)
Взгляните на телефон 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();
}
java.util.Formatter
сделает левое и правое дополнение. Никакая потребность в нечетных сторонних зависимостях (был бы Вы хотеть добавить их для чего-то таким образом тривиального).
[я не учел детали и сделал это сообщение 'сообществом Wiki', поскольку это не что-то, в чем у меня есть потребность.]
Как насчет того, чтобы использовать рекурсию? Решение, данное ниже, совместимо со всеми версиями 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);
}
}
ПРИМЕЧАНИЕ : Это решение добавит дополнение с небольшой тонкой настройкой, можно снабдить префиксом значение клавиатуры.
Вот параллельная версия для тех из Вас, которые имеют очень длинные Строки :-)
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));
вы можете использовать встроенные в 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());