Create a string with n characters

前端 未结 27 951
猫巷女王i
猫巷女王i 2020-11-28 22:12

Is there a way in java to create a string with a specified number of a specified character? In my case, I would need to create a string with 10 spaces. My current code is:

相关标签:
27条回答
  • 2020-11-28 22:53

    Hmm now that I think about it, maybe Arrays.fill:

    char[] charArray = new char[length];
    Arrays.fill(charArray, ' ');
    String str = new String(charArray);
    

    Of course, I assume that the fill method does the same thing as your code, so it will probably perform about the same, but at least this is fewer lines.

    0 讨论(0)
  • 2020-11-28 22:54

    My contribution based on the algorithm for fast exponentiation.

    /**
     * Repeats the given {@link String} n times.
     * 
     * @param str
     *            the {@link String} to repeat.
     * @param n
     *            the repetition count.
     * @throws IllegalArgumentException
     *             when the given repetition count is smaller than zero.
     * @return the given {@link String} repeated n times.
     */
    public static String repeat(String str, int n) {
        if (n < 0)
            throw new IllegalArgumentException(
                    "the given repetition count is smaller than zero!");
        else if (n == 0)
            return "";
        else if (n == 1)
            return str;
        else if (n % 2 == 0) {
            String s = repeat(str, n / 2);
            return s.concat(s);
        } else
            return str.concat(repeat(str, n - 1));
    }
    

    I tested the algorithm against two other approaches:

    • Regular for loop using String.concat() to concatenate string
    • Regular for loop using a StringBuilder

    Test code (concatenation using a for loop and String.concat() becomes to slow for large n, so I left it out after the 5th iteration).

    /**
     * Test the string concatenation operation.
     * 
     * @param args
     */
    public static void main(String[] args) {
        long startTime;
        String str = " ";
    
        int n = 1;
        for (int j = 0; j < 9; ++j) {
            n *= 10;
            System.out.format("Performing test with n=%d\n", n);
    
            startTime = System.currentTimeMillis();
            StringUtil.repeat(str, n);
            System.out
                    .format("\tStringUtil.repeat() concatenation performed in    %d milliseconds\n",
                            System.currentTimeMillis() - startTime);
    
            if (j <5) {
                startTime = System.currentTimeMillis();
                String string = "";
                for (int i = 0; i < n; ++i)
                    string = string.concat(str);
                System.out
                        .format("\tString.concat() concatenation performed in        %d milliseconds\n",
                                System.currentTimeMillis() - startTime);
            } else
                System.out
                        .format("\tString.concat() concatenation performed in        x milliseconds\n");
            startTime = System.currentTimeMillis();
            StringBuilder b = new StringBuilder();
            for (int i = 0; i < n; ++i)
                b.append(str);
            b.toString();
            System.out
                    .format("\tStringBuilder.append() concatenation performed in %d milliseconds\n",
                            System.currentTimeMillis() - startTime);
        }
    }
    

    Results:

    Performing test with n=10
        StringUtil.repeat() concatenation performed in    0 milliseconds
        String.concat() concatenation performed in        0 milliseconds
        StringBuilder.append() concatenation performed in 0 milliseconds
    Performing test with n=100
        StringUtil.repeat() concatenation performed in    0 milliseconds
        String.concat() concatenation performed in        1 milliseconds
        StringBuilder.append() concatenation performed in 0 milliseconds
    Performing test with n=1000
        StringUtil.repeat() concatenation performed in    0 milliseconds
        String.concat() concatenation performed in        1 milliseconds
        StringBuilder.append() concatenation performed in 1 milliseconds
    Performing test with n=10000
        StringUtil.repeat() concatenation performed in    0 milliseconds
        String.concat() concatenation performed in        43 milliseconds
        StringBuilder.append() concatenation performed in 5 milliseconds
    Performing test with n=100000
        StringUtil.repeat() concatenation performed in    0 milliseconds
        String.concat() concatenation performed in        1579 milliseconds
        StringBuilder.append() concatenation performed in 1 milliseconds
    Performing test with n=1000000
        StringUtil.repeat() concatenation performed in    0 milliseconds
        String.concat() concatenation performed in        x milliseconds
        StringBuilder.append() concatenation performed in 10 milliseconds
    Performing test with n=10000000
        StringUtil.repeat() concatenation performed in    7 milliseconds
        String.concat() concatenation performed in        x milliseconds
        StringBuilder.append() concatenation performed in 112 milliseconds
    Performing test with n=100000000
        StringUtil.repeat() concatenation performed in    80 milliseconds
        String.concat() concatenation performed in        x milliseconds
        StringBuilder.append() concatenation performed in 1107 milliseconds
    Performing test with n=1000000000
        StringUtil.repeat() concatenation performed in    1372 milliseconds
        String.concat() concatenation performed in        x milliseconds
        StringBuilder.append() concatenation performed in 12125 milliseconds
    

    Conclusion:

    • For large n - use the recursive approach
    • For small n - for loop has sufficient speed
    0 讨论(0)
  • 2020-11-28 22:54

    RandomStringUtils has a provision to create a string from given input size. Cant comment on the speed, but its a one liner.

    RandomStringUtils.random(5,"\t");
    

    creates an output

    \t\t\t\t\t

    preferable if you dont want to see \0 in your code.

    0 讨论(0)
  • 2020-11-28 22:55

    You can use standard String.format function for generate N spaces. For example:

    String.format("%5c", ' ');
    

    Makes a string with 5 spaces.

    or

    int count = 15;
    String fifteenSpacebars = String.format("%" + count + "c", ' ');
    

    Makes a string of 15 spacebars.

    If you want another symbol to repeat, you must replace spaces with your desired symbol:

    int count = 7;
    char mySymbol = '#';
    System.out.println(String.format("%" + count + "c", ' ').replaceAll("\\ ", "\\" + mySymbol));
    

    Output:

    #######
    
    0 讨论(0)
  • 2020-11-28 22:55

    I know of no built-in method for what you're asking about. However, for a small fixed length like 10, your method should be plenty fast.

    0 讨论(0)
  • 2020-11-28 22:56

    The shortest solution with Guava:

    Strings.repeat(" ", len)
    

    Via Simple way to repeat a String in java.

    0 讨论(0)
提交回复
热议问题