Последняя итерация улучшена для цикла в Java

Я думаю, что ваша проблема в том, что часть вашего массива итоговых полей имеет только значение, а другая - ключ и значение. Попробуйте изменить это:

-     'Descrizione',
+     'Description' => 'Descrizione',
134
задан John Strood 30 May 2016 в 10:14
поделиться

17 ответов

Другая альтернатива должна добавить запятую перед добавлением меня, просто не на первом повторении. (Не используйте "" + i, между прочим - Вы действительно не хотите конкатенацию здесь, и StringBuilder имеет совершенно хорошее, добавляют (международную) перегрузку.)

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

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

Хорошая вещь об этом состоит в том, что это будет работать с любым Iterable - Вы не можете всегда индексировать вещи. ("Добавляют запятая и затем удаляют его в конце", хорошее предложение, когда Вы действительно используете StringBuilder - но это не работает на вещи как запись в потоки. Это - возможно лучший подход для этой точной проблемы все же.)

220
ответ дан 23 November 2019 в 23:48
поделиться

Два обходных пути здесь:

1: Apache палата общин представляет Utils в виде строки

2: Сохраните булевскую переменную названной first, набор к истинному. В каждом повторении, если first ложь, добавьте свою запятую; после этого, набор first ко лжи.

0
ответ дан 23 November 2019 в 23:48
поделиться

Если Вы только превращаете, массив в запятую разграничил массив, много языков имеют функцию соединения для точно этого. Это превращает массив в строку с разделителем между каждым элементом.

0
ответ дан 23 November 2019 в 23:48
поделиться

Другой подход должен иметь длину массива (при наличии) сохраненного в отдельной переменной (более эффективный, чем перепроверка длины каждый раз). Можно затем сравнить индекс с той длиной, чтобы определить, добавить ли заключительную запятую.

Править: Другое соображение взвешивает стоимость производительности удаления последнего символа (который может вызвать строковую копию) против наличия условного выражения быть проверенным в каждом повторении.

0
ответ дан 23 November 2019 в 23:48
поделиться

Вот решение:

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

Ищите первое повторение :)  

2
ответ дан 23 November 2019 в 23:48
поделиться

Еще одна опция.

StringBuilder builder = new StringBuilder();
for(int i : array)
    builder.append(',').append(i);
String text = builder.toString();
if (text.startsWith(",")) text=text.substring(1);
1
ответ дан 23 November 2019 в 23:48
поделиться

Многие решения, описанные здесь, немного чрезмерны, по моему скромному мнению, особенно те, которые полагаются на внешние библиотеки. Существует хорошая чистая, ясная идиома для достижения списка разделенных запятой значений, который я всегда использовал. Это полагается на условный (?) оператор:

Править: Исходное корректное решение, но неоптимальное согласно комментариям. Попытка во второй раз:

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

Там Вы идете в 4 строках кода включая объявление массива и StringBuilder.

1
ответ дан 23 November 2019 в 23:48
поделиться

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

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

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

3
ответ дан 23 November 2019 в 23:48
поделиться

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

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

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() от Ленга свободного городского населения.

4
ответ дан 23 November 2019 в 23:48
поделиться

сохраните это простым и используйте стандарт для цикла:

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

или просто используйте апачского Ленга свободного городского населения StringUtils.join ()

5
ответ дан 23 November 2019 в 23:48
поделиться

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

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

Необходимо перенести все это в оператор "if" на всякий случай, Вы имеете дело с массивом нулевой длины.

6
ответ дан 23 November 2019 в 23:48
поделиться

Это - почти повторение этого вопроса о StackOverflow. То, что Вы хотите, является StringUtils, и назвать метод соединения.

StringUtils.join(strArr, ',');
15
ответ дан 23 November 2019 в 23:48
поделиться

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

    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]);
        }
    }
14
ответ дан 23 November 2019 в 23:48
поделиться

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

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

 StringBuffer buffer = new StringBuffer();
 Iterator iter = s.iterator();
 while (iter.hasNext()) {
      buffer.append(iter.next());
      if (iter.hasNext()) {
            buffer.append(delimiter);
      }
 }
31
ответ дан 23 November 2019 в 23:48
поделиться

Другой способ сделать это:

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

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

143
ответ дан 23 November 2019 в 23:48
поделиться

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

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

39
ответ дан 23 November 2019 в 23:48
поделиться

На основе java.util. AbstractCollection.toString (), это выходит рано для предотвращения разделителя.

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

Это эффективно и изящно, но не так самоочевидно как некоторые из других ответов.

3
ответ дан 23 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: