返回带有X个重复字符的String,没有循环

时间:2014-04-18 07:42:12

标签: java string

我停了一下。我有一个方法,它应该返回一个新的String包含X次重复的字符" y"。 X和Y是方法的参数。因此,简单的解决方案将是这样的:

public String someMethod(int x,char y){
    String result="";
    for (int i=0;i<x;i++) result+=y;
    return result;    
}

我试图弄明白,有没有办法在一行中做同样的事情,没有循环。例如:

public String someMethod(int x,char y){
    return new StringBuilder().append('y', x);    
}

但是StringBuilder或StringBuffer等没有这样的方法。你能给我任何建议吗?提前谢谢。

更新 所以,解决方案将是:

public String someMethod(int x,char y){
    return new String(new char[x]).replace("\0", String.valueOf(y))  
}

感谢您的帮助!

7 个答案:

答案 0 :(得分:1)

试试这个。在这里,我们生成一个新的char[],默认初始化为所有0,然后用我们想要的字符替换这些0

public class B {

    public static void main(String[] args) {            
        int x = 5;
        String y = "h";
        String result = new String(new char[x]).replace("\0", y);
        System.out.println(result);
    }
}

答案 1 :(得分:1)

你可以做到

import java.util.Arrays;

public String someMethod(int x,char y){
    char[] a = new char[x];
    Arrays.fill(a, 0, x, y);
    return new String(a);
}

答案 2 :(得分:1)

正如其他人所说,完全没有循环是不可能的 - 你可以将它隐藏在其他方法之后,但它们仍然使用循环。

如果它仅仅是为了“更紧凑”的代码,你可以编写自己的方法来做到这一点 - 或者你使用第三方库,如Apache Commons StringUtils:StringUtils.repeat(String str, int repeat)应该做的工作

Javadoc for StringUtils.repeat(...)

答案 3 :(得分:0)

使用StringBuffer&amp;循环,没有循环,这是不可能完成的 即使你找到了一种方法,可以在没有循环的情况下完成它,在它内部仍然使用循环。

答案 4 :(得分:0)

public String someMethod(int x,char y) {
    StringBuilder buff = new StringBuilder();
    return someMethod( x, y, buff );
}

public String someMethod(int x,char y, StringBuilder buff) {
    if (x == 0) return buff.toString();
    else {
        buff.append( y );
        return someMethod( x, y, buff );
    }
}

...但如果这不是一个谜题,递归并不比循环更好......

另一方面,当有人想要删除循环比较某些String实现的函数(在本例中为new String(char[])replace()

时,递归更为通用

答案 5 :(得分:0)

对于java 8,您可以使用流:

Stream.generate(() -> String.valueOf(y))
      .limit(x)
      .collect(Collectors.joining()).toString()

答案 6 :(得分:0)

将近5年后回答我自己的问题。

在Java 11中,可以按照以下步骤进行操作:

public String someMethod(int x, char y) {
    return String.valueOf(y).repeat(x);
}