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

时间:2010-06-15 01:45:19

标签: java string optimization set whitespace

我有几个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}}

有人能想到更快,更漂亮或更有效的方法吗?

8 个答案:

答案 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("");