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


483

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

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 и заменяем последнюю букву ничем (удаляя ее), но каждый раз, когда я запускаю программу, она удаляет средние буквы, которые совпадают с последней буквой.

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

Ответы:


666

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

7
Я бы добавил null != str && в начале проверки.
Джеймс Оравец

12
ты имеешь в виду str != null &&!
SSpoke

2
@SSpoke это то же самое, твое немного лучше читать :)
Марко

6
@Marko LOL Да, так как это стандарт, странно, когда люди делают свои вещи.
SSpoke

26
@AdamJensen В C вы можете случайно написать, if (str = NULL)что не только всегда будет иметь значение false (NULL == 0 == false), но также назначит значение, strкоторое, скорее всего, не то, что вы хотели сделать. Однако вы не могли написать, if (NULL = str)потому что NULL не является переменной и не может быть назначен. Таким образом, безопаснее ставить NULL слева. Это не проблема в Java, хотя.
Гьян ака Гари Буйн

236

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

private static String removeLastChar(String str) {
    return str.substring(0, str.length() - 1);
}

Полный код

import java.util.*;
import java.lang.*;

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) + "==");

    }

    private static String removeLastChar(String str) {
        return str.substring(0, str.length() - 1);
    }
}

демонстрация


8
Проверка на пустую и пустую строку должна быть рассмотрена .. Версия @BobBobBob лучше
KDjava 22.12.12

1
@KDjava: выше допустимо с учетом того, что допустимая строка передана. иначе я должен был бы добавить блок try catch также, чтобы проверить правильность строки ...
Фахим Паркар

я добавил проверку на нулевую строку перед return str.substring(0,str.length()-1);улучшением
shareef

Благодаря этот источник используется в gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS

@FahimParkar: Потому что, возможно, последний символ не тот, который мы хотим удалить. Но по вопросу, ваш ответ правильный
Ash18

91

Поскольку мы находимся на тему, можно использовать регулярные выражения тоже

"aaabcd".replaceFirst(".$",""); //=> aaabc  

3
хороший способ, когда вы хотите / должны точно определить, что вы хотите обрезать от конца строки, а не только X независимо от символов
Julien

74

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

Пример:

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

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


Вот JAR для вышеупомянутых StringUtils: commons.apache.org/proper/commons-lang/download_lang.cgi
Тони Х.

47
public String removeLastChar(String s) {
    if (s == null || s.length() == 0) {
        return s;
    }
    return s.substring(0, s.length()-1);
}

4
Что, если последний символ - суррогатная пара высокого / низкого уровня?
Роберт Аллан Хенниган Лихи

@RobertAllanHenniganLeahy Я опубликовал ответ, который обрабатывает этот сценарий.
Патрик Паркер

33

Не пытайтесь заново изобретать колесо, в то время как другие уже написали библиотеки для работы со строками: org.apache.commons.lang3.StringUtils.chop()


2
Если вы хотите удалить ТОЛЬКО последний символ - это лучший ответ!
iaforek

Нет, это не так, потому что «использовать Java» - ужасный ответ на вопрос котлина.
Миккель Лёкке

2
@ MikkelLøkke Я не знаю, но этот вопрос не является вопросом Kotlin в любом случае ??
membersound

19

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

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

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

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

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

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

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

...

Например, для английского языка в стеммере следует указывать строку «кошки» (и, возможно, «кошачьи», «кошачий» и т. Д.) Как основанную на корне «кошка», а слова «стеммер», «стволовый», «стволовый» как основанный на "стебле". Алгоритм stemming сводит слова «рыбалка», «выловленный», «рыба» и «рыболов» к корневому слову «рыба».

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


11

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

var string1 = "Some Text"
string1 = string1.dropLast(1)

9

Что касается читабельности, я считаю это наиболее кратким

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

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


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

4

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

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

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

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

Вы можете заменить «ххх» на то, что вы хотите, но будьте осторожны с особыми символами


4
 // creating StringBuilder
 StringBuilder builder = new StringBuilder(requestString);
 // removing last character from String
 builder.deleteCharAt(requestString.length() - 1);


3

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

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

2
// Remove n last characters  
// System.out.println(removeLast("Hello!!!333",3));

public String removeLast(String mes, int n) {
    return mes != null && !mes.isEmpty() && mes.length()>n
         ? mes.substring(0, mes.length()-n): mes;
}

// Leave substring before character/string  
// System.out.println(leaveBeforeChar("Hello!!!123", "1"));

public String leaveBeforeChar(String mes, String last) {
    return mes != null && !mes.isEmpty() && mes.lastIndexOf(last)!=-1
         ? mes.substring(0, mes.lastIndexOf(last)): mes;
}

2

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

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

2

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

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

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


Разве это не Java? LMAO
baranskistad

Особое поведение '\ b' интерпретируется читателем строк, текстовыми терминалами и т. Д., Иначе это просто еще одно символьное представление ASCII. stackoverflow.com/a/11891895/4589003
Судип Бхандари

2

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

Например, символ 𝕫 (кодовая точка 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);
}

На углу дела: это может бросить IndexOutOfBoundsException? (например, возможно ли, что Character.isSurrogate вернет true, когда перед ним фактически нет символа, что str.length()-cutотрицательно).
GPI

Да, это возможно В любом случае, это неверная строка, но все же - возможно, да. Затем следует заменить 2на Math.min(2, str.length()).
MC Emperor

1

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


1
 "String name" = "String name".substring(0, ("String name".length() - 1));

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

if ("String name".length() > 0) {
    "String name" = "String name".substring(0, ("String name".length() - 1));
}

1
public String removeLastCharacter(String str){
       String result = null;
        if ((str != null) && (str.length() > 0)) {
          return str.substring(0, str.length() - 1);
        }
        else{
            return "";
        }

}

0

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


0

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

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"

0

Вот ответ, который работает с кодовыми точками вне Базовой многоязычной плоскости (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())));
}

0

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

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


0

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

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

0

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

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

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


0

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

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

-1

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

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]);
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.