146

ループが最後に繰り返されているかどうかを判断する方法はありますか。私のコードは次のようになります。

int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();

for(int i : array)
{
    builder.append("" + i);
    if(!lastiteration)
        builder.append(",");
}

今問題は、最後の反復でカンマを追加したくないということです。これが最後の反復かどうか、または for ループで立ち往生しているか、追跡するために外部カウンターを使用しているかを判断する方法があります。

4

22 に答える 22

224

もう 1 つの方法は、最初の繰り返しではなく、i を追加する前にコンマを追加することです。(ちなみに、 を使用しないでください。"" + iここでは連結は必要ありません。また、StringBuilder には完全に適切な append(int) オーバーロードがあります。)

int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();

for (int i : array) {
    if (builder.length() != 0) {
        builder.append(",");
    }
    builder.append(i);
}

これの良いところは、どんなものでも機能するというIterableことです。常にインデックスを作成できるとは限りません。(「コンマを追加して最後に削除する」というのは、実際に StringBuilder を使用している場合に有効な提案ですが、ストリームへの書き込みなどには機能しません。ただし、これはおそらく、この正確な問題に対する最良のアプローチです。 )

于 2008-11-12T22:06:01.480 に答える
147

これを行う別の方法:

String delim = "";
for (int i : ints) {
    sb.append(delim).append(i);
    delim = ",";
}

更新: Java 8 の場合、コレクターが追加されました

于 2008-11-12T22:30:04.957 に答える
39

常に追加する方が簡単かもしれません。そして、ループが終了したら、最後の文字を削除します。そのように条件文も少なくなります。

StringBuilderを使用deleteCharAt(int index)して、インデックスをlength() - 1

于 2008-11-12T22:01:49.273 に答える
33

ジョブに間違ったツールを使用している可能性があります。

これはあなたがしていることよりも手動ですが、少し「古い学校」ではないにしても、よりエレガントです。

 StringBuffer buffer = new StringBuffer();
 Iterator iter = s.iterator();
 while (iter.hasNext()) {
      buffer.append(iter.next());
      if (iter.hasNext()) {
            buffer.append(delimiter);
      }
 }
于 2008-11-12T22:13:29.623 に答える
15

これは、この StackOverflow questionのほぼ繰り返しです。必要なのはStringUtilsで、joinメソッドを呼び出すことです。

StringUtils.join(strArr, ',');
于 2009-03-21T12:35:06.300 に答える
14

別の解決策 (おそらく最も効率的)

    int[] array = {1, 2, 3};
    StringBuilder builder = new StringBuilder();

    if (array.length != 0) {
        builder.append(array[0]);
        for (int i = 1; i < array.length; i++ )
        {
            builder.append(",");
            builder.append(array[i]);
        }
    }
于 2008-11-12T22:20:05.040 に答える
7

シンプルに保ち、標準の for ループを使用します。

for(int i = 0 ; i < array.length ; i ++ ){
    builder.append(array[i]);
    if( i != array.length - 1 ){
        builder.append(',');
    }
}

または、Apache commons-lang StringUtils.join() を使用するだけです

于 2008-11-12T22:04:06.133 に答える
6

明示的なループは、暗黙的なループよりも常にうまく機能します。

builder.append( "" + array[0] );
for( int i = 1; i != array.length; i += 1 ) {
   builder.append( ", " + array[i] );
}

長さゼロの配列を扱う場合に備えて、すべてを if ステートメントでラップする必要があります。

于 2008-11-12T22:05:33.320 に答える
4

これを従来のインデックス ループに変換すると、はい。

または、完了後に最後のコンマを削除することもできます。そのようです:

int[] array = {1, 2, 3...};
StringBuilder

builder = new StringBuilder();

for(int i : array)
{
    builder.append(i + ",");
}

if(builder.charAt((builder.length() - 1) == ','))
    builder.deleteCharAt(builder.length() - 1);

私、私はcommons-langStringUtils.join()から使用しています。

于 2008-11-12T22:03:45.510 に答える
4

ツールキットで述べたように、Java 8 にはCollectorsが追加されました。コードは次のようになります。

String joined = array.stream().map(Object::toString).collect(Collectors.joining(", "));

それはまさにあなたが探しているものだと思います。それは、他の多くのことに使用できるパターンです。

于 2016-11-11T01:24:50.937 に答える
3

クラスセパレータが必要です。

Separator s = new Separator(", ");
for(int i : array)
{
     builder.append(s).append(i);
}

クラスの実装Separatorは簡単です。toString()空の文字列を返す最初の呼び出しを除いて、のすべての呼び出しで返される文字列をラップします。

于 2008-11-14T10:00:00.410 に答える
3

java.util.AbstractCollection.toString() に基づいて、区切り文字を回避するために早期に終了します。

StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
for (;;) {
  buffer.append(iter.next());
  if (! iter.hasNext())
    break;
  buffer.append(delimiter);
}

効率的でエレガントですが、他のいくつかの回答ほど自明ではありません。

于 2009-03-21T12:13:06.120 に答える
3

ここに解決策があります:

int[] array = {1, 2, 3...};
StringBuilder builder = new StringBuilder();
bool firstiteration=true;

for(int i : array)
{
    if(!firstiteration)
        builder.append(",");

    builder.append("" + i);
    firstiteration=false;
}

最初の繰り返しを探してください:)  

于 2008-11-12T22:06:54.643 に答える
1

ここで説明するソリューションの多くは、特に外部ライブラリに依存するソリューションのように、少しやり過ぎです。私がいつも使ってきたカンマ区切りのリストを実現するための、きれいで明確なイディオムがあります。条件 (?) 演算子に依存しています。

編集:元のソリューションは正しいですが、コメントによると最適ではありません。もう一度試す:

    int[] array = {1, 2, 3};
    StringBuilder builder = new StringBuilder();
    for (int i = 0 ;  i < array.length; i++)
           builder.append(i == 0 ? "" : ",").append(array[i]); 

配列と StringBuilder の宣言を含む 4 行のコードです。

于 2009-03-21T19:23:01.467 に答える
1

さらに別のオプション。

StringBuilder builder = new StringBuilder();
for(int i : array)
    builder.append(',').append(i);
String text = builder.toString();
if (text.startsWith(",")) text=text.substring(1);
于 2009-03-21T12:25:45.027 に答える
0

StringJoinerを使用できます。

int[] array = { 1, 2, 3 };
StringJoiner stringJoiner = new StringJoiner(",");

for (int i : array) {
    stringJoiner.add(String.valueOf(i));
}

System.out.println(stringJoiner);
于 2021-11-10T10:50:53.767 に答える
0

もう 1 つの方法は、配列の長さ (利用可能な場合) を別の変数に格納することです (毎回長さを再チェックするよりも効率的です)。次に、インデックスをその長さと比較して、最後のコンマを追加するかどうかを決定できます。

編集: 別の考慮事項は、最後の文字を削除することのパフォーマンス コスト (文字列のコピーを引き起こす可能性があります) と、各反復で条件をチェックすることとを比較検討することです。

于 2008-11-12T22:06:10.030 に答える
0

ここに 2 つの代替パスがあります。

1: Apache Commons 文字列ユーティリティ

2: というブール値を保持し、firsttrue に設定します。各反復で、firstが false の場合は、カンマを追加します。その後、firstfalse に設定します。

于 2008-11-12T22:08:03.113 に答える
0

この場合、それが最後の繰り返しかどうかを知る必要はありません。これを解決する方法はたくさんあります。1つの方法は次のとおりです。

String del = null;
for(int i : array)
{
    if (del != null)
       builder.append(del);
    else
       del = ",";
    builder.append(i);
}
于 2011-05-24T06:58:48.717 に答える
0

配列をカンマ区切りの配列に変換するだけの場合、多くの言語にはまさにこれのための結合関数があります。配列を、各要素間に区切り文字を含む文字列に変換します。

于 2008-11-12T22:44:58.983 に答える