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

时间:2009-11-26 10:38:34

标签: 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);
}

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

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

17 个答案:

答案 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)

使用Google Guava

的解决方案
String filled = Strings.repeat("*", 10);

答案 6 :(得分:5)

在Java 11中,您有repeat

String s = " ";
s = s.repeat(1);

(虽然在编写still subject to change时)

答案 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[]还是StringBufferStringBuilder。来自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)

设置长度检查以防止无限循环也是一个好主意。