2

可能重复:
用逗号分隔列表的最清晰方法(Java)?

我有一个List<String>,我需要将此列表转换为单行并在Stringthis 的元素之间插入分隔符List,但第一个元素之前和最后一个元素之后的位置除外;

我做了一个这样的循环:

StringBuffer sb = new StringBuffer();
for (String str : list) {
    sb.append(str).append(';');
}
if(sb.length() > 0)
    sb.deleteCharAt(sb.length() - 1);

我不喜欢删除最后一个标记句。

那么,哪种方式更优雅呢?

4

7 回答 7

10

不要重新发明轮子...... apache commons-lang 库有该StringUtils.join()方法,它完全符合您的要求:

String s = StringUtils.join(list, ";"); // for example

Java 8 更新:

在 java 8 中,String该类具有执行所需操作的join()方法:

String s = String.join(";", list);
于 2012-08-14T20:07:34.150 回答
5

看看在 Google 的 Guava 库中使用Joiner 。

String delimitedString = Joiner.on(";").join(list);
于 2012-08-14T20:08:35.377 回答
1

你有很多推荐和第三方库。
我的建议是,如果您使用for循环,如果您的代码此时不需要是线程安全的,那么请使用 aStringBuilder代替。StringBuffer它比现在快得多unsynchronized

一个示例(仅针对不同的循环):

int len = list.size() - 1;
ListIterator<String> it = list.listIterator();  
StringBuilder sb = new StringBuilder();  
while(it.hasNext() && len-- > 0){  
   sb.append(it.next()).append(";");  
}  
if(it.hasNext()){  
   sb.append(it.next());  
}  
于 2012-08-14T20:44:09.743 回答
1

这是我使用的,用 C# 编写的,但您应该能够弄清楚...

public static string DelimitList<T>(List<T> list, string delimiter)
{
    if (list == null || list.Count == 0 || delimiter == null)
    {
        return string.Empty;
    }

    StringBuilder delimitedList = new StringBuilder();
    for (int index = 0; index < list.Count - 1; index++)
    {
        delimitedList.Append(list[index]);
        delimitedList.Append(delimiter);
    }

    delimitedList.Append(list[list.Count - 1]);
    return delimitedList.ToString();
}
于 2012-08-14T20:08:26.490 回答
1

Apache Commons Lang 有一个StringUtils类,其join方法允许您执行此操作:

StringUtils.join(list, ";");
于 2012-08-14T20:09:29.517 回答
0

看看 ArrayList.toString() 是如何编写的,这可能会有所帮助:

public String toString() {
    Iterator<E> i = iterator();
if (! i.hasNext())
    return "[]";

StringBuilder sb = new StringBuilder();
sb.append('[');
for (;;) {
    E e = i.next();
    sb.append(e == this ? "(this Collection)" : e);
    if (! i.hasNext())
    return sb.append(']').toString();
    sb.append(", ");
}
}

这对你有启发吗?

于 2012-08-14T21:19:18.463 回答
0

好吧,它并不是真的更优雅,但是您可以检查它是否是第一个条目,否则会预先添加分隔符。

boolean isFirst = true;

StringBuffer sb = new StringBuffer();
for (String str : list) {
   if (!isFirst){
       sb.append(';');
   } 
   sb.append(str);
   isFirst = false;
}
于 2012-08-14T20:07:30.453 回答