我确实检查了其他问题;这个问题的重点是以最有效的方式解决这个特定问题。
有时您想要创建一个具有指定长度的新字符串,并使用填充整个字符串的默认字符。
即如果你能做new String(10, '*')
并从那里创建一个新的字符串会很酷,长度为10个字符都有*。
因为这样的构造函数不存在,并且您无法从String扩展,所以您要么创建一个包装类或一个方法来为您执行此操作。
此刻我正在使用它:
protected String getStringWithLengthAndFilledWithCharacter(int length, char charToFill) {
char[] array = new char[length];
int pos = 0;
while (pos < length) {
array[pos] = charToFill;
pos++;
}
return new String(array);
}
它仍然没有任何检查(即,当长度为0时,它将不起作用)。我首先构造数组,因为我相信它比使用字符串连接或使用StringBuffer更快。
其他人有更好的解决方案吗?
答案 0 :(得分:100)
只需使用apache commons lang项目中的StringUtils类。您有leftPad方法:
StringUtils.leftPad("foobar", 10, '*'); // Returns "****foobar"
答案 1 :(得分:85)
Apache Commons Lang(可能非常适用于任何非平凡项目的类路径)StringUtils.repeat():
String filled = StringUtils.repeat("*", 10);
容易!
答案 2 :(得分:55)
无需执行循环,只使用标准Java库类:
protected String getStringWithLengthAndFilledWithCharacter(int length, char charToFill) {
if (length > 0) {
char[] array = new char[length];
Arrays.fill(array, charToFill);
return new String(array);
}
return "";
}
如您所见,我还为length == 0
案例添加了合适的代码。
答案 3 :(得分:32)
一些可能的解决方案。
这会创建一个长度为&#39; 0&#39;的字符串。填写并替换然后&#39; 0&#39;与charToFill(旧学校)。
String s = String.format("%0" + length + "d", 0).replace('0', charToFill);
这将创建一个List,其中包含使用charToFill的长度字符串,然后将List连接到字符串中。
String s = String.join("", Collections.nCopies(length, String.valueOf(charToFill)));
使用charToFill创建带有字符串的无限java8 Stream,将输出限制为length并使用String joiner(新学校)收集结果。
String s = Stream.generate(() -> String.valueOf(charToFill)).limit(length).collect(Collectors.joining());
答案 4 :(得分:17)
char[] chars = new char[10];
Arrays.fill(chars, '*');
String text = new String(chars);
答案 5 :(得分:6)
String filled = Strings.repeat("*", 10);
答案 6 :(得分:5)
答案 7 :(得分:5)
为了提高性能,如果您知道最大长度,则可以使用一个预定义的sting:
String template =“####################################”;
然后只要知道长度就执行子字符串。
答案 8 :(得分:5)
public static String fillString(int count,char c) {
StringBuilder sb = new StringBuilder( count );
for( int i=0; i<count; i++ ) {
sb.append( c );
}
return sb.toString();
}
有什么问题?
答案 9 :(得分:4)
使用Dollar很简单:
String filled = $("=").repeat(10).toString(); // produces "=========="
答案 10 :(得分:4)
以上情况很好。你介意我问你一个问题 - 这会导致你出问题吗?在您知道是否需要之前,它会对您进行优化。
现在我的过度设计的解决方案。在许多(不是全部)情况下,您可以使用CharSequence而不是String。
public class OneCharSequence implements CharSequence {
private final char value;
private final int length;
public OneCharSequence(final char value, final int length) {
this.value = value;
this.length = length;
}
public char charAt(int index) {
if(index < length) return value;
throw new IndexOutOfBoundsException();
}
public int length() {
return length;
}
public CharSequence subSequence(int start, int end) {
return new OneCharSequence(value, (end-start));
}
public String toString() {
char[] array = new char[length];
Arrays.fill(array, value);
return new String(array);
}
}
答案 11 :(得分:4)
使用Google Guava的解决方案,因为我更喜欢Apache Commons-Lang:
/**
* Returns a String with exactly the given length composed entirely of
* the given character.
* @param length the length of the returned string
* @param c the character to fill the String with
*/
public static String stringOfLength(final int length, final char c)
{
return Strings.padEnd("", length, c);
}
答案 12 :(得分:2)
一个额外的注意事项:创建新String
实例的所有公开方式似乎都涉及您正在使用的任何缓冲区的副本,无论是char[]
还是StringBuffer
或StringBuilder
。来自String
javadoc(并在其他类的相应toString
方法中重复):
复制字符数组的内容;随后的修改 字符数组不会影响 新创建的字符串。
因此,在“快速填充”数组之后,你最终会有一个可能很大的内存复制操作。可以避免此问题的唯一解决方案是来自@mlk的解决方案,如果您可以管理直接使用建议的CharSequence
实现(可能是这种情况)。
PS:我会将此作为评论发布,但我还没有足够的声誉。
答案 13 :(得分:1)
尝试使用substring(int start,int end);方法
String myLongString = "abcdefghij";
if (myLongString .length() >= 10)
String shortStr = myLongString.substring(0, 5)+ "...";
这将返回abcde。
答案 14 :(得分:1)
Mi解决方案:
pw = "1321";
if (pw.length() < 16){
for(int x = pw.length() ; x < 16 ; x++){
pw += "*";
}
}
输出:
1321************
答案 15 :(得分:0)
试试这个职业
String stringy =null;
byte[] buffer = new byte[100000];
for (int i = 0; i < buffer.length; i++) {
buffer[i] =0;
}
stringy =StringUtils.toAsciiString(buffer);
答案 16 :(得分:0)
你可以像这样使用while循环:
String text = "Hello";
while (text.length() < 10) { text += "*"; }
System.out.println(text);
会给你:
Hello*****
或者使用自定义方法获得相同的结果:
public static String extendString(String text, String symbol, Integer len) {
while (text.length() < len) { text += symbol; }
return text;
}
然后打电话:
extendString("Hello", "*", 10)
设置长度检查以防止无限循环也是一个好主意。