Есть ли эквивалент Java 8 для Python .ljust () и .rjust () [duplicate]

Примером этого исключаемого исключения является: Когда вы пытаетесь проверить что-то, это null.

Например:

string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)

if (testString.Length == 0) // Throws a nullreferenceexception
{
    //Do something
} 

Время выполнения .NET исключение NullReferenceException при попытке выполнить действие над чем-то, что не было инстанцировано, т.е. код выше.

По сравнению с ArgumentNullException, которое обычно выбрано как защитная мера, если метод ожидает, что то, что происходит

Дополнительная информация находится в C # NullReferenceException и Null Parameter .

347
задан Jason Plank 21 September 2011 в 18:20
поделиться

23 ответа

Apache StringUtils имеет несколько методов: leftPad , rightPad , center и repeat .

Но учтите, что, как другие упомянули и продемонстрировали в , этот ответ - String.format() и Formatter классы в JDK - лучшие варианты. Используйте их по коду сообщества.

145
ответ дан Lonely Neuron 27 August 2018 в 17:48
поделиться

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

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();
}
0
ответ дан Aelphaeis 27 August 2018 в 17:48
поделиться

Взгляните на 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 27 August 2018 в 17:48
поделиться

Так как Java 1.5, String.format() можно использовать для ввода / правого ввода данной строки.

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

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

...

public static void main(String args[]) throws Exception {
 System.out.println(padRight("Howto", 20) + "*");
 System.out.println(padLeft("Howto", 20) + "*");
}
/*
  output :
     Howto               *
                    Howto*
*/
539
ответ дан Basil Bourque 27 August 2018 в 17:48
поделиться

Простым решением без API будет следующее:

public String pad(String num, int len){
    if(len-num.length() <=0) return num;
    StringBuffer sb = new StringBuffer();
    for(i=0; i<(len-num.length()); i++){
        sb.append("0");
    }
    sb.append(num);
    return sb.toString();
}
14
ответ дан bluish 27 August 2018 в 17:48
поделиться

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

public static String pad(String str, int size, char padChar)
{
    if (str.length() < size)
    {
        char[] temp = new char[size];
        int i = 0;

        while (i < str.length())
        {
            temp[i] = str.charAt(i);
            i++;
        }

        while (i < size)
        {
            temp[i] = padChar;
            i++;
        }

        str = new String(temp);
    }

    return str;
}

решение форматера не является оптимальным. просто построение строки формата создает две новые строки.

Решение apache можно улучшить, инициализируя sb с целевым размером, заменяя ниже

StringBuffer padded = new StringBuffer(str); 

на

StringBuffer padded = new StringBuffer(pad); 
padded.append(value);

будет препятствовать росту внутреннего буфера sb.

6
ответ дан ck. 27 August 2018 в 17:48
поделиться

Все операции с строкой обычно должны быть очень эффективными - особенно если вы работаете с большими наборами данных. Я хотел что-то быстрое и гибкое, похожее на то, что вы получите в команде plsql pad. Кроме того, я не хочу включать огромную библиотеку только для одной маленькой вещи. С этими соображениями ни одно из этих решений не было удовлетворительным. Это решения, которые я придумал, и у вас были лучшие результаты оценки, если кто-то может его улучшить, добавьте свой комментарий.

public static char[] lpad(char[] pStringChar, int pTotalLength, char pPad) {
    if (pStringChar.length < pTotalLength) {
        char[] retChar = new char[pTotalLength];
        int padIdx = pTotalLength - pStringChar.length;
        Arrays.fill(retChar, 0, padIdx, pPad);
        System.arraycopy(pStringChar, 0, retChar, padIdx, pStringChar.length);
        return retChar;
    } else {
        return pStringChar;
    }
}
  • Обратите внимание, что он вызывается с помощью String. toCharArray (), и результат может быть преобразован в String с новым результатом String ((char [])). Причина этого заключается в том, что если вы применяете несколько операций, вы можете сделать их все на char [] и не продолжать конвертировать между форматами - за кулисами, String хранится как char []. Если эти операции были включены в класс String, это было бы в два раза эффективнее - скорость и память.
0
ответ дан EarlB 27 August 2018 в 17:48
поделиться

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

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
ответ дан ef_oren 27 August 2018 в 17:48
поделиться

В Guava это легко:

Strings.padStart("string", 10, ' ');
Strings.padEnd("string", 10, ' ');
83
ответ дан Garrett Hall 27 August 2018 в 17:48
поделиться

Простое решение:

package nl;
public class Padder {
    public static void main(String[] args) {
        String s = "123" ;
        System.out.println("#"+("     " + s).substring(s.length())+"#");
    }
}
-1
ответ дан Hans Andeweg 27 August 2018 в 17:48
поделиться

Вот еще один способ прокрутки вправо:

// 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-------";
5
ответ дан Jason Plank 27 August 2018 в 17:48
поделиться

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

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 27 August 2018 в 17:48
поделиться

Java oneliners, нет причудливой библиотеки.

// 6 characters padding example
String pad = "******";
// testcases for 0, 4, 8 characters
String input = "" | "abcd" | "abcdefgh"

Pad Влево, не ограничивайте

result = pad.substring(Math.min(input.length(),pad.length())) + input;
results: "******" | "**abcd" | "abcdefgh"

Пэд Вправо, не ограничивайте

result = input + pad.substring(Math.min(input.length(),pad.length()));
results: "******" | "abcd**" | "abcdefgh"

Пэд Влево, длина

result = (pad + input).substring(input.length(), input.length() + pad.length());
results: "******" | "**abcd" | "cdefgh"

Правая панель, ограничение длины прокладки

result = (input + pad).substring(0, pad.length());
results: "******" | "abcd**" | "abcdef"
226
ответ дан leo 27 August 2018 в 17:48
поделиться

Что-то простое:

Значение должно быть строкой. преобразуйте его в строку, если это не так. Как "" + 123 или Integer.toString(123)

// let's assume value holds the String we want to pad
String value = "123";

Подстрока начинается с символа длины длины значения до конца длины:

String padded="00000000".substring(value.length()) + value;

// now padded is "00000123"

Точнее

правая кнопка:

String padded = value + ("ABCDEFGH".substring(value.length())); 

// now padded is "123DEFGH"

накладка слева:

String padString = "ABCDEFGH";
String padded = (padString.substring(0, padString.length() - value.length())) + value;

// now padded is "ABCDE123"
29
ответ дан m02ph3u5 27 August 2018 в 17:48
поделиться
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
ответ дан Marlon Tarax 27 August 2018 в 17:48
поделиться

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

21
ответ дан Miserable Variable 27 August 2018 в 17:48
поделиться
Ответы

@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 
1
ответ дан ndm13 27 August 2018 в 17:48
поделиться

Мне потребовалось немного времени, чтобы разобраться. Настоящим ключом является чтение документации Formatter.

// Get your data from wherever.
final byte[] data = getData();
// Get the digest engine.
final MessageDigest md5= MessageDigest.getInstance("MD5");
// Send your data through it.
md5.update(data);
// Parse the data as a positive BigInteger.
final BigInteger digest = new BigInteger(1,md5.digest());
// Pad the digest with blanks, 32 wide.
String hex = String.format(
    // See: http://download.oracle.com/javase/1.5.0/docs/api/java/util/Formatter.html
    // Format: %[argument_index$][flags][width]conversion
    // Conversion: 'x', 'X'  integral    The result is formatted as a hexadecimal integer
    "%1$32x",
    digest
);
// Replace the blank padding with 0s.
hex = hex.replace(" ","0");
System.out.println(hex);
7
ответ дан Nthalk 27 August 2018 в 17:48
поделиться

Найден это на Dzone

Пэд с нулями:

String.format("|%020d|", 93); // prints: |00000000000000000093|
2
ответ дан OJVM 27 August 2018 в 17:48
поделиться

Использовать эту функцию.

private String leftPadding(String word, int length, char ch) {
   return (length > word.length()) ? leftPadding(ch + word, length, ch) : word;
}

как использовать?

leftPadding(month, 2, '0');

выход: 01 02 03 04 .. 11 12

0
ответ дан Samet öztoprak 27 August 2018 в 17:48
поделиться

Как это

String является «hello», а требуемое заполнение - 15 с «0» левой панелью

String ax="Hello";
while(ax.length() < 15) ax="0"+ax;
-2
ответ дан Satwant 27 August 2018 в 17:48
поделиться

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

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

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

2
ответ дан Sebastian S. 27 August 2018 в 17:48
поделиться

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

[Я забыл детали и сделал это сообщение «wiki сообщества», поскольку это не то, что у меня есть потребность в.]

1
ответ дан Tom Hawtin - tackline 27 August 2018 в 17:48
поделиться
Другие вопросы по тегам:

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