Я думаю, что ваша проблема в том, что часть вашего массива итоговых полей имеет только значение, а другая - ключ и значение. Попробуйте изменить это:
- 'Descrizione',
+ 'Description' => 'Descrizione',
Другая альтернатива должна добавить запятую перед добавлением меня, просто не на первом повторении. (Не используйте "" + 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 - но это не работает на вещи как запись в потоки. Это - возможно лучший подход для этой точной проблемы все же.)
Два обходных пути здесь:
1: Apache палата общин представляет Utils в виде строки
2: Сохраните булевскую переменную названной first
, набор к истинному. В каждом повторении, если first
ложь, добавьте свою запятую; после этого, набор first
ко лжи.
Если Вы только превращаете, массив в запятую разграничил массив, много языков имеют функцию соединения для точно этого. Это превращает массив в строку с разделителем между каждым элементом.
Другой подход должен иметь длину массива (при наличии) сохраненного в отдельной переменной (более эффективный, чем перепроверка длины каждый раз). Можно затем сравнить индекс с той длиной, чтобы определить, добавить ли заключительную запятую.
Править: Другое соображение взвешивает стоимость производительности удаления последнего символа (который может вызвать строковую копию) против наличия условного выражения быть проверенным в каждом повторении.
Вот решение:
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;
}
Ищите первое повторение :)
Еще одна опция.
StringBuilder builder = new StringBuilder();
for(int i : array)
builder.append(',').append(i);
String text = builder.toString();
if (text.startsWith(",")) text=text.substring(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]);
Там Вы идете в 4 строках кода включая объявление массива и StringBuilder.
Вам нужен Разделитель Класса.
Separator s = new Separator(", ");
for(int i : array)
{
builder.append(s).append(i);
}
Реализация класса Separator
является прямым. Это переносит строку, которая возвращается на каждом вызове toString()
за исключением первого вызова, который возвращает пустую строку.
Если Вы преобразовываете его в классический индексный цикл, да.
Или Вы могли просто удалить последнюю запятую после того, как она сделана. Как так:
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()
от Ленга свободного городского населения.
сохраните это простым и используйте стандарт для цикла:
for(int i = 0 ; i < array.length ; i ++ ){
builder.append(array[i]);
if( i != array.length - 1 ){
builder.append(',');
}
}
или просто используйте апачского Ленга свободного городского населения StringUtils.join ()
Явные циклы всегда работают лучше, чем неявные.
builder.append( "" + array[0] );
for( int i = 1; i != array.length; i += 1 ) {
builder.append( ", " + array[i] );
}
Необходимо перенести все это в оператор "if" на всякий случай, Вы имеете дело с массивом нулевой длины.
Это - почти повторение этого вопроса о StackOverflow. То, что Вы хотите, является StringUtils, и назвать метод соединения.
StringUtils.join(strArr, ',');
Другое решение (возможно, самое эффективное)
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]);
}
}
Возможно, Вы используете неправильный инструмент для Задания.
Это - больше руководства, чем, что Вы делаете, но это способом более изящно если совсем не "старая школа"
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
while (iter.hasNext()) {
buffer.append(iter.next());
if (iter.hasNext()) {
buffer.append(delimiter);
}
}
Другой способ сделать это:
String delim = "";
for (int i : ints) {
sb.append(delim).append(i);
delim = ",";
}
Обновление: Для Java 8 у Вас теперь есть Коллекторы
Могло бы быть легче всегда добавить. И затем, когда Вы сделаны с Вашим циклом, просто удаляют последний символ. Тонны меньше условных выражений это слишком.
Можно использовать StringBuilder
deleteCharAt(int index)
с индексом тем, чтобы быть length() - 1
На основе java.util. AbstractCollection.toString (), это выходит рано для предотвращения разделителя.
StringBuffer buffer = new StringBuffer();
Iterator iter = s.iterator();
for (;;) {
buffer.append(iter.next());
if (! iter.hasNext())
break;
buffer.append(delimiter);
}
Это эффективно и изящно, но не так самоочевидно как некоторые из других ответов.