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

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

public String method(String str) {
    if (str.charAt(str.length()-1)=='x'){
        str = str.replace(str.substring(str.length()-1), "");
        return str;
    } else{
        return str;
    }
}

Получение длины строки - 1 и замена последней буквы ничем (удаление ее), но каждый раз, когда я запускаю программу, она удаляет средние буквы, которые совпадают с последней буквой.

Например, слово «поклонник»; после запуска метода я получаю "admie". Я хочу вернуть слово восхищаться.


person Community    schedule 15.09.2011    source источник


Ответы (32)


replace заменит все вхождения буквы. Все, что вам нужно сделать, это использовать substring():

public String method(String str) {
    if (str != null && str.length() > 0 && str.charAt(str.length() - 1) == 'x') {
        str = str.substring(0, str.length() - 1);
    }
    return str;
}
person Gyan aka Gary Buyn    schedule 15.09.2011
comment
Я бы добавил null != str && в начале проверки. - person James Oravec; 28.09.2013
comment
ты имеешь ввиду str != null &&! - person SSpoke; 09.02.2014
comment
@SSpoke, это то же самое, только твой читать немного приятнее :) - person Marko; 26.06.2014
comment
@Marko lol да, раз уж это стандарт, то странно, когда люди придумывают свои собственные вещи. - person SSpoke; 26.06.2014
comment
@SSpoke @Marko Я согласен, что твое лучше читать SSpoke. Причина, по которой некоторые люди пишут это так, как это сделал VenomFangs, заключается в том, что на некоторых языках (я смотрю на вас C) вы можете писать str = null в операторе if, но не null = str, поэтому установка нуля сначала останавливает вас от этой ошибки. - person Gyan aka Gary Buyn; 30.06.2014
comment
@GaryBuyn, как это помешает тебе совершить ошибку? - person Adam Jensen; 25.07.2014
comment
@AdamJensen В C вы можете случайно написать if (str = NULL), который не только всегда будет оцениваться как false (NULL == 0 == false), но также будет присваивать значение str, что, скорее всего, не то, что вы хотели сделать. Однако вы не можете записать if (NULL = str), потому что NULL не является переменной и не может быть назначен. Таким образом, безопаснее ставить NULL слева. Однако это не проблема Java. - person Gyan aka Gary Buyn; 26.07.2014
comment
Если я прав, это займет время O (n), т.е. JVM будет сканировать весь список, а не O (1), как в C / C ++, где они просто перемещают значение '\ 0' вверх? - person Mangat Rai Modi; 30.10.2014
comment
@GaryBuyn C предупредит вас или выдаст ошибку. см .: -Wtautological-compare. Итак, в наши дни можно полностью сэкономить на использовании if (str = 0) ... - person user3054986; 21.12.2017
comment
str.endsWith("x") также можно использовать, чтобы определить, есть ли в строке str завершающий x. - person Justin Albano; 23.05.2018
comment
@GaryBuyn тот факт, что числа и нулевые указатели не интерпретируются как логические выражения в Java, в любом случае спасает вас. - person SomethingSomething; 05.12.2018
comment
[здесь начинающий java парень] вы действительно можете сделать str = str.something ()? Я имею в виду, я вижу, что это работает, но, конечно же, это должно противоречить концепции неизменности String? - person DraxDomax; 03.06.2020
comment
@DraxDomax В приведенном выше примере str.substring(...) создает новый экземпляр String (он не изменяет исходный экземпляр String). Затем новый String присваивается переменной str, заменяя исходный (опять же, не изменяя его). Затем оригинал будет удален из мусора, если на него нет других ссылок. - person Gyan aka Gary Buyn; 14.06.2020

Почему не только один лайнер?

public static String removeLastChar(String str) {
    return removeLastChars(str, 1);
}

public static String removeLastChars(String str, int chars) {
    return str.substring(0, str.length() - chars);
}

Полный код

public class Main {
    public static void main (String[] args) throws java.lang.Exception {
        String s1 = "Remove Last CharacterY";
        String s2 = "Remove Last Character2";
        System.out.println("After removing s1==" + removeLastChar(s1) + "==");
        System.out.println("After removing s2==" + removeLastChar(s2) + "==");
    }
    
    public static String removeLastChar(String str) {
        return removeLastChars(str, 1);
    }

    public static String removeLastChars(String str, int chars) {
        return str.substring(0, str.length() - chars);
    }
}

Демо

person Fahim Parkar    schedule 22.12.2012
comment
Следует учитывать проверку на пустую и пустую строку. Версия @BobBobBob лучше - person KDjava; 22.12.2012
comment
@KDjava: указанное выше действительно с учетом того, что передана действительная строка. иначе мне пришлось бы добавить блок try catch, чтобы проверить правильность строки ... - person Fahim Parkar; 22.12.2012
comment
Я добавил проверку на пустую строку перед return str.substring(0,str.length()-1); в качестве улучшения - person shareef; 07.07.2013
comment
Спасибо, что этот источник используется по адресу gist.github.com/CrandellWS/e254a215c54aa4be0353 - person CrandellWS; 28.04.2016
comment
@FahimParkar: Потому что возможно, что последний символ не тот, который мы хотим удалить. Но по вопросу ваш ответ правильный - person Ash18; 17.09.2018

Раз уж мы затронули тему, можно использовать и регулярные выражения.

"aaabcd".replaceFirst(".$",""); //=> aaabc  
person iddqd    schedule 27.08.2013
comment
хороший способ, когда вы хотите / должны точно определить, что вы хотите обрезать с конца строки, а не только X, какие бы символы - person Julien; 15.07.2016

Описанная проблема и предлагаемые решения иногда связаны с удалением сепараторов. Если это ваш случай, взгляните на Apache Commons StringUtils, у него есть метод под названием removeEnd, что очень элегантно.

Пример:

StringUtils.removeEnd("string 1|string 2|string 3|", "|");

Результатом будет: "строка 1 | строка 2 | строка 3"

person Mart135688    schedule 09.04.2013
comment
Вот JAR для вышеупомянутого StringUtils: commons.apache.org/proper/commons- lang / download_lang.cgi - person Tony H.; 22.06.2018

Не пытайтесь изобретать велосипед, в то время как другие уже написали библиотеки для обработки строк: _ 1_

person membersound    schedule 11.12.2013
comment
Если вы хотите удалить ТОЛЬКО последний символ - это лучший ответ! - person iaforek; 17.05.2017
comment
Нет, это не так, потому что использование Java - ужасный ответ на вопрос Kotlin. - person Mikkel Løkke; 28.03.2019
comment
@ MikkelLøkke Я не знаю, но этот вопрос в любом случае не относится к Kotlin ?? - person membersound; 29.03.2019

Использовать этот:

 if(string.endsWith("x")) {

    string= string.substring(0, string.length() - 1);
 }
person Navaneeth    schedule 27.11.2013

В Kotlin вы можете использовать метод dropLast () строкового класса. Он удалит данное число из строки, вернет новую строку

var string1 = "Some Text"
string1 = string1.dropLast(1)
person Mahavir Jain    schedule 24.01.2019

if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

Например, слово поклонник; после запуска метода я получаю сообщение. Я хочу вернуть слово восхищаться.

Если вы пытаетесь выделить английские слова

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

...

Например, стеммер для английского языка должен идентифицировать струнных котов (и, возможно, кошачьих, кошачьих и т. Д.) Как основанных на корневом коте, а стеммер, стемминг, стемминг - как основанных на стебле. Алгоритм выделения корней сокращает слова рыболовство, рыбалка, рыба и рыбак до корневого слова рыба.

Разница между стеммерами Lucene: EnglishStemmer, PorterStemmer, LovinsStemmer описывает некоторые параметры Java. .

person Mike Samuel    schedule 20.05.2013

Что касается удобочитаемости, я считаю, что это самый лаконичный

StringUtils.substring("string", 0, -1);

Отрицательные индексы можно использовать в утилите Apache StringUtils. Все отрицательные числа обрабатываются со смещением от конца строки.

person Kasturi    schedule 15.12.2016
comment
Я бы не сказал, что это лучший ответ - для простоты используйте метод org.apache.commons.lang.StringUtils.chop (). Тем не менее, трюк с -1 действительно хорош, а поиск других ответов на самом деле не используется / хорошо известен. - person iaforek; 17.05.2017

удаляет последнее появление 'xxx':

    System.out.println("aaa xxx aaa xxx ".replaceAll("xxx([^xxx]*)$", "$1"));

удаляет последнее вхождение 'xxx', если оно последнее:

    System.out.println("aaa xxx aaa  ".replaceAll("xxx\\s*$", ""));

вы можете заменить 'xxx' на то, что хотите, но будьте осторожны со специальными символами

person Arkadiusz Cieśliński    schedule 11.01.2014

 string = string.substring(0, (string.length() - 1));

Я использую это в своем коде, это легко и просто. он работает, только когда String имеет значение ›0. Я подключил его к кнопке и внутри следующего оператора if

if (string.length() > 0) {
    string = string.substring(0, (string.length() - 1));
}
person Donoso    schedule 22.10.2015

Посмотрите на класс StringBuilder:

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"
person aeocom    schedule 10.07.2015

Как можно усложнить простую задачу. Мое решение:

public String removeLastChar(String s) {
    return s[0..-1]
}

or

public String removeLastChar(String s) {
    if (s.length() > 0) {
        return s[0..-1]
    }
    return s
}
person tstempko    schedule 03.11.2020
comment
Хотел бы я проголосовать за это дважды - person Gi0rgi0s; 09.12.2020

Однострочный ответ (просто забавная альтернатива - не пробуйте это дома, и отличные ответы уже даны):

public String removeLastChar(String s){return (s != null && s.length() != 0) ? s.substring(0, s.length() - 1): s;}
person Nick Louloudakis    schedule 20.08.2014

Большинство ответов здесь забыли о суррогатных парах < / strong>.

Например, символ ???? (кодовая точка U + 1D56B) не помещается в один char, поэтому для представления он должен образовывать суррогатную пару из двух символов.

Если просто применить принятый в настоящее время ответ (используя str.substring(0, str.length() - 1), он соединит суррогатную пару, что приведет к неожиданным результатам.

Также следует включить проверку, является ли последний символ суррогатной парой:

public static String removeLastChar(String str) {
    Objects.requireNonNull(str, "The string should not be null");
    if (str.isEmpty()) {
        return str;
    }

    char lastChar = str.charAt(str.length() - 1);
    int cut = Character.isSurrogate(lastChar) ? 2 : 1;
    return str.substring(0, str.length() - cut);
}
person MC Emperor    schedule 02.08.2019
comment
В крайнем случае: может ли это когда-нибудь бросить IndexOutOfBoundsException? (например, возможно ли, что Character.isSurrogate вернет true, когда перед ним фактически нет char, что делает str.length()-cut отрицательным). - person GPI; 14.08.2019
comment
Да, это возможно. В любом случае это недействительная строка, но все же - возможно, да. Затем следует заменить 2 на Math.min(2, str.length()). - person MC Emperor; 15.08.2019

Почему бы не использовать escape-последовательность ...!

System.out.println(str + '\b');

Теперь жизнь намного проще. XD! ~ Читаемый однострочный текст

person Tilak Maddy    schedule 02.12.2016
comment
Разве это не Ява. LMAO - person baranskistad; 04.05.2018
comment
Особое поведение '\ b' интерпретируется программой чтения строк, текстовыми терминалами и т. Д. В противном случае это просто еще одно символьное представление ASCII. stackoverflow.com/a/11891895/4589003 - person Sudip Bhandari; 18.09.2018

Java 8

import java.util.Optional;

public class Test
{
  public static void main(String[] args) throws InterruptedException
  {
    System.out.println(removeLastChar("test-abc"));
  }

  public static String removeLastChar(String s) {
    return Optional.ofNullable(s)
      .filter(str -> str.length() != 0)
      .map(str -> str.substring(0, str.length() - 1))
      .orElse(s);
    }
}

Выход: test-ab

person Nadhu    schedule 30.01.2018

если у вас есть специальный символ вроде; в json просто используйте String.replace (";", ""), иначе вы должны переписать весь символ в строке за вычетом последнего.

person MoadKey    schedule 31.07.2015

Как сделать символ в рекурсии в конце:

public static String  removeChar(String word, char charToRemove)
    {
        String char_toremove=Character.toString(charToRemove);
        for(int i = 0; i < word.length(); i++)
        {
            if(word.charAt(i) == charToRemove)
            {
                String newWord = word.substring(0, i) + word.substring(i + 1);
                return removeChar(newWord,charToRemove);
            }
        }
        System.out.println(word);
        return word;
    }

например:

removeChar ("hello world, let's go!",'l') → "heo word, et's go!llll"
removeChar("you should not go",'o') → "yu shuld nt goooo"
person simon francis    schedule 26.05.2018

Вот ответ, который работает с кодовыми точками за пределами базовой многоязычной плоскости (Java 8+).

Использование потоков:

public String method(String str) {
    return str.codePoints()
            .limit(str.codePoints().count() - 1)
            .mapToObj(i->new String(Character.toChars(i)))
            .collect(Collectors.joining());
}

Может быть, более эффективно:

public String method(String str) {
    return str.isEmpty()? "": str.substring(0, str.length() - Character.charCount(str.codePointBefore(str.length())));
}
person Patrick Parker    schedule 08.06.2018

Мы можем использовать подстроку. Вот пример,

public class RemoveStringChar 
{
    public static void main(String[] args) 
    {   
        String strGiven = "Java";
        System.out.println("Before removing string character - " + strGiven);
        System.out.println("After removing string character - " + removeCharacter(strGiven, 3));
    }

    public static String removeCharacter(String strRemove, int position)
    {   
        return strRemove.substring(0, position) + strRemove.substring(position + 1);    
    }
}
person Shiva    schedule 28.06.2018

просто замените условие «если» следующим образом:

if(a.substring(a.length()-1).equals("x"))'

это поможет вам.

person Syed Salman Hassan    schedule 07.08.2019

Предположим, что общая длина моей строки = 24. Я хочу обрезать последний символ после позиции 14 до конца, то есть я хочу, чтобы там было начало 14. Поэтому я применяю следующее решение.

String date = "2019-07-31T22:00:00.000Z";
String result = date.substring(0, date.length() - 14);
person Avinash Khadsan    schedule 14.08.2019

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

static String removeChar(String word, char charToRemove)
{
    for(int i = 0; i < word.lenght(); i++)
    {
        if(word.charAt(i) == charToRemove)
        {
            String newWord = word.substring(0, i) + word.substring(i + 1);
            return removeChar(newWord, charToRemove);
        }
    }

    return word;
}

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

person Jacob Mehnert    schedule 08.11.2017

Очень просто:

StringBuilder sb= new StringBuilder();
for(Entry<String,String> entry : map.entrySet()) {
        sb.append(entry.getKey() + "_" + entry.getValue() + "|");
}
String requiredString = sb.substring(0, sb.length() - 1);
person RoboC    schedule 22.01.2020

Для котлина проверьте

    val string = "<<<First Grade>>>"
    println(string.drop(6)) // st Grade>>>
    println(string.dropLast(6)) // <<<First Gr
    println(string.dropWhile { !it.isLetter() }) // First Grade>>>
    println(string.dropLastWhile { !it.isLetter() }) // <<<First Grade
person user9272445    schedule 19.03.2020

Если вы хотите удалить определенный символ в конце, вы можете использовать:

myString.removeSuffix("x")
person Ivo Stoyanov    schedule 30.09.2020

Используйте StringUtils.Chop (Str), он также заботится о нулевых и пустых строках, вам нужно импортировать common-io:

    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.8.0</version>
    </dependency>
person Baha' Al-Khateib    schedule 15.03.2021

если мы хотим удалить расширение данного файла,

** Образец кода

 public static String removeNCharactersFromLast(String str,int n){
    if (str != null && (str.length() > 0)) {
        return str.substring(0, str.length() - n);
    }

    return "";

}
person vasanthakumar jagannathan    schedule 20.07.2021

Это единственный способ удалить последний символ в строке:

Scanner in = new Scanner(System.in);
String s = in.nextLine();
char array[] = s.toCharArray();
int l = array.length;
for (int i = 0; i < l-1; i++) {
    System.out.print(array[i]);
}
person alagu raja    schedule 31.08.2016

вы можете сделать i hereString = hereString.replace (hereString.chatAt (hereString.length () - 1), 'whitespeace');

person abd ak    schedule 06.02.2019

person    schedule
comment
Что, если последний символ - суррогатная пара high / low? - person Robert Allan Hennigan Leahy; 20.05.2013
comment
@RobertAllanHenniganLeahy Я опубликовал ответ, который описывает этот сценарий. - person Patrick Parker; 09.06.2018