簡體   English   中英

將Set <String>的內容放到單個String中的最快方法,其中單詞用空格分隔?

[英]Fastest way to put contents of Set<String> to a single String with words separated by a 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();

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

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

 String str_1 = StringUtils.join(set_1, " "); 

為簡潔起見,你無法真正擊敗它。

更新:

重新閱讀這個答案,我現在更喜歡關於番石榴木匠的另一個答案 事實上,這些天我不去附近的apache公地。

另一個更新:

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

String joined = String.join(",", set);

雖然這不像Guava版本那么靈活,但是當你的類路徑上沒有Guava庫時它很方便。

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

String.join(CharSequence delimiter, Iterable<? extends CharSequence> elements)

方法:

返回一個新的String ,該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" 

Set實現Iterable ,所以只需使用:

String.join(" ", set_1);

作為Seanizer公共答案的一個對照點,如果你使用Google的Guava Libraries (我在很多方面都認為是'commor-lang'的'繼承者'),你會使用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"

它還支持直接附加到StringBuilders和Writers以及其他此類細節。

我沒有可用的StringUtil庫(我別無選擇)所以使用標准Java我想出了這個..

如果您確信您的設置數據不包含任何逗號或方括號,則可以使用:

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

一組“a”,“b”,“c”通過.toString()轉換為字符串“[a,b,c]”。

然后將額外的標點替換為必要的。

污物。

我用這個方法:

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;
}

也許更短的解決方案:

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);
}

我對代碼復制感到困惑,為什么不將它分解為一個函數,它接受一個集合並返回一個字符串?

除此之外,我不確定你能做多少,除非給stringbuilder一個關於預期容量的提示(如果你可以根據設置的大小和字符串長度的合理期望來計算它)。

這也有庫函數,但我懷疑它們的效率要高得多。

這可以通過從集合中創建流然后使用reduce操作組合元素來完成,如下所示(有關Java 8流的更多詳細信息,請在此處查看 ):

Optional<String> joinedString = set1.stream().reduce(new 
BinaryOperator<String>() {

     @Override
     public String apply(String t, String u) {

       return t + " " + u;
    }
});
return joinedString.orElse("");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM