Как удалить последний символ в stringbuilder java
Перейти к содержимому

Как удалить последний символ в stringbuilder java

  • автор:

Как удалить символ из string java

Строки в Java являются неизменяемыми, поэтому удалить символ из строки не получится, но можно создать новую строку на основе исходной, в которой будут отсутствовать некоторые символы. Как вариант, можно воспользоваться методом строки substring​(int beginIndex, int endIndex) , который вернёт новую строку, начиная с позиции beginIndex до позиции (не включая) endIndex

"hamburger".substring(4, 8); // "urge" 

Возможна также передача в метод только одного параметра beginIndex , в этом случае метод вернёт подстроку, начиная с индекса beginIndex и до конца строки

"unhappy".substring(2); // "happy" 

Если нужно удалить како-то конкретный символ, можно воспользоваться методом replaceAll() . Этот метод возвращает новую строку, в которой заменяет все подстроки, которые соответствует регулярному выражению:

// Заменяем в слове подстроку "l" на пустую строку, то есть удаляем её "world".replaceAll("l", ""); // "word" 

Как удалить последний символ строки без помощи метода Remove?

Допустим имеем код, который выбросит argumentoutofrangeexception, если длина строки превышает максимально допустимое значение типа int, так как для метода Remove не имеется переопределения для более объёмных типов ЦЧ переменных, чем int:

if (_input[0] == _input[_input.Length — 1]) _input = _input.Remove(0, 1);
_input = _input.Remove(_input.Length — 1); // 1. Требуется заменить
>

Вопрос : есть ли такой метод для String, которым можно заменить помеченную комментарием строчку, если код ниже гарантированно выведет на консоль значение false?

  • Вопрос задан более трёх лет назад
  • 626 просмотров

1 комментарий

Простой 1 комментарий

Удаление последнего символа в StringBuilder?

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

Поделиться Источник 03 августа 2010 в 09:41

17 ответов

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

String prefix = ""; for (String serverId : serverIds)

В качестве альтернативы, используйте класс Joiner из Guava 🙂

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

Поделиться 03 августа 2010 в 09:49

Еще одно простое решение:

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

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

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

// Readable version if (sb.length() > 0)
// Concise but harder-to-read version of the above. sb.setLength(Math.max(sb.length() - 1, 0)); 

Поделиться 03 августа 2010 в 09:47

if(sb.length() > 0)

Поделиться 03 августа 2010 в 09:43

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

String.join(",", serverIds); 

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

Поделиться 20 марта 2015 в 14:43

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

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

Поделиться 13 октября 2015 в 13:54

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

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

Поделиться 12 апреля 2012 в 20:13

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

public class Test < public static void main(String[] args) < Listnames = new ArrayList<>(); names.add("James"); names.add("Harry"); names.add("Roy"); System.out.println(String.join(",", names)); > > 

OUTPUT

James,Harry,Roy 

Поделиться 27 декабря 2015 в 04:29

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

for(String serverId : serverIds) < sb.append(","); sb.append(serverId); >sb.deleteCharAt(0); 

Поделиться 26 декабря 2011 в 09:28

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

StringBuilder result = new StringBuilder(); for(String string : collection) < result.append(string); result.append(','); >return result.substring(0, result.length() - 1) ; 

Поделиться 03 августа 2010 в 09:51

StringBuilder sb = new StringBuilder(); sb.append("abcdef"); sb.deleteCharAt(sb.length() - 1); assertEquals("abcde",sb.toString()); // true 

Поделиться 03 августа 2010 в 09:48

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

public String join(Collection collection, String seperator) < if (collection.isEmpty()) return ""; Iteratoriter = collection.iterator(); StringBuilder sb = new StringBuilder(iter.next()); while (iter.hasNext()) < sb.append(seperator); sb.append(iter.next()); >return sb.toString(); > 

Поделиться 03 августа 2010 в 11:33

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

 String prefix = ""; for (String item : list)

Поделиться 26 февраля 2016 в 09:14

Я довольно часто делал это, поэтому написал бенчмарк для 3 основных техник разделителя приложений:

(бенчмарк с правильным нагреванием и 100 раундами из 100 000 итераций)

«Прибавить после»

static void appendAfter() < sb.append('<'); for (int i = 0; i < 10; i++) < sb.append('"'); sb.append(i); sb.append('"'); sb.append(':'); sb.append(i); sb.append(','); >sb.setLength(sb.length() - 1); sb.append('>'); > 

«Прибавить перед»

static void appendBefore() < sb.append('<'); String delimiter = ""; for (int i = 0; i < 10; i++) < sb.append(delimiter); sb.append('"'); sb.append(i); sb.append('"'); sb.append(':'); sb.append(i); delimiter = ","; >sb.append('>'); > 

«Прибавить может»

static void appendMaybe() < sb.append('<'); for (int i = 0; i < 10; i++) < sb.append('"'); sb.append(i); sb.append('"'); sb.append(':'); sb.append(i); if (i < 9) < sb.append(','); >> sb.append('>'); > 

Я получил следующие результаты:

Platform Append After Append Before Append Maybe
Windows Server 2016, Java 11 — Hotspot 26ms 40ms 26ms
Windows Server 2016, Java 8 — Hotspot 27ms 36ms 21ms
Windows Server 2016, Java 11 — OpenJ9 63ms 81ms 59ms
Windows Server 2016, Java 8 — OpenJ9 66ms 64ms 55ms

Помимо того, что я самый быстрый, я считаю, что реализация «Прибавить может» показывает намерение кода лучшего. Это обычно более важно, чем доля наносекунд, полученная за одну итерацию.

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

Поделиться 05 апреля 2021 в 00:48

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

 List 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" 

Поделиться 01 июля 2016 в 13:59

Я делаю что-то вроде следующего:

 StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < value.length; i++) < stringBuilder.append(values[i]); if (value.length-1) < stringBuilder.append(", "); >> 

Поделиться 06 апреля 2015 в 08:49

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

for(String serverId : serverIds) < sb.append(","); sb.append(serverId); >String resultingString = ""; if ( sb.length() > 1 )

Поделиться 22 декабря 2016 в 11:53

stringBuilder.Remove(stringBuilder.Length — 1, 1);

Как удалить последний символ в строке java

Строки в Java неизменяемы, поэтому удаление символа из строки сводится к формированию новой строки на основе старой, в которой будет отсутствовать последний символ. Для этого можно использовать класс StringBuilder :

var word = "Apple"; var newWord = new StringBuilder(word) .deleteCharAt(word.length() - 1) .toString(); System.out.println(newWord); // => Appl 

17 ноября 2022

Можно с помощью метода substring()

String newWord = word.substring(0, word.length() - 1); 

Чтобы избежать ошибки, можно с проверкой на null и пустую строку :

String newWord = (word == null || word.length() == 0) ? null : word.substring(0, word.length() - 1); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *