Удалить Последнюю Запятую


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

Как это может быть более элегантным?

List<String> paramList = new ArrayList<String>( );
paramList.add( "param1" );
paramList.add( "param2" );

StringBuilder result = new StringBuilder();
for ( String p : paramList )
{
  result.append( p ).append( ", " );
}

String withoutLastComma = result.substring( 0, result.length( ) - ", ".length( ) );
System.err.println( withoutLastComma );


42797
144
задан 19 апреля 2011 в 09:04 Источник Поделиться
Комментарии
8 ответов

Можно использовать строку служебных методов, таких как StringUtil.присоединяйтесь для объединения элементов в массиве или коллекции объектов. Обратитесь к StringUtil АФИ StringUtil.присоединиться к записи.

Например:

StringUtils.join(["a", "b", "c"], "--")  // => "a--b--c"

113
ответ дан 19 апреля 2011 в 10:04 Источник Поделиться

for ( String p : paramList )
{
if (result.length() > 0) result.append( ", " );
result.append( p );
}

90
ответ дан 19 апреля 2011 в 10:04 Источник Поделиться

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

int size = paramList.size();
if (size > 0) {
result.append(paramList.get(0));
for (int i = 1; i < size; ++i) {
result.append(", ").append(paramList.get(i));
}
}

42
ответ дан 19 апреля 2011 в 12:04 Источник Поделиться

Одним из возможных способов является использование Столяр от компании Google гуава библиотеки:

result = Joiner.on(", ").join(paramList);

34
ответ дан 19 апреля 2011 в 10:04 Источник Поделиться

Вот странно что никто не упомянул итератор-мудрый подход.

Так вот он идет:

public static <E> String join(Iterable<E> iterable, String delim) {
Iterator<E> iterator = iterable.iterator();
if (!iterator.hasNext()) {
return "";
}

StringBuilder builder = new StringBuilder(iterator.next().toString());
while (iterator.hasNext()) {
builder.append(delim).append(iterator.next().toString());
}

return builder.toString();
}

Не возиться с индексами, substringing и т. д. и т. п.

И давайте использовать его:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
System.out.println(join(list, ", "));

Обновление:
НПЭ-безопасным подходом было бы избежать, используя метод toString() на следующем() (спасибо @Дэвид Харкнесс):

public static <E> String join(Iterable<E> iterable, String delim) {
Iterator<E> iterator = iterable.iterator();
if (!iterator.hasNext()) {
return "";
}

StringBuilder builder = new StringBuilder(iterator.next());
while (iterator.hasNext()) {
builder.append(delim).append(iterator.next());
}

return builder.toString();
}

17
ответ дан 7 февраля 2013 в 08:02 Источник Поделиться

То, что я использую-это переменная, которая инициализируется как пустой, а затем установить внутри цикла.

List<String> paramList = new ArrayList<String>( );
paramList.add("param1");
paramList.add("param2");

String separator = "";

StringBuilder result = new StringBuilder();
for (String p : paramList)
{
result.append(separator)
result.append(p);
separator = ", ";
}

System.err.println(result.toString());

15
ответ дан 27 марта 2013 в 07:03 Источник Поделиться

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

Это может быть немного яснее, хотя и не сильно, используя lastIndexOf:

String withoutLastComma = result.substring(0, result.lastIndexOf(","));

Или просто рефакторинг немного, что может быть более толковый:

StringBuilder result = new StringBuilder();
for (int i = 0; i < paramList.size(); i++)
{
result.append(paramList.get(i));
if (i + 1 != paramList.size())
result.append(", ");
}
System.err.println(result);

Или, наконец, использовать строку утилиты, библиотеки связаны друг с другом в других ответов; хотя, думал, что делать это приносит термин 'кувалду, чтобы расколоть орех' на ум, но это вполне может быть оправдано в зависимости от того, какие другие операции требуется выполнять.

11
ответ дан 19 апреля 2011 в 10:04 Источник Поделиться

String listString = Arrays.toString(paramList.toArray());
System.err.println( listString );

Вернется:

[param1, param2]

Это имеет дополнительное преимущество, используя строку.метод valueOf(Object) метод, который будет печатать 'нуль' в случае нулевого объектов. Массивы.toString() метод также является довольно прямо вперед, если вы просто хотите реализовать это.
Снять квадратные скобки:

    int iMax = paramList.size() - 1;
if (iMax == -1) {
return "";
}
String[] params = paramList.toArray();
StringBuilder b = new StringBuilder();
for (int i = 0; ; i++) {
String param = params[i];
b.append(param);
if (i == iMax) {
return b.toString();
}
b.append(", ");
}

4
ответ дан 19 мая 2011 в 03:05 Источник Поделиться