代码之家  ›  专栏  ›  技术社区  ›  Lars Andren

将set<string>的内容放入单个字符串的最快方法是用空格分隔单词?

  •  42
  • Lars Andren  · 技术社区  · 14 年前

    我有几个 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();
    

    有人能想出一种更快、更漂亮或更有效的方法吗?

    8 回复  |  直到 6 年前
        1
  •  82
  •   Sean Patrick Floyd    7 年前

    使用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库时,它是很方便的。

        2
  •  26
  •   Jasper de Vries nndru    7 年前

    如果使用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);
    
        3
  •  20
  •   Cowan    14 年前

    与Seanizer的Commons Lang答案相反,如果你使用的是Google的 Guava Libraries (在很多方面,我认为这是朗格公地的“继承人”),你可以使用 Joiner :

    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"
    

    它还支持直接附加到架构师和编剧,以及其他类似的细节。

        4
  •  6
  •   user2808054    6 年前

    我没有StrugUTL库可用(我没有选择),所以使用标准Java我想出了这个。

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

    mySet.toString().replaceAll("\\[|\\]","").replaceAll(","," ");
    

    一组“a”、“b”、“c”通过.toString()转换为字符串“[a、b、c]”。

    然后根据需要替换额外的标点符号。

    污秽。

        5
  •  3
  •   tuxdna    11 年前

    我使用这种方法:

    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;
    }
    
        6
  •  3
  •   Alexey Rykhalskiy    6 年前

    也许是一个较短的解决方案:

    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);
    }
    
        7
  •  2
  •   Uri    14 年前

    我对代码复制感到困惑,为什么不将它分解为一个函数,该函数接受一个集合并返回一个字符串?

    除此之外,我不确定您能做什么,除了可能给StringBuilder一个关于预期容量的提示(如果您可以根据设置的大小和对字符串长度的合理期望来计算它的话)。

    也有一些库函数可以实现这一点,但我怀疑它们的效率明显更高。

        8
  •  2
  •   Ehab Qadah    7 年前

    这可以通过在集合中创建一个流来完成,然后使用如下所示的还原操作来组合元素(有关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("");