Последняя итерация улучшена для цикла в Java - PullRequest
131 голосов
/ 13 ноября 2008

Есть ли способ определить, повторяется ли цикл в последний раз. Мой код выглядит примерно так:

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

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

Теперь я не хочу добавлять запятую в последней итерации. Теперь есть способ определить, является ли это последней итерацией, или я застрял в цикле for или использовал внешний счетчик для отслеживания.

Ответы [ 21 ]

218 голосов
/ 13 ноября 2008

Другой альтернативой является добавление запятой перед добавлением i, но не на итерации first . (Между прочим, пожалуйста, не используйте "" + i - здесь вам не нужна конкатенация, а StringBuilder имеет очень хорошую перегрузку добавления (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 - но это не работает для таких вещей, как запись в потоки. Хотя, возможно, это лучший подход для этой конкретной проблемы. )

141 голосов
/ 13 ноября 2008

Еще один способ сделать это:

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

Обновление: для Java 8 теперь у вас есть Коллекторы

39 голосов
/ 13 ноября 2008

Может быть проще всегда добавлять. И затем, когда вы закончите с вашим циклом, просто удалите последний символ. Тоже меньше условностей тоже так.

Вы можете использовать StringBuilder deleteCharAt(int index) с индексом length() - 1

29 голосов
/ 13 ноября 2008

Возможно, вы используете не тот инструмент для работы.

Это больше руководство, чем то, что вы делаете, но оно более элегантно, если не сказать "старая школа"

 StringBuffer buffer = new StringBuffer();
 Iterator iter = s.iterator();
 while (iter.hasNext()) {
      buffer.append(iter.next());
      if (iter.hasNext()) {
            buffer.append(delimiter);
      }
 }
15 голосов
/ 21 марта 2009

Это почти повторение этого вопроса StackOverflow . Вам нужно StringUtils и вызвать метод join .

StringUtils.join(strArr, ',');
14 голосов
/ 13 ноября 2008

Другое решение (возможно, самое эффективное)

    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]);
        }
    }
6 голосов
/ 13 ноября 2008

Явные циклы всегда работают лучше, чем неявные.

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

Вы должны заключить все это в оператор if на тот случай, если вы имеете дело с массивом нулевой длины.

5 голосов
/ 13 ноября 2008

будьте проще и используйте стандартный цикл 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 ()

4 голосов
/ 13 ноября 2008

Если вы преобразуете его в классический индексный цикл, да.

Или вы можете просто удалить последнюю запятую после того, как это сделано. Вот так:

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);

Я, я просто использую StringUtils.join() из commons-lang .

3 голосов
/ 14 ноября 2008

Вам нужно Разделитель классов .

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

Реализация класса Separator проста. Он переносит строку, которая возвращается при каждом вызове toString(), кроме первого вызова, который возвращает пустую строку.

...