Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.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 生成由n个重复字符组成的字符串的最简单方法是什么?_Java_String_Character - Fatal编程技术网

Java 生成由n个重复字符组成的字符串的最简单方法是什么?

Java 生成由n个重复字符组成的字符串的最简单方法是什么?,java,string,character,Java,String,Character,给定一个字符c和一个数字n,如何创建一个由n个重复的c组成的字符串?手动操作太麻烦了: StringBuilder sb = new StringBuilder(n); for (int i = 0; i < n; ++i) { sb.append(c); } String result = sb.toString(); StringBuilder sb=新的StringBuilder(n); 对于(int i=0;i

给定一个字符c和一个数字n,如何创建一个由n个重复的c组成的字符串?手动操作太麻烦了:

StringBuilder sb = new StringBuilder(n);
for (int i = 0; i < n; ++i)
{
    sb.append(c);
}
String result = sb.toString();
StringBuilder sb=新的StringBuilder(n);
对于(int i=0;i

肯定有一些静态库函数已经为我实现了这一点吗?

只需将其添加到您自己的库中即可

public static String generateRepeatingString(char c, Integer n) {
    StringBuilder b = new StringBuilder();
    for (Integer x = 0; x < n; x++)
        b.append(c);
    return b.toString();
}
公共静态字符串生成器重复字符串(字符c,整数n){
StringBuilder b=新的StringBuilder();
对于(整数x=0;x
有一个可以添加的实用程序类

int n = 10;
char[] chars = new char[n];
Arrays.fill(chars, 'c');
String result = new String(chars);
编辑:

这个答案已经提交9年了,但它仍然不时引起一些关注。同时,Java8还引入了函数式编程特性。给定一个字符
c
和所需的重复次数
count
,下面的一行程序可以执行与上面相同的操作

String result = IntStream.range(1, count).mapToObj(index -> "" + c).collect(Collectors.joining());
但是请注意,它比数组方法慢。这在任何情况下都不重要,除非是在最苛刻的情况下。除非是在一段每秒执行数千次的代码中,否则不会有太大的区别。这也可以与字符串而不是字符一起使用,以重复多次,因此更加灵活。不需要第三方库。

如果可以,从Apache Commons使用:

谷歌番石榴时间

Strings.repeat("a", 3)
以下是一种基于标准二进制供电算法的O(logN)方法:

public static String repChar(char c, int reps) {
    String adder = Character.toString(c);
    String result = "";
    while (reps > 0) {
        if (reps % 2 == 1) {
            result += adder;
        }
        adder += adder;
        reps /= 2;
    }        
    return result;
}

reps的负值返回空字符串。

查看此示例

Integer  n=10;
String s="a";
String repeated = new String(new char[n]).replace("\0", s);

答案以表格形式呈现,因此请在那里投票

为了了解速度惩罚,我测试了两个版本,一个是Array.fill,另一个是StringBuilder

public static String repeat(char what, int howmany) {
    char[] chars = new char[howmany];
    Arrays.fill(chars, what);
    return new String(chars);
}


这是一个巨大的差异

我添加了另一种解决方法:

string result = new StringBuilder().Append('c', n).ToString();
public String buildString(Character character, int nTimes) {
    return String.format("%" + nTimes + "s", " ").replace(' ', character);
}
Java SE 11 ,作为JavaSE11的一部分引入,使其非常容易实现

演示:

public class Main {
    public static void main(String[] args) {
        char ch = 'c';
        int n = 20;
        String result = String.valueOf(ch).repeat(n);
        System.out.println(result);
    }
}
cccccccccccccccccccc
输出:

public class Main {
    public static void main(String[] args) {
        char ch = 'c';
        int n = 20;
        String result = String.valueOf(ch).repeat(n);
        System.out.println(result);
    }
}
cccccccccccccccccccc

如果您不使用Java 11+(否则我将使用),您还可以组合和:

stringresult=String.join(“,Collections.nCopies(c,n));

可能重复:是什么阻碍了你编写这样的静态方法?@Tedil:我不想重新发明轮子。你为什么用
Integer
而不是
int
?个人偏好。这真的没关系。@Mike-没关系吗?用你自己的话来说,“那太浪费了。for循环的每次迭代都会”调用
intValue
(3次)和
valueOf
(一次/交互)最终创建一个新的整数(x>127)!它是单引号,不是变量。除非我错过了什么。。。我今天有点头昏眼花。我说的是原始问题中的c,而不是你的问题中的canswer@Tedil:“给定一个字符c和一个数字n[…]”啊,对。由于自动取消装箱,还应适用于
字符
对象。我假设它是一个
字符
字符
。流方法确实不是一个优势。但从Java11开始,您可以使用
(“”+c)。重复(n)
这需要O(logn)时间,假设字符串的
+=
需要O(1)时间。我认为你的假设不合理。@Tsuyoshi Ito:说得好。使用预先调整大小的StringBuilder将更接近理想的效果。@TsuyoshiIto根据定义的单元操作使用O()。在这种情况下,
+=
是单元操作,因此O(logn)是有效的。但是你说得对,在内部,
+=
将使用一个
StringBuilder
,它可能会有开销。这似乎涉及到在每个连续的+=”上复制越来越长的字符串。因此,这个算法在每个+=上比前一个做更多的工作。它还会产生垃圾。因此,使用“+=”作为“单位”并不是一个很好的方法。使用单个StringBuilder和循环逐个添加字符可能会更好。将涉及更少的垃圾和字符串复制,这可能意味着总体性能更好。在O(logn)中无法做到这一点。如果您想拥有一个由
n
重复字符组成的字符串,这意味着
n
内存位置必须用一个值填充。这充其量是O(N)。您的算法是伪装的循环中的字符串串联。使用StringBuilder最终最多只能使用线性时间。您的测试方法是有缺陷的。使用JMH获得准确的结果。事实上,这不是一个完美的基准(完美的基准根本不存在)。购买它可以清楚地显示一种方法与另一种方法相比有多慢。这并不能回答OP的问题question@Napoli. 没有看到java标记。不过在C#中效果很好!
public class Main {
    public static void main(String[] args) {
        char ch = 'c';
        int n = 20;
        String result = String.valueOf(ch).repeat(n);
        System.out.println(result);
    }
}
cccccccccccccccccccc