Как я могу дополнить строку в Java? - PullRequest
388 голосов
/ 23 декабря 2008

Есть ли какой-нибудь простой способ дополнить строки в Java?

Похоже, что-то должно быть в каком-то StringUtil-подобном API, но я не могу найти ничего, что делает это.

Ответы [ 27 ]

5 голосов
/ 21 сентября 2011

Вот еще один способ дополнения вправо:

// put the number of spaces, or any character you like, in your paddedString

String paddedString = "--------------------";

String myStringToBePadded = "I like donuts";

myStringToBePadded = myStringToBePadded + paddedString.substring(myStringToBePadded.length());

//result:
myStringToBePadded = "I like donuts-------";
4 голосов
/ 23 декабря 2008

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

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(...). В этом случае выполните настройку скрытого заполнения в этом методе, а не в конструкторе.

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

3 голосов
/ 26 октября 2017

Нашел это на Dzone

Подушка с нулями:

String.format("|%020d|", 93); // prints: |00000000000000000093|
2 голосов
/ 11 июля 2017

@ ck и @ Marlon Tarak - единственные ответы, которые используют char[], что для приложений, которые имеют несколько вызовов методов заполнения в секунду, лучший подход. Тем не менее, они не пользуются какой-либо оптимизацией манипулирования массивами и немного перезаписаны на мой вкус; это можно сделать с без циклов .

public static String pad(String source, char fill, int length, boolean right){
    if(source.length() > length) return source;
    char[] out = new char[length];
    if(right){
        System.arraycopy(source.toCharArray(), 0, out, 0, source.length());
        Arrays.fill(out, source.length(), length, fill);
    }else{
        int sourceOffset = length - source.length();
        System.arraycopy(source.toCharArray(), 0, out, sourceOffset, source.length());
        Arrays.fill(out, 0, sourceOffset, fill);
    }
    return new String(out);
}

Простой метод испытаний:

public static void main(String... args){
    System.out.println("012345678901234567890123456789");
    System.out.println(pad("cats", ' ', 30, true));
    System.out.println(pad("cats", ' ', 30, false));
    System.out.println(pad("cats", ' ', 20, false));
    System.out.println(pad("cats", '$', 30, true));
    System.out.println(pad("too long for your own good, buddy", '#', 30, true));
}

Выходы:

012345678901234567890123456789
cats                          
                          cats
                cats
cats$$$$$$$$$$$$$$$$$$$$$$$$$$
too long for your own good, buddy 
2 голосов
/ 24 августа 2011
public static String padLeft(String in, int size, char padChar) {                
    if (in.length() <= size) {
        char[] temp = new char[size];
        /* Llenado Array con el padChar*/
        for(int i =0;i<size;i++){
            temp[i]= padChar;
        }
        int posIniTemp = size-in.length();
        for(int i=0;i<in.length();i++){
            temp[posIniTemp]=in.charAt(i);
            posIniTemp++;
        }            
        return new String(temp);
    }
    return "";
}
2 голосов
/ 11 мая 2011

Это работает:

"".format("%1$-" + 9 + "s", "XXX").replaceAll(" ", "0")

Это заполнит вашу строку XXX до 9 символов пробелами. После этого все пробелы будут заменены на 0. Вы можете изменить пробелы и 0 на все, что вы хотите ...

2 голосов
/ 24 августа 2010

вы можете использовать встроенные методы 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 голосов
/ 11 августа 2016

Позвольте мне оставить ответ для некоторых случаев, когда вам нужно задать левый / правый отступ (или строку префикса / суффикса, или пробелы), прежде чем объединять другую строку и вы не хотите проверять длину или любое условие if. 1001 *

То же самое к выбранному ответу, я бы предпочел StringUtils Apache Commons, но используя этот способ:

StringUtils.defaultString(StringUtils.leftPad(myString, 1))

Объясните:

  • myString: строка, которую я ввел, может быть нулевой
  • StringUtils.leftPad(myString, 1): если строка равна нулю, этот оператор также будет возвращать ноль
  • затем используйте defaultString, чтобы дать пустую строку для предотвращения конкатенации null
1 голос
/ 28 августа 2015

У многих людей есть несколько очень интересных техник, но мне нравится быть проще, поэтому я продолжаю:

public static String padRight(String s, int n, char padding){
    StringBuilder builder = new StringBuilder(s.length() + n);
    builder.append(s);
    for(int i = 0; i < n; i++){
        builder.append(padding);
    }
    return builder.toString();
}

public static String padLeft(String s, int n,  char padding) {
    StringBuilder builder = new StringBuilder(s.length() + n);
    for(int i = 0; i < n; i++){
        builder.append(Character.toString(padding));
    }
    return builder.append(s).toString();
}

public static String pad(String s, int n, char padding){
    StringBuilder pad = new StringBuilder(s.length() + n * 2);
    StringBuilder value = new StringBuilder(n);
    for(int i = 0; i < n; i++){
        pad.append(padding);
    }
    return value.append(pad).append(s).append(pad).toString();
}
1 голос
/ 24 ноября 2018

Начиная с Java 11, String.repeat (int) может использоваться для левой / правой панели заданной строки.

System.out.println("*".repeat(5)+"apple");
System.out.println("apple"+"*".repeat(5));

Выход:

*****apple
apple*****
...