将Set <String>的内容放到单个String中的最快方法,其中单词用空格分隔?

Lar*_*ren 55 java string optimization whitespace set

我有几个Set<String>s,并希望将每个转换为单个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();
Run Code Online (Sandbox Code Playgroud)

谁能想到更快,更漂亮或更有效的方法呢?

Sea*_*oyd 104

使用commons/lang,您可以使用StringUtils.join执行此操作:

String str_1 = StringUtils.join(set_1, " ");
Run Code Online (Sandbox Code Playgroud)

为简洁起见,你无法真正击败它.

更新:

重新阅读这个答案,我现在更喜欢关于番石榴木匠的另一个答案.事实上,这些天我不去附近的apache公地.

另一个更新:

Java 8引入了该方法 String.join()

String joined = String.join(",", set);
Run Code Online (Sandbox Code Playgroud)

虽然这不像Guava版本那么灵活,但是当你的类路径上没有Guava库时它很方便.

  • 简短但不灵活.无论我是否想要它,我都会替换为null,并且没有skip nulls选项...这就是我们为Guava制作Joiner的原因(参见其他答案). (2认同)

Jas*_*ies 29

如果您使用的是Java 8,则可以使用本

String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
Run Code Online (Sandbox Code Playgroud)

方法:

返回StringCharSequence指定分隔符的副本连接在一起的元素副本的新组合.例如:

 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"
Run Code Online (Sandbox Code Playgroud)

Set实现Iterable,所以简单地使用:

String.join(" ", set_1);
Run Code Online (Sandbox Code Playgroud)


Cow*_*wan 20

作为Seanizer公共答案的一个对照点,如果你使用Google的Guava Libraries(我在很多方面都认为是' commor-lang '的'继承者'),你会使用Joiner:

Joiner.on(" ").join(set_1);
Run Code Online (Sandbox Code Playgroud)

利用一些辅助方法的优势来做一些事情,比如:

Joiner.on(" ").skipNulls().join(set_1);
// If 2nd item was null, would produce "1, 3"
Run Code Online (Sandbox Code Playgroud)

要么

Joiner.on(" ").useForNull("<unknown>").join(set_1);
// If 2nd item was null, would produce "1, <unknown>, 3"
Run Code Online (Sandbox Code Playgroud)

它还支持直接附加到StringBuilders和Writers以及其他此类细节.

  • @seanizer,Shervin询问番石榴与谷歌收藏品,而不是番石榴与公共场所:) Shervin - guava只是google-collections的替代品.随着项目范围的扩大,它不再仅限于收藏品,因此名称变更有序.谷歌收藏品基本上应该被认为是弃用的,番石榴是一个替代品,有bug修复+更多功能. (2认同)

Ale*_*kiy 7

也许更短的解决方案:

public String test78 (Set<String> set) {
    return set
        .stream()
        .collect(Collectors.joining(" "));
}
Run Code Online (Sandbox Code Playgroud)

或者

public String test77 (Set<String> set) {
    return set
        .stream()
        .reduce("", (a,b)->(a + " " + b));
}
Run Code Online (Sandbox Code Playgroud)

但是原生的,绝对更快

public String test76 (Set<String> set) {
    return String.join(" ", set);
}
Run Code Online (Sandbox Code Playgroud)


use*_*054 6

我没有可用的StringUtil库(我别无选择)所以使用标准Java我想出了这个..

如果您确信您的设置数据不包含任何逗号或方括号,则可以使用:

mySet.toString().replaceAll("\\[|\\]","").replaceAll(","," ");
Run Code Online (Sandbox Code Playgroud)

一组"a","b","c"通过.toString()转换为字符串"[a,b,c]".

然后将额外的标点替换为必要的.

污物.

  • 太好了!总是很酷,看看你可以用JDK标准库做什么:) (2认同)
  • ...当然,只要你的集合中没有任何“[”或“]”或“,”;) (2认同)