Simple way to repeat a string

后端 未结 30 3020
清酒与你
清酒与你 2020-11-21 06:55

I\'m looking for a simple commons method or operator that allows me to repeat some string n times. I know I could write this using a for loop, but I wish to avoid f

相关标签:
30条回答
  • 2020-11-21 06:58

    Try this out:

    public static char[] myABCs = {'a', 'b', 'c'};
    public static int numInput;
    static Scanner in = new Scanner(System.in);
    
    public static void main(String[] args) {
        System.out.print("Enter Number of Times to repeat: ");
        numInput = in.nextInt();
        repeatArray(numInput);
    }
    
    public static int repeatArray(int y) {
        for (int a = 0; a < y; a++) {
            for (int b = 0; b < myABCs.length; b++) {
                System.out.print(myABCs[b]);                
            }
            System.out.print(" ");
        }
        return y;
    }
    
    0 讨论(0)
  • 2020-11-21 06:58

    here is the latest Stringutils.java StringUtils.java

        public static String repeat(String str, int repeat) {
        // Performance tuned for 2.0 (JDK1.4)
    
        if (str == null) {
            return null;
        }
        if (repeat <= 0) {
            return EMPTY;
        }
        int inputLength = str.length();
        if (repeat == 1 || inputLength == 0) {
            return str;
        }
        if (inputLength == 1 && repeat <= PAD_LIMIT) {
            return repeat(str.charAt(0), repeat);
        }
    
        int outputLength = inputLength * repeat;
        switch (inputLength) {
            case 1 :
                return repeat(str.charAt(0), repeat);
            case 2 :
                char ch0 = str.charAt(0);
                char ch1 = str.charAt(1);
                char[] output2 = new char[outputLength];
                for (int i = repeat * 2 - 2; i >= 0; i--, i--) {
                    output2[i] = ch0;
                    output2[i + 1] = ch1;
                }
                return new String(output2);
            default :
                StringBuilder buf = new StringBuilder(outputLength);
                for (int i = 0; i < repeat; i++) {
                    buf.append(str);
                }
                return buf.toString();
        }
        }
    

    it doesn't even need to be this big, can be made into this, and can be copied and pasted into a utility class in your project.

        public static String repeat(String str, int num) {
        int len = num * str.length();
        StringBuilder sb = new StringBuilder(len);
        for (int i = 0; i < times; i++) {
            sb.append(str);
        }
        return sb.toString();
        }
    

    So e5, I think the best way to do this would be to simply use the above mentioned code,or any of the answers here. but commons lang is just too big if it's a small project

    0 讨论(0)
  • 2020-11-21 06:59

    OOP Solution

    Nearly every answer proposes a static function as a solution, but thinking Object-Oriented (for reusability-purposes and clarity) I came up with a Solution via Delegation through the CharSequence-Interface (which also opens up usability on mutable CharSequence-Classes).

    The following Class can be used either with or without Separator-String/CharSequence and each call to "toString()" builds the final repeated String. The Input/Separator are not only limited to String-Class, but can be every Class which implements CharSequence (e.g. StringBuilder, StringBuffer, etc)!

    Source-Code:

    /**
     * Helper-Class for Repeating Strings and other CharSequence-Implementations
     * @author Maciej Schuttkowski
     */
    public class RepeatingCharSequence implements CharSequence {
        final int count;
        CharSequence internalCharSeq = "";
        CharSequence separator = "";
        /**
         * CONSTRUCTOR - RepeatingCharSequence
         * @param input CharSequence to repeat
         * @param count Repeat-Count
         */
        public RepeatingCharSequence(CharSequence input, int count) {
            if(count < 0)
                throw new IllegalArgumentException("Can not repeat String \""+input+"\" less than 0 times! count="+count);
            if(count > 0)
                internalCharSeq = input;
            this.count = count;
        }
        /**
         * CONSTRUCTOR - Strings.RepeatingCharSequence
         * @param input CharSequence to repeat
         * @param count Repeat-Count
         * @param separator Separator-Sequence to use
         */
        public RepeatingCharSequence(CharSequence input, int count, CharSequence separator) {
            this(input, count);
            this.separator = separator;
        }
    
        @Override
        public CharSequence subSequence(int start, int end) {
            checkBounds(start);
            checkBounds(end);
            int subLen = end - start;
            if (subLen < 0) {
                throw new IndexOutOfBoundsException("Illegal subSequence-Length: "+subLen);
            }
            return (start == 0 && end == length()) ? this
                        : toString().substring(start, subLen);
        }
        @Override
        public int length() {
            //We return the total length of our CharSequences with the separator 1 time less than amount of repeats:
            return count < 1 ? 0
                    : ( (internalCharSeq.length()*count) + (separator.length()*(count-1)));
        }
        @Override
        public char charAt(int index) {
            final int internalIndex = internalIndex(index);
            //Delegate to Separator-CharSequence or Input-CharSequence depending on internal index:
            if(internalIndex > internalCharSeq.length()-1) {
                return separator.charAt(internalIndex-internalCharSeq.length());
            }
            return internalCharSeq.charAt(internalIndex);
        }
        @Override
        public String toString() {
            return count < 1 ? ""
                    : new StringBuilder(this).toString();
        }
    
        private void checkBounds(int index) {
            if(index < 0 || index >= length())
                throw new IndexOutOfBoundsException("Index out of Bounds: "+index);
        }
        private int internalIndex(int index) {
            // We need to add 1 Separator-Length to total length before dividing,
            // as we subtracted one Separator-Length in "length()"
            return index % ((length()+separator.length())/count);
        }
    }
    

    Usage-Example:

    public static void main(String[] args) {
        //String input = "12345";
        //StringBuffer input = new StringBuffer("12345");
        StringBuilder input = new StringBuilder("123");
        //String separator = "<=>";
        StringBuilder separator = new StringBuilder("<=");//.append('>');
        int repeatCount = 2;
    
        CharSequence repSeq = new RepeatingCharSequence(input, repeatCount, separator);
        String repStr = repSeq.toString();
    
        System.out.println("Repeat="+repeatCount+"\tSeparator="+separator+"\tInput="+input+"\tLength="+input.length());
        System.out.println("CharSeq:\tLength="+repSeq.length()+"\tVal="+repSeq);
        System.out.println("String :\tLength="+repStr.length()+"\tVal="+repStr);
    
        //Here comes the Magic with a StringBuilder as Input, as you can append to the String-Builder
        //and at the same Time your Repeating-Sequence's toString()-Method returns the updated String :)
        input.append("ff");
        System.out.println(repSeq);
        //Same can be done with the Separator:
        separator.append("===").append('>');
        System.out.println(repSeq);
    }
    

    Example-Output:

    Repeat=2    Separator=<=    Input=123   Length=3
    CharSeq:    Length=8    Val=123<=123
    String :    Length=8    Val=123<=123
    123ff<=123ff
    123ff<====>123ff
    
    0 讨论(0)
  • 2020-11-21 06:59

    Using recursion, you can do the following (using ternary operators, one line max):

    public static final String repeat(String string, long number) {
        return number == 1 ? string : (number % 2 == 0 ? repeat(string + string, number / 2) : string + repeat(string + string, (number - 1) / 2));
    }
    

    I know, it's ugly and probably not efficient, but it's one line!

    0 讨论(0)
  • 2020-11-21 07:00

    With java-8, you can also use Stream.generate.

    import static java.util.stream.Collectors.joining;
    ...
    String repeated = Stream.generate(() -> "abc").limit(3).collect(joining()); //"abcabcabc"
    

    and you can wrap it in a simple utility method if needed:

    public static String repeat(String str, int times) {
       return Stream.generate(() -> str).limit(times).collect(joining());
    }
    
    0 讨论(0)
  • 2020-11-21 07:00

    I really enjoy this question. There is a lot of knowledge and styles. So I can't leave it without show my rock and roll ;)

    {
        String string = repeat("1234567890", 4);
        System.out.println(string);
        System.out.println("=======");
        repeatWithoutCopySample(string, 100000);
        System.out.println(string);// This take time, try it without printing
        System.out.println(string.length());
    }
    
    /**
     * The core of the task.
     */
    @SuppressWarnings("AssignmentToMethodParameter")
    public static char[] repeat(char[] sample, int times) {
        char[] r = new char[sample.length * times];
        while (--times > -1) {
            System.arraycopy(sample, 0, r, times * sample.length, sample.length);
        }
        return r;
    }
    
    /**
     * Java classic style.
     */
    public static String repeat(String sample, int times) {
        return new String(repeat(sample.toCharArray(), times));
    }
    
    /**
     * Java extreme memory style.
     */
    @SuppressWarnings("UseSpecificCatch")
    public static void repeatWithoutCopySample(String sample, int times) {
        try {
            Field valueStringField = String.class.getDeclaredField("value");
            valueStringField.setAccessible(true);
            valueStringField.set(sample, repeat((char[]) valueStringField.get(sample), times));
        } catch (Exception ex) {
            throw new RuntimeException(ex);
        }
    }
    

    Do you like it?

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