首頁>Program>source

我从未發現過一種整潔的方法来进行以下操作。

說我有一个字元串列表/陣列。

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的解決方案 檢查迴圈內部。

最新回復
  • 9天前
    1 #

    這是我的版本: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()

    還請註意,在現代CPU中,分配仅在高速快取中(或可能仅在寄存器中)进行。

    結論:虽然此代碼乍看之下看起来很奇怪,但它具有许多優點。

  • 9天前
    2 #

    使用Guava(以前是google-collections)連線器類:

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

    完成。

  • 9天前
    3 #

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

    請勿將" +"用於字元串污染.太慢了。

  • 9天前
    4 #

    看這裏:

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

    有關此主题的完整讨論。

  • 9天前
    5 #

    我敢打赌,在任何類的類路徑中,都有几个名為" StringUtil"," StringsUtil"," Strings"或類似內容的類 中型Java專案.它们中的任何一个極有可能將提供聯接功能.這是我在專案中找到的一些示例:

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

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

  • c++:在同一系統上的两个應用程式之間傳遞資料的首選方式是什麼?
  • 如何在windows遊戲上叠加圖形?