我有几个Set<String>
,并希望将每个String
转换为单个Set
,其中原始Set<String> set_1;
Set<String> set_2;
StringBuilder builder = new StringBuilder();
for (String str : set_1) {
builder.append(str).append(" ");
}
this.string_1 = builder.toString();
builder = new StringBuilder();
for (String str : set_2) {
builder.append(str).append(" ");
}
this.string_2 = builder.toString();
的每个元素都由空格“”分隔。
一个天真的第一种方法是这样做
{{1}}
有人能想到更快,更漂亮或更有效的方法吗?
答案 0 :(得分:88)
使用commons / lang,您可以使用StringUtils.join执行此操作:
String str_1 = StringUtils.join(set_1, " ");
为简洁起见,你无法真正击败它。
<强>更新强>
重新阅读这个答案,我现在更喜欢the other answer regarding Guava's Joiner。事实上,这些天我不去附近的公共场所。
另一个更新:
Java 8引入了方法String.join()
String joined = String.join(",", set);
虽然这不像Guava版本那么灵活,但是当你的类路径上没有Guava库时它会很方便。
答案 1 :(得分:27)
如果您使用的是Java 8,则可以使用native
String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
方法:
返回由
String
元素的副本组成的新CharSequence
,其中包含指定分隔符的副本。 例如:Set<String> strings = new LinkedHashSet<>(); strings.add("Java"); strings.add("is"); strings.add("very"); strings.add("cool"); String message = String.join("-", strings); //message returned is: "Java-is-very-cool"
Set
实现Iterable
,因此只需使用:
String.join(" ", set_1);
答案 2 :(得分:20)
作为对Seanizer公共答案的反对,如果你使用谷歌的Guava Libraries(我认为在许多方面我认为是“后来者”,你会使用{{} 3}}:
Joiner.on(" ").join(set_1);
具有一些辅助方法的优点,可以执行以下操作:
Joiner.on(" ").skipNulls().join(set_1);
// If 2nd item was null, would produce "1, 3"
或
Joiner.on(" ").useForNull("<unknown>").join(set_1);
// If 2nd item was null, would produce "1, <unknown>, 3"
它还支持直接附加到StringBuilders和Writers以及其他此类细节。
答案 3 :(得分:6)
我没有可用的StringUtil库(我别无选择)所以使用标准Java我想出了这个...
如果您确信您的设置数据不包含任何逗号或方括号,则可以使用:
mySet.toString().replaceAll("\\[|\\]","").replaceAll(","," ");
一组“a”,“b”,“c”通过.toString()转换为字符串“[a,b,c]”。
然后将额外的标点符号替换为必要的。
污物。
答案 4 :(得分:3)
我使用这种方法:
public static String join(Set<String> set, String sep) {
String result = null;
if(set != null) {
StringBuilder sb = new StringBuilder();
Iterator<String> it = set.iterator();
if(it.hasNext()) {
sb.append(it.next());
}
while(it.hasNext()) {
sb.append(sep).append(it.next());
}
result = sb.toString();
}
return result;
}
答案 5 :(得分:3)
也许是一个更短的解决方案:
public String test78 (Set<String> set) {
return set
.stream()
.collect(Collectors.joining(" "));
}
或
public String test77 (Set<String> set) {
return set
.stream()
.reduce("", (a,b)->(a + " " + b));
}
但原生,肯定更快
public String test76 (Set<String> set) {
return String.join(" ", set);
}
答案 6 :(得分:2)
我对代码复制感到困惑,为什么不把它分解成一个函数,它接受一个集合并返回一个字符串?
除此之外,我不确定你能做多少,除非给stringbuilder一个关于预期容量的提示(如果你可以根据设置的大小和字符串长度的合理期望来计算它)。
这也有库函数,但我怀疑它们的效率要高得多。
答案 7 :(得分:2)
这可以通过从集合中创建流然后使用reduce操作组合元素来完成,如下所示(有关Java 8流检查here的更多详细信息):
Optional<String> joinedString = set1.stream().reduce(new
BinaryOperator<String>() {
@Override
public String apply(String t, String u) {
return t + " " + u;
}
});
return joinedString.orElse("");