Java – 创build一个具有指定长度的新string实例,并填充特定的字符。 最佳解决scheme

我确实检查了其他问题; 这个问题的重点是解决这个问题最有效的方法。

有时候你想创build一个具有指定长度的新string,并且用一个缺省字符填充整个string。

也就是说,如果你可以做new String(10, '*')并且从那里创build一个新的String,那么这将是很酷的,长度为10个字符都有一个*。

由于这样的构造函数不存在,并且不能从string扩展,所以要创build一个包装类或方法来为你做这件事。

在这一刻我正在使用这个:

 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时,它将不起作用)。 我首先构造数组是因为我相信它比使用string连接或使用StringBuffer更快。

其他人有更好的溶剂?

只需使用apache commons lang项目中的StringUtils类即可。 你有一个leftPad方法:

 StringUtils.leftPad("foobar", 10, '*'); // Returns "****foobar" 

Apache Commons Lang(可能足以在任何非平凡项目的类path中)有StringUtils.repeat() :

 String filled = StringUtils.repeat("*", 10); 

简单!

不需要循环,只使用标准的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情况添加了合适的代码。

一些可能的解决方

这将创build一个长度为'0'的string,然后用charToFill(旧学校)replace“0”。

 String s = String.format("%0" + length + "d", 0).replace('0', charToFill); 

这将创build一个List,其中包含带charToFill的长度string,然后将列表连接到一个string。

 String s = String.join("", Collections.nCopies(length, String.valueOf(charToFill))); 

这创build了一个charToFillstring的无限的java8stream,限制输出的长度,并收集结果与string木匠(新学校)。

 String s = Stream.generate(() -> String.valueOf(charToFill)).limit(length).collect(Collectors.joining()); 
 char[] chars = new char[10]; Arrays.fill(chars, '*'); String text = new String(chars); 

使用Google Guava的解决scheme

 String filled = Strings.repeat("*", 10); 

为了提高性能,你可以有一个预定义的刺痛,如果你知道最大长度如下:

String template =“####################################”;

然后只要知道长度就简单地执行一个子串。

 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(); } 

哪里不对?

使用Google Guava的解决scheme,因为我更喜欢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); } 

使用美元很简单:

 String filled = $("=").repeat(10).toString(); // produces "==========" 

以上是好的。 如果我问你一个问题,你介意吗?这是否引起你的问题? 它接缝我,你正在优化之前,你知道如果你需要。

现在我的工程解决scheme。 在许多情况下,你可以使用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); } } 

另外需要注意的一点是:似乎创build一个新的String实例的所有公共方法都必须包含你正在使用的任何缓冲区的副本,可以是char[]StringBufferStringBuilder 。 从String javadoc(并在其他类的各自toString方法中重复):

字符数组的内容被复制; 字符数组的后续修改不会影响新创build的string。

所以在数组“快速填充”之后,你最终会有一个大的内存复制操作。 如果您可以直接使用build议的CharSequence实现(可能是这种情况)来pipe理,那么可以避免这个问题的唯一解决scheme就是@mlk。

PS:我会张贴这个评论,但我还没有足够的声誉做到这一点呢。

试试这个使用子string(int start,int end); 方法

 String myLongString = "abcdefghij"; if (myLongString .length() >= 10) String shortStr = myLongString.substring(0, 5)+ "..."; 

这将返回abcde。

Mi解决scheme:

  pw = "1321"; if (pw.length() < 16){ for(int x = pw.length() ; x < 16 ; x++){ pw += "*"; } } 

输出 :

 1321************ 

试试这个工人吧

 String stringy =null; byte[] buffer = new byte[100000]; for (int i = 0; i < buffer.length; i++) { buffer[i] =0; } stringy =StringUtils.toAsciiString(buffer);