有一些简单的方法来填充字符串在Java?
似乎是一些应该在一些stringutil类API,但我找不到任何东西,这样做。
有一些简单的方法来填充字符串在Java?
似乎是一些应该在一些stringutil类API,但我找不到任何东西,这样做。
当前回答
所有的字符串操作通常都需要非常高效——特别是当你处理大数据集的时候。我想要的东西是快速和灵活的,类似于你将在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()调用的,结果可以用new String((char[])result)转换为String。这样做的原因是,如果你应用多个操作,你可以在char[]上完成它们,而不需要在格式之间进行转换——在幕后,字符串存储为char[]。如果这些操作包含在String类本身中,那么效率将提高一倍——速度和内存方面。
其他回答
另一种利用递归的解决方案。
这与所有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);
}
}
注意:这个解决方案将附加填充,与一个小调整,你可以前缀填充值。
概括一下Eko的答案(Java 11+):
public class StringUtils {
public static String padLeft(String s, char fill, int padSize) {
if (padSize < 0) {
var err = "padSize must be >= 0 (was " + padSize + ")";
throw new java.lang.IllegalArgumentException(err);
}
int repeats = Math.max(0, padSize - s.length());
return Character.toString(fill).repeat(repeats) + s;
}
public static String padRight(String s, char fill, int padSize) {
if (padSize < 0) {
var err = "padSize must be >= 0 (was " + padSize + ")";
throw new java.lang.IllegalArgumentException(err);
}
int repeats = Math.max(0, padSize - s.length());
return s + Character.toString(fill).repeat(repeats);
}
public static void main(String[] args) {
System.out.println(padLeft("", 'x', 5)); // => xxxxx
System.out.println(padLeft("1", 'x', 5)); // => xxxx1
System.out.println(padLeft("12", 'x', 5)); // => xxx12
System.out.println(padLeft("123", 'x', 5)); // => xx123
System.out.println(padLeft("1234", 'x', 5)); // => x1234
System.out.println(padLeft("12345", 'x', 5)); // => 12345
System.out.println(padLeft("123456", 'x', 5)); // => 123456
System.out.println(padRight("", 'x', 5)); // => xxxxx
System.out.println(padRight("1", 'x', 5)); // => 1xxxx
System.out.println(padRight("12", 'x', 5)); // => 12xxx
System.out.println(padRight("123", 'x', 5)); // => 123xx
System.out.println(padRight("1234", 'x', 5)); // => 1234x
System.out.println(padRight("12345", 'x', 5)); // => 12345
System.out.println(padRight("123456", 'x', 5)); // => 123456
System.out.println(padRight("1", 'x', -1)); // => throws
}
}
在Dzone上找到的
用零填充:
String.format("|%020d|", 93); // prints: |00000000000000000093|
从Java 11开始,string. repeat(int)可以用来左右填充给定的字符串。
System.out.println("*".repeat(5)+"apple");
System.out.println("apple"+"*".repeat(5));
输出:
*****apple
apple*****
看看org.apache.commons.lang.StringUtils#rightPad(String str, int size, char padChar)。
但算法非常简单(填充到字符大小):
public String pad(String str, int size, char padChar)
{
StringBuilder padded = new StringBuilder(str);
while (padded.length() < size)
{
padded.append(padChar);
}
return padded.toString();
}