Як видалити останній символ із рядка?


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

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

Відповіді:


665

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 це те ж саме, твій просто трохи приємніше читати :)
Marko

6
@Marko lol так, оскільки це стандарт, дивно, коли люди складають свої речі.
SSpoke

26
@AdamJensen В C ви можете випадково написати, if (str = NULL)який не завжди буде оцінювати як false (NULL == 0 == false), але й призначить значення, strяке, швидше за все, не те, що ви хотіли зробити. if (NULL = str)Однак ви не можете написати, оскільки NULL не є змінною і не може бути призначена. Отже, безпечніше умова ставити нуль зліва. Однак це не проблема в Java.
Gyan aka Gary Buyn

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

1
@KDjava: вище є дійсним з огляду на те, що переданий дійсний рядок ще мені доведеться додати блок спробувати catch, щоб перевірити правильність рядка ...
Фахім Паркар

я додав перевірку на нульову рядок раніше return str.substring(0,str.length()-1);як поліпшення
shareef

Завдяки це джерело використовується в gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS

@FahimParkar: Тому що можливо, останній символ не є символом, який ми хочемо видалити. Але що стосується питання, то ваша відповідь правильна
Ash18,

91

Оскільки ми на тему, також можна використовувати регулярні вирази

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

3
приємний спосіб, коли ви хочете / потрібно точно визначити, що ви хочете обрізати з кінця струни, а не лише X, як би це не було
Жюльєн

73

Описана проблема та запропоновані рішення іноді стосуються видалення сепараторів. Якщо це ваш випадок, то подивіться на 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" - це жахлива відповідь на питання Котліна.
Mikkel Løkke

2
@ MikkelLøkke Я не знаю, але це питання в жодному разі не питання Котліна ??
membersound


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

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

У випадку, якщо ви намагаєтеся стримати англійські слова

Стовбування - це процес скорочення схилених (або іноді похідних) слів до їхньої основи, основи чи кореневої форми - як правило, письмової словоформи.

...

Наприклад, англієць із англійської мови повинен визначити рядок "коти" (і, можливо, "котячий", "котячий" тощо) як заснований на корені "кішка", а "стебмер", "стебла", "стебло" як на основі "стебла". Створений алгоритм зводить слова "риболовля", "рибалка", "риба" та "рибалка" до кореневого слова "риба".

Різниця між люценовими стомемерами: EnglishStemmer, PorterStemmer, LovinsStemmer окреслює деякі параметри Java.


11

У Kotlin ви можете використовувати метод dropLast () класу string. Він видалить задане число з рядка, поверне новий рядок

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

9

Що стосується читабельності, я вважаю це найбільш стислим

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

Негативні індекси можна використовувати в утиліті StringUtils Apache. Усі від’ємні числа обробляються зсувом від кінця рядка.


Я б не сказав, що це найкраща відповідь - для простоти використовуйте метод 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*$", ""));

ви можете замінити "xxx" на те, що хочете, але стежте за спеціальними символами


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

Чому б не використати послідовність втечі ...!

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

Зараз життя набагато простіше. XD! ~ Легкий для читання одношаровий


Це не Java. LMAO
баранскістад

Спеціальна поведінка '\ b' інтерпретується за допомогою зчитування рядків, текстових терміналів тощо. Інакше це просто ще одне представлення символів ASCII. stackoverflow.com/a/11891895/4589003
Sudip Bhandari

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 повертає істину, коли перед ним насправді немає символу, роблячи str.length()-cutнегативним).
GPI

Так, це можливо. Це все-таки невірний рядок, але все ж - це можливо, так. Потім його слід замінити 2на Math.min(2, str.length()).
MC Імператор

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

Вихід: тест-ab


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

Я використовую це в своєму коді, це легко і просто. він працює лише тоді, коли String> 0. У мене він підключений до кнопки і всередині наступного, якщо оператор

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.