更优雅的方式重复和加入一个未知次数的已知字符串

时间:2015-07-09 19:26:17

标签: java java-8

我的目标是使用未知次数的分隔符加入已知字符串。

因此,如果我知道该字符串为,且分隔符为5且我知道我希望它重复?,?,?,?,?次,我会得到int n = 5; ArrayList<String> al = new ArrayList<>(n); for (int i = 0; i < n; ++i) al.add("?"); String s = String.join(",", al);

此代码将执行此操作:

import java.applet.Applet;
import java.applet.AudioClip;



class Sound {

public static final Sound sound1 = new Sound(Form.soundString);


private AudioClip clip;

public Sound(String filename){
    try{
        clip = Applet.newAudioClip(Sound.class.getResource(filename));
    }catch(Exception e){
        e.printStackTrace();
    }
}

public void play(){
    try{
        new Thread(){
           public void run(){
               clip.play();
           } 
        }.start();
    }catch(Exception ex){
        ex.printStackTrace();
    }

}
}

但这太冗长了。我在Java 8库中遗漏了什么吗?请不要另外依赖。

3 个答案:

答案 0 :(得分:7)

这在Java 8中并不新鲜,但您可以使用Collections.nCopies创建一个可以传递给List的{​​{1}}。自从在Java 1.2中创建Collections API以来,它就已存在。

String.join

答案 1 :(得分:4)

没有实现Collection(并且比生成/限制示例更好地并行化):

IntStream.range(0, 5).mapToObj(i -> "?").collect(joining(","));

答案 2 :(得分:2)

基于流的解决方案,仅为了完整性:

String s = Stream.generate(() -> "?").limit(5).collect(joining(","));

如果需要性能,可以手动制作更快(最多10倍)的解决方案:

public static String nCopies(String symbol, String delimiter, int count) {
    if(count <= 0) return "";
    char[] result = new char[(symbol.length()+delimiter.length())*count-delimiter.length()];
    fill(result, symbol, delimiter, count);
    return new String(result);
}

private static void fill(char[] result, String symbol, String delimiter, int count) {
    if(count == 1) {
        symbol.getChars(0, symbol.length(), result, 0);
        return;
    }
    int half = count/2;
    int filled = (symbol.length()+delimiter.length())*half-delimiter.length();
    if(count % 2 == 0) {
        fill(result, symbol, delimiter, half);
        delimiter.getChars(0, delimiter.length(), result, filled);
        System.arraycopy(result, 0, result, filled+delimiter.length(), filled);
        return;
    }
    fill(result, symbol, delimiter, half);
    int offset = filled;
    delimiter.getChars(0, delimiter.length(), result, offset);
    offset+=delimiter.length();
    symbol.getChars(0, symbol.length(), result, offset);
    offset+=symbol.length();
    delimiter.getChars(0, delimiter.length(), result, offset);
    offset+=delimiter.length();
    System.arraycopy(result, 0, result, offset, filled);
}

用法:

String s = nCopies("?", ",", 5);