簡體   English   中英

在Java中使用分隔符連接值列表的最優雅方法是什么?

[英]What's the most elegant way to concatenate a list of values with delimiter in Java?

我從來沒有找到一種干凈利落的方式來做到以下幾點。

假設我有一個列表/數組字符串。

abc
def
ghi
jkl

我想將它們連接成一個由逗號分隔的單個字符串,如下所示:

abc,def,ghi,jkl

在Java中,如果我寫這樣的東西(請原諒語法),

String[] list = new String[] {"abc","def","ghi","jkl"};
String str = null;
for (String s : list)
{
   str = str + s + "," ;
}

System.out.println(str);

我去拿

abc,def,ghi,jkl,  //Notice the comma in the end

所以我必須重寫上面的for循環,如下所示

...
for (int i = 0; i < list.length; i++)
{
   str = str + list[i];
   if (i != list.length - 1)
   {
     str = str + ",";
   }
}
...

這可以在Java中以更優雅的方式完成嗎?

我肯定會使用StringBuilder / Buffer來提高效率,但我想說明這個案例而不是太冗長。 優雅,我的意思是一個解決方案,避免丑陋(?) if在循環內檢查。

使用Guava(以前的google-collections)木匠類

Joiner.on(",").join(list)

完成。

這是我的版本: Java技巧:收集字符串中對象的最快方法

StringBuilder buffer = new StringBuilder ();
String delim = "";
for (Object o: list)
{
    buffer.append (delim);
    delim = ", "; // Avoid if(); assignment is very fast!
    buffer.append (o);
}
buffer.toString ();

另外一個好處是:如果循環中的代碼更復雜,那么這種方法將產生正確的結果,而不需要復雜的if() s。

另請注意,對於現代CPU,分配僅在緩存中發生(或者可能僅在寄存器中發生)。

結論:雖然這個代碼乍一看看起來很奇怪,但它有很多優點。

StringBuilder builder = new StringBuilder();
for (String st: list) {
    builder.append(st).append(',');
}
builder.deleteCharAt(builder.length());
String result = builder.toString();

不要使用'+'表示字符串傳染。 它很慢。

看這里:

http://snippets.dzone.com/posts/show/91

有關此主題的完整討論。

我敢打賭,在任何中型Java項目的類路徑上都有幾個名為“StringUtil”,“StringsUtil”,“Strings”的類或任何類。 最有可能的是,它們中的任何一個都會提供連接功能。 以下是我在項目中找到的一些示例:

org.apache.commons.lang.StringUtils.join(...)
org.apache.wicket.util.string.Wicket.join(...)
org.compass.core.util.StringUtils.arrayToDelimitedString(...)

由於您可能希望將來擺脫一些外部依賴關系,您可能想要這樣的事情:

public static final MyStringUtils {
    private MyStringUtils() {}

    public static String join(Object[] list, String delim) {
        return org.apache.commons.lang.StringUtils.join(list, delim);
    }
}

現在這就是我所說的“優雅”;)

檢查這是否有用:

List<Integer> numbers=new ArrayList<Integer>();
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);
    numbers.add(4);
    numbers.add(5);
    numbers.add(6);
    String str = " ";
    for(Integer s:numbers){
    str=str+s+" , ";
    }
    System.out.println(str.substring(0,str.length()-2));

我會使用StringBuffer來實現此功能。 String是不可變的,因此每次連接兩個String ,都會創建一個新對象。

使用StringBuffer更有效:

String[] list = new String[] {"abc","def","ghi","jkl"};
StringBuffer str = new StringBuffer();
for (String s : list) {
   str.append(s);
   str.append(",");
}
str.deleteCharAt(str.length());
System.out.println(str); //automatically invokes StringBuffer.toString();
for (int i = 0; i < list.length-1; i++) {
    str = str + list[i];
    str = str + ",";    
}
str = str + list[list.length-1] 

暫無
暫無

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

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