我需要将可变数量的参数(类型String)连接到一个String:
E.g:
System.out.println( add("ja", "va") );
应该返回java
,但我的实现返回jaja
。
我试过了:
public static String add(String... strings) {
for (String arg : strings) {
return String.format(arg.concat(arg));
}
return "string";
}
我做错了什么?
答案 0 :(得分:3)
将Java 8的StringJoiner
与流API结合使用:
String joined = Stream.of(strings).collect(Collectors.joining());
包含在方法中,它可能如下所示:
import java.util.stream.Collectors;
import java.util.stream.Stream;
public static String join(String separator, String... strings) {
return Stream.of(strings).collect(Collectors.joining(separator));
}
答案 1 :(得分:2)
你在循环的第一次迭代(return String.format ...
)而不是在结束时返回。你应该在这里使用的是StringBuilder
:
public static String add(String... strings) {
StringBuilder builder = new StringBuilder();
for (String arg : strings) {
builder.append(arg);
}
return builder.toString(); //Outputs the entire contents of the StringBuilder.
}
答案 2 :(得分:1)
现在您可能想要使用:
String.join(separator, strings)
答案 3 :(得分:0)
有很多方法,但StringBuilder可能效率最高:
public static String add(String... strings) {
StringBuilder sb = new StringBuilder();
for (String arg : strings) {
sb.append(arg);
}
return sb.toString();
}
基本上,您将构建器初始化为空,然后遍历附加每个构建器的参数,最后返回构建器的内容。
您可能希望在循环中添加一些代码来处理参数中的空值(数组不会为null,但其中的字符串可能是。因为这个方法会附加字符串&#34 ; null"对于空值,可能不是您想要的。
答案 4 :(得分:0)
试试这个:
String result;
for (int i =0, i < strings.size(), i++){
result += strings[i];
}
return result;
答案 5 :(得分:0)
您可以使用新的Java 8 lambdas等,
String[] arr = { "ja", "va" };
Optional<String> result = Arrays.asList(arr).parallelStream()
.reduce(new BinaryOperator<String>() {
public String apply(String t, String u) {
return t + u;
}
});
System.out.println(result.get());
答案 6 :(得分:0)
要回答你的问题,这一行就是你做错了:
返回String.format(arg.concat(arg));
第一次在每个循环arg中将是字符串ja。你把那个字符串和concatenat与ja相同的var arg。然后你回来,所以你永远不会进入第二轮循环。
要修复,请执行其他人建议并使用某些内容来收集和加入每个变量。
为了给你另一个加入的解决方案,你可以尝试加入varargs varible。所以你可以尝试:
返回String.join('',strings);
这样,没有循环写,只需加入字符串。这假定是Java 9。