Удалить последний символ StringBuilder? - PullRequest
374 голосов
/ 03 августа 2010

Когда вам нужно перебрать коллекцию и сделать строку каждого из данных, разделенных разделителем, вы всегда получите дополнительный разделитель в конце, например,

for (String serverId : serverIds) {
  sb.append(serverId);
   sb.append(",");
}

Дает что-то вроде: serverId_1, serverId_2, serverId_3,

Я хотел бы удалить последний символ в StringBuilder (не преобразовывая его, потому что он мне все еще нужен после этого цикла).

Ответы [ 16 ]

4 голосов
/ 03 августа 2010

Еще одна альтернатива:

public String join(Collection<String> collection, String seperator) {
    if (collection.isEmpty()) return "";

    Iterator<String> iter = collection.iterator();
    StringBuilder sb = new StringBuilder(iter.next());
    while (iter.hasNext()) {
        sb.append(seperator);
        sb.append(iter.next());
    }

    return sb.toString();
}
3 голосов
/ 26 февраля 2016

Чтобы избежать повторного ввода (повлиять на производительность) prefix, используйте TextUtils.isEmpty:

            String prefix = "";
            for (String item : list) {
                sb.append(prefix);
                if (TextUtils.isEmpty(prefix))
                    prefix = ",";
                sb.append(item);
            }
1 голос
/ 01 июля 2016

Вы можете попробовать использовать класс Joiner вместо удаления последнего символа из вашего сгенерированного текста;

                List<String> textList = new ArrayList<>();
                textList.add("text1");
                textList.add("text2");
                textList.add("text3");

                Joiner joiner = Joiner.on(",").useForNull("null");
                String output = joiner.join(textList);

               //output : "text1,text2,text3"
1 голос
/ 06 апреля 2015

Я делаю что-то вроде ниже:

    StringBuilder stringBuilder = new StringBuilder();
    for (int i = 0; i < value.length; i++) {
        stringBuilder.append(values[i]);
        if (value.length-1) {
            stringBuilder.append(", ");
        }
    }
0 голосов
/ 21 февраля 2018

Мне лично нравится добавлять символ возврата (или больше для более длинного «разделителя») в конце:

for(String serverId : serverIds) {
    sb.append(serverId);
    sb.append(",");
}

sb.append('\b');

Обратите внимание, что у него есть проблемы:

  • способ отображения \b зависит от среды,
  • length() содержимого String может отличаться от длины "видимых" символов

Когда \b выглядит нормально и длина не имеет значения, например, для входа в консоль, мне это кажется достаточно хорошим.

0 голосов
/ 22 декабря 2016

Вот еще одно решение:

for(String serverId : serverIds) {
   sb.append(",");
   sb.append(serverId); 
}

String resultingString = "";
if ( sb.length() > 1 ) {
    resultingString = sb.substring(1);
}
...