Как удалить символ из 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);