Create a string with n characters

前端 未结 27 1114
猫巷女王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: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

提交回复
热议问题