2

重複の可能性:
リストをコンマで区切る最も明確な方法(Java)?

私はを持っており、List<String>このリストを1行に変換し、最初の要素の前と最後の要素の後の位置を除いてString、この要素の間に区切り文字を挿入する必要があります。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

車輪の再発明をしないでください... apachecommons-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

これが私が使用しているもので、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 に答える
1

多くの推奨事項があり、サードパーティのライブラリ用です。
私の推奨は、ループに行くfor場合、その時点でのコードがスレッドセーフである必要がない場合は、StringBuilder代わりに使用することです。そのままよりずっと速い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 に答える
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 に答える