我有一个List<String>
,我需要将此列表转换为单行,并在此String
的{{1}}个元素之间插入分隔符,但第一个元素之前和最后一个元素之后的位置除外;
我做了一个这样的循环:
List
我不喜欢删除最后一个令牌句。
那么,哪种方式更优雅呢?
答案 0 :(得分:10)
不要重新发明轮子...... apache commons-lang library有StringUtils.join()
方法,它完全符合您的要求:
String s = StringUtils.join(list, ";"); // for example
在java 8中,String
类具有执行您想要的join()
方法:
String s = String.join(";", list);
答案 1 :(得分:5)
请查看在Google的Guava Libraries中使用Joiner。
String delimitedString = Joiner.on(";").join(list);
答案 2 :(得分: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();
}
答案 3 :(得分:1)
Apache Commons Lang有一个StringUtils
类,其中join
方法允许您这样做:
StringUtils.join(list, ";");
答案 4 :(得分:1)
你有许多推荐和第三方的图书馆
我的建议是,如果你选择for
循环,如果你的代码不需要是线程安全的,那么请改用StringBuilder
。它比StringBuffer
<{1}}快得多,因为它是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());
}
答案 5 :(得分:0)
嗯,它不是更优雅,但你可以检查它是否是第一个条目,否则预先添加分隔符。
boolean isFirst = true;
StringBuffer sb = new StringBuffer();
for (String str : list) {
if (!isFirst){
sb.append(';');
}
sb.append(str);
isFirst = false;
}
答案 6 :(得分: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(", ");
}
}
这会激发你的灵感吗?