Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重复字符串的简单方法_Java_String_Java 8 - Fatal编程技术网

Java 重复字符串的简单方法

Java 重复字符串的简单方法,java,string,java-8,Java,String,Java 8,我正在寻找一个简单的commons方法或操作符,它允许我将一些字符串重复n次。我知道我可以用for循环来写这个,但是我希望在必要的时候避免for循环,并且应该有一个简单的直接方法 String str = "abc"; String repeated = str.repeat(3); repeated.equals("abcabcabc"); 与以下内容相关: 已编辑 我尽量避免在不完全必要时使用for循环,因为: 它们增加了代码行数,即使它们被隐

我正在寻找一个简单的commons方法或操作符,它允许我将一些字符串重复n次。我知道我可以用for循环来写这个,但是我希望在必要的时候避免for循环,并且应该有一个简单的直接方法

String str = "abc";
String repeated = str.repeat(3);

repeated.equals("abcabcabc");
与以下内容相关:

已编辑

我尽量避免在不完全必要时使用for循环,因为:


  • 它们增加了代码行数,即使它们被隐藏在另一个函数中

  • 阅读我的代码的人必须弄清楚我在for循环中做了什么。即使它被注释并且有有有意义的变量名,他们仍然必须确保它没有做任何“聪明”的事情

  • 程序员喜欢把聪明的东西放进循环中,即使我写它是为了“只做它想做的事”,但这并不妨碍有人来添加一些额外的聪明的“修复”

  • 它们往往很容易出错。对于涉及索引的循环,往往会生成一个错误

  • For循环经常重用相同的变量,这增加了很难找到范围错误的机会

  • 对于循环,增加臭虫猎人必须寻找的地方的数量

  • 用法:

    String str = "abc";
    String repeated = StringUtils.repeat(str, 3);
    
    repeated.equals("abcabcabc");
    

    如果您担心性能,只需在循环中使用StringBuilder,并在循环退出时执行.toString()。见鬼,编写自己的Util类并重用它。最多5行代码。

    这包含的字符比您的问题少

    public static String repeat(String s, int n) {
        if(s == null) {
            return null;
        }
        final StringBuilder sb = new StringBuilder(s.length() * n);
        for(int i = 0; i < n; i++) {
            sb.append(s);
        }
        return sb.toString();
    }
    
    公共静态字符串重复(字符串s,int n){
    如果(s==null){
    返回null;
    }
    最终StringBuilder sb=新StringBuilder(s.长度()*n);
    对于(int i=0;i
    仅使用JRE类()和尽量减少可以编写以下内容的临时对象的数量:

    public static String repeat(String toRepeat, int times) {
        if (toRepeat == null) {
            toRepeat = "";
        }
    
        if (times < 0) {
            times = 0;
        }
    
        final int length = toRepeat.length();
        final int total = length * times;
        final char[] src = toRepeat.toCharArray();
        char[] dst = new char[total];
    
        for (int i = 0; i < total; i += length) {
            System.arraycopy(src, 0, dst, i, length);
        }
    
        return String.copyValueOf(dst);
    }
    

    但是我仍然喜欢第一个版本。

    尽管您希望不使用循环,但我认为您应该使用循环

    String repeatString(String s, int repetitions)
    {
        if(repetitions < 0) throw SomeException();
    
        else if(s == null) return null;
    
        StringBuilder stringBuilder = new StringBuilder(s.length() * repetitions);
    
        for(int i = 0; i < repetitions; i++)
            stringBuilder.append(s);
    
        return stringBuilder.toString();
    }
    
    字符串重复字符串(字符串s,整数重复)
    {
    如果(重复次数<0)抛出SomeException();
    如果(s==null),则返回null;
    StringBuilder StringBuilder=新StringBuilder(s.length()*重复);
    for(int i=0;i<重复;i++)
    stringBuilder.append;
    返回stringBuilder.toString();
    }
    
    您不使用for循环的原因不是很好。针对您的批评:

  • 无论您使用什么解决方案,几乎肯定都会比这更长。使用预先构建的功能只会将其塞进更多的盖子中
  • 阅读你的代码的人必须弄清楚你在非for循环中做了什么。考虑到for循环是实现这一点的惯用方法,如果使用for循环来实现这一点,将更容易理解
  • 是的,有人可能会添加一些聪明的东西,但是通过避免for循环,你正在做一些聪明的事情。这就像是故意朝自己的脚开枪,以避免意外地朝自己的脚开枪
  • 一个接一个的错误也很容易被一次测试抓住。考虑到您应该测试代码,逐个错误应该很容易修复和捕获。值得注意的是:上面的代码不包含off-by-one错误。For循环同样容易正确
  • 所以不要重用变量。这不是for循环的错
  • 同样,你使用的任何解决方案也是如此。正如我之前提到的;bug搜寻者可能希望您使用for循环来完成这项工作,因此如果您使用for循环,他们将更容易找到它

  • 所以你想避免循环

    给你:

    public static String repeat(String s, int times) {
        if (times <= 0) return "";
        else return s + repeat(s, times-1);
    }
    
    编辑:让我们稍微优化一下:-D

    public static String repeat(String s, int times) {
       if (times <= 0) return "";
       else if (times % 2 == 0) return repeat(s+s, times/2);
       else return s + repeat(s+s, times/2);
    }
    
    公共静态字符串重复(字符串s,整数倍){
    如果(times基于,则这是一个使用StringBuilder的递归版本:

    public static void repeat(StringBuilder stringBuilder, String s, int times) {
        if (times > 0) {
            repeat(stringBuilder.append(s), s, times - 1);
        }
    }
    
    public static String repeat(String s, int times) {
        StringBuilder stringBuilder = new StringBuilder(s.length() * times);
        repeat(stringBuilder, s, times);
        return stringBuilder.toString();
    }
    
     /**
       * Repeat a String as many times you need.
       *
       * @param i - Number of Repeating the String.
       * @param s - The String wich you want repeated.
       * @return The string n - times.
       */
      public static String repeate(int i, String s) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < i; j++)
          sb.append(s);
        return sb.toString();
      }
    

    以下是一种仅使用标准字符串函数而不使用显式循环的方法:

    // create a string made up of  n  copies of  s
    repeated = String.format(String.format("%%%ds", n), " ").replace(" ",s);
    
    使用的方法很简单,只需键入:

    @Test
    public void repeatString() {
        String string = "abc";
        assertThat($(string).repeat(3).toString(), is("abcabcabc"));
    }
    

    PS:repeat也适用于数组、列表、集合等

    这里是最短的版本(Java 1.5+必需):

    其中,
    n
    是要重复字符串的次数,
    s
    是要重复的字符串


    无需导入或库。

    如果您使用的是Java这里是最新的Stringutils.Java

    publicstaticstringrepeat(stringstr,int repeat){
    //针对2.0(JDK1.4)进行性能调整
    如果(str==null){
    返回null;
    }
    
    如果(重复如果你像我一样,想使用Google Guava而不是Apache Commons,你可以在Guava Strings类中使用这个方法

    Strings.repeat("-", 60);
    

    我想要一个函数来为JDBC创建一个逗号分隔的问号列表,并找到了这篇文章。因此,我决定采用两个变体,看看哪一个性能更好。经过100万次迭代后,garden variety StringBuilder花了2秒(fun1),而神秘的本应是更优化的版本(fun2)花了30秒。再次神秘又有什么意义

    private static String fun1(int size) {
        StringBuilder sb = new StringBuilder(size * 2);
        for (int i = 0; i < size; i++) {
            sb.append(",?");
        }
        return sb.substring(1);
    }
    
    private static String fun2(int size) {
        return new String(new char[size]).replaceAll("\0", ",?").substring(1);
    }
    
    private静态字符串fun1(int-size){
    StringBuilder sb=新的StringBuilder(尺寸*2);
    对于(int i=0;i
    我真的很喜欢这个问题。有很多知识和风格。所以我不能不展示一下我的摇滚乐;)

    喜欢吗?

    公共静态字符串重复(字符串str,int次){
    
    public static String repeat(String str, int times) {
        int length = str.length();
        int size = length * times;
        char[] c = new char[size];
        for (int i = 0; i < size; i++) {
            c[i] = str.charAt(i % length);
        }
        return new String(c);
    }
    
    int length=str.length(); 整数大小=长度*倍; 字符[]c=新字符[大小]; 对于(int i=0;i
    简单循环

    public static String repeat(String string, int times) {
        StringBuilder out = new StringBuilder();
        while (times-- > 0) {
            out.append(string);
        }
        return out.toString();
    }
    
    试试这个:

    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;
    }
    
    publicstaticchar[]myABCs={'a','b','c'};
    努明普公共静态int
    
    // create a string made up of n copies of string s
    String.join("", Collections.nCopies(n, s));
    
    "abc".repeat(12);
    
    StringUtils.repeat("abc", 12);
    
    Strings.repeat("abc", 12);
    
        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();
        }
        }
    
        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();
        }
    
    Strings.repeat("-", 60);
    
    private static String fun1(int size) {
        StringBuilder sb = new StringBuilder(size * 2);
        for (int i = 0; i < size; i++) {
            sb.append(",?");
        }
        return sb.substring(1);
    }
    
    private static String fun2(int size) {
        return new String(new char[size]).replaceAll("\0", ",?").substring(1);
    }
    
    {
        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);
        }
    }
    
    public static String repeat(String str, int times) {
        int length = str.length();
        int size = length * times;
        char[] c = new char[size];
        for (int i = 0; i < size; i++) {
            c[i] = str.charAt(i % length);
        }
        return new String(c);
    }
    
    public static String repeat(String string, int times) {
        StringBuilder out = new StringBuilder();
        while (times-- > 0) {
            out.append(string);
        }
        return out.toString();
    }
    
    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;
    }
    
    // say hello 100 times
    System.out.println(String.join("", Collections.nCopies(100, "hello")));
    
    import static java.util.stream.Collectors.joining;
    ...
    String repeated = Stream.generate(() -> "abc").limit(3).collect(joining()); //"abcabcabc"
    
    public static String repeat(String str, int times) {
       return Stream.generate(() -> str).limit(times).collect(joining());
    }
    
    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));
    }
    
    /**
     * 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);
        }
    }
    
    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);
    }
    
    Repeat=2    Separator=<=    Input=123   Length=3
    CharSeq:    Length=8    Val=123<=123
    String :    Length=8    Val=123<=123
    123ff<=123ff
    123ff<====>123ff
    
    public String repeat(String str, int count) {
        return count > 0 ?  repeat(str, count -1) + str: "";
    }
    
    public String repeat(String str, int count){
        if(count <= 0) {return "";}
        return new String(new char[count]).replace("\0", str);
    }
    
    public static String repeatString(String what, int howmany) {
        char[] pattern = what.toCharArray();
        char[] res = new char[howmany * pattern.length];
        int length = pattern.length;
        for (int i = 0; i < howmany; i++)
            System.arraycopy(pattern, 0, res, i * length, length);
        return new String(res);
    }
    
    public static String repeatStringSB(String what, int howmany) {
        StringBuilder out = new StringBuilder(what.length() * howmany);
        for (int i = 0; i < howmany; i++)
            out.append(what);
        return out.toString();
    }
    
    public static void main(String... args) {
        String res;
        long time;
    
        for (int j = 0; j < 1000; j++) {
            res = repeatString("123", 100000);
            res = repeatStringSB("123", 100000);
        }
    
        time = System.nanoTime();
        res = repeatString("123", 1000000);
        time = System.nanoTime() - time;
        System.out.println("elapsed repeatString: " + time);
    
        time = System.nanoTime();
        res = repeatStringSB("123", 1000000);
        time = System.nanoTime() - time;
        System.out.println("elapsed repeatStringSB: " + time);
    
    }
    
    elapsed repeatString: 6006571
    elapsed repeatStringSB: 9064937
    
     /**
       * Repeat a String as many times you need.
       *
       * @param i - Number of Repeating the String.
       * @param s - The String wich you want repeated.
       * @return The string n - times.
       */
      public static String repeate(int i, String s) {
        StringBuilder sb = new StringBuilder();
        for (int j = 0; j < i; j++)
          sb.append(s);
        return sb.toString();
      }
    
    ". ".repeat(7)  // Seven period-with-space pairs: . . . . . . . 
    
    String str = "abc";
    String repeated = str.repeat(3);
    repeated.equals("abcabcabc");
    
    /**
     * Returns a string whose value is the concatenation of this
     * string repeated {@code count} times.
     * <p>
     * If this string is empty or count is zero then the empty
     * string is returned.
     *
     * @param count number of times to repeat
     *
     * @return A string composed of this string repeated
     * {@code count} times or the empty string if this
     * string is empty or count is zero
     *
     * @throws IllegalArgumentException if the {@code count} is
     * negative.
     *
     * @since 11
     */ 
    
    public static String rep(int a,String k)
    
           {
               if(a<=0)
                    return "";
               else 
               {a--;
                   return k+rep(a,k);
           }
    
    Collections.nCopies( 3, "abc" ).stream().collect( Collectors.joining() );
    
    static String repeat(String s, int length) {
        return s.length() >= length ? s.substring(0, length) : repeat(s + s, length);
    }
    
    for (int i = 0; i < 50; i++)
        System.out.println(repeat("_/‾\\", i));