2012-11-16 31 views

回答

27

Apache Commons Lang包含一個StringUtils.join()方法正是爲了這個目的。請注意,不同的風味存在。

而作爲2014年3月的,爪哇8現在有一個StringJoiner

+7

在天真的情況下,這將是足夠的,但如果字符串本身包含逗號它會失敗,引號或換行符。 –

+0

@MarkoTopolnik - 同意 –

+0

鏈接已死,也許http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#join(T ...)可能做一個好的替代品? –

5

我認爲,如果你想只使用Java核心,你可以使用以下。

java.util.Arrays.toString(list.toArray(new String[list.size()]).replace("[", "\"").replace("]", "\""); 

警告:我沒有檢查過所有這些情況。 ;)

的Arrays.toString會如果列表中包含a, b, c

我們可以利用的事實,這是逗號分隔我們的優勢在這裏,只是去掉方括號中生成類似

[a], [b], [c] 

在逗號在數據範圍內的情況下,用"替換它們。如果你不需要這個,你可以做replace("[", ""

9

有一個番石榴類叫Joiner,可以很容易地創建這些類型的字符串。

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

1

沒有,也沒有在JDK提供便捷的方法。你可以創建你自己的,但一般情況下這不是微不足道,因爲它似乎(例如,當一個字段包含一個分隔符,換行符,或textdelimiter):

  • 場conatins換行符:現場有被引用
  • 字段包含textdelimiter:定界符被加倍
  • 字段包含分離器:字段具有被引用

實施例:

String[] fields = { "\n", ""he said \"hello\"", "," } 

應該給你:

" 
","he said ""hello""","," 

編輯:這裏有一個建議RFC for CSV。編輯2:如果有人對某個實現感興趣,請發表評論,我有一個在家裏的硬盤上。

0

使用此代碼

public static String listToString(List list) { 

     int len = list.size(); 
     int last = len - 1; 
     StringBuffer sb = new StringBuffer(2 * (len + 1)); 

     sb.append('{'); 

     for (int i = 0; i < len; i++) { 
      sb.append(list.get(i)); 

      if (i != last) { 
       sb.append(','); 
      } 
     } 

     sb.append('}'); 

     return sb.toString(); 
    } 
6

寫到這簡單的方法;

String listToCsv(List<String> listOfStrings, char separator) { 
    StringBuilder sb = new StringBuilder(); 

    // all but last 
    for(int i = 0; i < listOfStrings.size() - 1 ; i++) { 
     sb.append(listOfStrings.get(i)); 
     sb.append(separator); 
    } 

    // last string, no separator 
    if(listOfStrings.size() > 0){ 
     sb.append(listOfStrings.get(listOfStrings.size()-1)); 
    } 

    return sb.toString(); 
} 
+2

如果列表爲空,這將會崩潰 –

+2

我認爲這正是人們應該擁抱編寫良好的和調試過的庫的原因 –

2
public class StringUtil { 

    public String toCsv(final List<?> list) { 
     return toString(list, ','); 
    } 

    public String toString(final List<?> list, char delimiter) { 
     final StringBuilder b = new StringBuilder(); 
     if (list != null) { 
      for (int i = 0; i < list.size(); i++) { 
       b.append(list.get(i).toString()); 
       if (i != list.size() - 1) { 
        b.append(delimiter); 
       } 
      } 
     } 
     return b.toString(); 
    } 
} 
0

這是林做

@Test 
    public void testString(){ 
     List<String> listOfWords = Arrays.asList("Some","Other","lalala"); 

     final String fields = listOfWords.stream().reduce((t, u) -> t + "," + u).get(); 
     System.out.println("Look "+fields); 
    } 
1

如果您使用的是Java 8

List<String> objects= Arrays.asList("Test1","Test2","Test3"); 
String objectsCommaSeparated = String.join(",", objects); 
System.out.println(objectsCommaSeparated); 

隨着流

String objectsCommaSeparated = objects.stream().collect(Collectors.joining(",")); 
System.out.println(objectsCommaSeparated); 
1

釷是代碼處理包含引號,逗號和其他麻煩字符的數據:

公共類ToCsv {

private static final String QUOTE = "\""; 
private static final Pattern NON_WORD = Pattern.compile(".*\\W.*"); 

public final static String toCsv(final List<Object> list) { 
    final StringBuilder sb = new StringBuilder(); 
    String sep = ""; 
    for (final Object object : list) { 
     String s = object.toString(); 
     final Matcher m = NON_WORD.matcher(s); 
     if (m.matches()) { 
      if (s.contains(QUOTE)) { 
       s = s.replaceAll(QUOTE, "\"\""); 
      } 
      sb.append(sep).append(QUOTE).append(s).append(QUOTE); 
     } else { 
      sb.append(sep).append(s); 
     } 
     sep = ","; 
    } 
    return sb.toString(); 
} }