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

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

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

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

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

Ответы [ 16 ]

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

Другие указали на метод deleteCharAt, но есть еще один альтернативный подход:

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

В качестве альтернативы используйте класс Joiner из Гуава :)

Начиная с Java 8, StringJoiner является частью стандартного JRE.

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

Другое простое решение:

sb.setLength(sb.length() - 1);

Более сложное решение:

Приведенное выше решение предполагает, что sb.length() > 0 ... т.е. есть «последний символ», который нужно удалить. Если вы не можете сделать это предположение и / или не можете справиться с исключением, которое возникнет, если это предположение неверно, сначала проверьте длину StringBuilder; например, * +1008 *

// Readable version
if (sb.length() > 0) {
   sb.setLength(sb.length() - 1);
}

или

// Concise but harder-to-read version of the above.
sb.setLength(Math.max(sb.length() - 1, 0));
162 голосов
/ 03 августа 2010
sb.deleteCharAt(sb.length() - 1) 
58 голосов
/ 20 марта 2015

Начиная с Java 8, класс String имеет статический метод join.Первый аргумент - это строка, которую вы хотите видеть между каждой парой строк, а второй - Iterable<CharSequence> (оба являются интерфейсами, поэтому работает что-то вроде List<String>. Поэтому вы можете просто сделать это:

String.join(",", serverIds);

Также в Java 8 вы можете использовать новый класс StringJoiner для сценариев, в которых вы хотите начать конструирование строки до того, как у вас будет полный список элементов для ее вставки.

34 голосов
/ 13 апреля 2012

В этом случае

sb.setLength(sb.length() - 1);

предпочтительнее, поскольку он просто присваивает последнее значение '\0', тогда как удаление последнего символа приводит к System.arraycopy

30 голосов
/ 13 октября 2015

Просто получите позицию последнего вхождения символа.

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

Поскольку lastIndexOf выполнит обратный поиск, и вы знаете, что он найдет с первой попытки, производительность не будетвопрос здесь.

РЕДАКТИРОВАТЬ

Поскольку я продолжаю поднимать свой ответ (спасибо, ребята ?), стоит учитывать следующее:

Вкл. Java 8 и далее было бы более разборчивым и явным использование StringJoiner .У него есть один метод для простого разделителя и перегрузка для префикса и суффикса.

Примеры, взятые здесь: пример

Пример с использованием простогоразделитель:

    StringJoiner mystring = new StringJoiner("-");    

    // Joining multiple strings by using add() method  
    mystring.add("Logan");  
    mystring.add("Magneto");  
    mystring.add("Rogue");  
    mystring.add("Storm");  

    System.out.println(mystring);

Выход:

Логан-Магнит-Разбойник-Шторм

Пример с суффиксом и префиксом:

    StringJoiner mystring = new StringJoiner(",", "(", ")");    

    // Joining multiple strings by using add() method  
    mystring.add("Negan");  
    mystring.add("Rick");  
    mystring.add("Maggie");  
    mystring.add("Daryl");  

    System.out.println(mystring);

Выход

(Неган, Рик, Мэгги,Дэрил)

12 голосов
/ 27 декабря 2015

С Java-8 вы можете использовать статический метод класса String,

String#join(CharSequence delimiter,Iterable<? extends CharSequence> elements).


public class Test {

    public static void main(String[] args) {

        List<String> names = new ArrayList<>();
        names.add("James");
        names.add("Harry");
        names.add("Roy");
        System.out.println(String.join(",", names));
    }
}

ВЫХОД

James,Harry,Roy
10 голосов
/ 26 декабря 2011

Другая альтернатива

for(String serverId : serverIds) {
   sb.append(",");
   sb.append(serverId); 
}
sb.deleteCharAt(0);
8 голосов
/ 03 августа 2010

В качестве альтернативы

StringBuilder result = new StringBuilder();
for(String string : collection) {
    result.append(string);
    result.append(',');
}
return result.substring(0, result.length() - 1) ;
5 голосов
/ 03 августа 2010
StringBuilder sb = new StringBuilder();
sb.append("abcdef");
sb.deleteCharAt(sb.length() - 1);
assertEquals("abcde",sb.toString());
// true
...