我的目标是使用未知次数的分隔符加入已知字符串。
因此,如果我知道该字符串为,
且分隔符为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库中遗漏了什么吗?请不要另外依赖。
答案 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);