Java - 创建一个具有指定长度并填充特定字符的新String实例.最佳方案?

Ste*_*iks 79 java string

我确实检查了其他问题; 这个问题的重点是以最有效的方式解决这个特定问题.

有时您希望创建一个具有指定长度的新字符串,并使用填充整个字符串的默认字符.

也就是说,如果你可以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);
}
Run Code Online (Sandbox Code Playgroud)

它仍然没有任何检查(即,当长度为0时,它将不起作用).我首先构造数组,因为我相信它比使用字符串连接或使用StringBuffer更快.

其他人有更好的解决方案吗?

Rom*_*las 100

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

StringUtils.leftPad("foobar", 10, '*'); // Returns "****foobar"
Run Code Online (Sandbox Code Playgroud)

  • 或者使用repeat(),它在开始时不需要空字符串,并且意图更明确(参见我的回答) (9认同)
  • +1 - 这正是他所寻找的(又名'酷').对于完全相同的行为,但显而易见的是:`StringUtils.leftPad("",10,'*');` (3认同)
  • +1很好的解决方案,虽然我不会为我的项目添加一个jar. (3认同)

Cow*_*wan 92

Apache Commons Lang(可能非常有用,可以在任何非平凡项目的类路径上)具有StringUtils.repeat():

String filled = StringUtils.repeat("*", 10);
Run Code Online (Sandbox Code Playgroud)

简单!

  • 这是最好的答案.目前的最佳答案是以一种不直观的方式使用leftpad来做一些它本不打算做的事情,这使得更难理解应该发生什么.这个答案自文件更好. (4认同)
  • 这应该是topvoted答案.谢谢 ;) (3认同)

unw*_*ind 56

无需执行循环,只使用标准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 "";
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我还为length == 0案例添加了合适的代码.

  • 也许,但1)它可能更快,2)你不需要写的代码. (4认同)

kwa*_*nke 33

一些可能的解决方

这将创建一个填充长度为'0'的字符串,然后用charToFill(旧学校)替换'0'.

String s = String.format("%0" + length + "d", 0).replace('0', charToFill);
Run Code Online (Sandbox Code Playgroud)

这将创建一个List,其中包含使用charToFill的长度字符串,然后将List连接到String中.

String s = String.join("", Collections.nCopies(length, String.valueOf(charToFill)));
Run Code Online (Sandbox Code Playgroud)

这将使用charToFill创建带有字符串的无限java8 Stream,将输出限制为length并使用String joiner(新学校)收集结果.

String s = Stream.generate(() -> String.valueOf(charToFill)).limit(length).collect(Collectors.joining());
Run Code Online (Sandbox Code Playgroud)


Pav*_*esa 17

char[] chars = new char[10];
Arrays.fill(chars, '*');
String text = new String(chars);
Run Code Online (Sandbox Code Playgroud)


jav*_*vaj 6

使用Google Guava的解决方案

String filled = Strings.repeat("*", 10);
Run Code Online (Sandbox Code Playgroud)


Pat*_*man 6

在Java 11中,您具有repeat

String s = " ";
s = s.repeat(1);
Run Code Online (Sandbox Code Playgroud)

(尽管在撰写本文时仍可能更改

  • 也可以一行完成。字符串 s = "*".repeat(10); (5认同)
  • 这应该是新的最佳答案。 (2认同)

Ale*_*huk 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();
}
Run Code Online (Sandbox Code Playgroud)

怎么了?


Kar*_*arl 5

为了提高性能,如果您知道最大长度,则可以使用单个预定义的sting:

String template ="#####################################";

然后在知道长度后简单地执行子串.

  • +1:我刚读到另一篇文章,substring创建一个String,它只使用原始String的相同char [].所以这是一个O(1)操作(没有循环),它节省了内存(如果这是一个真正的问题) (2认同)