Jak usunąć ostatni znak z ciągu?

483

Chcę usunąć ostatni znak z ciągu. Próbowałem to zrobić:

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

Pobieranie długości ciągu - 1 i zastępowanie ostatniej litery niczym (usuwanie), ale za każdym razem, gdy uruchamiam program, usuwa środkowe litery, które są takie same jak ostatnia litera.

Na przykład słowo to „wielbiciel”; po uruchomieniu metody pojawia się „admie”. Chcę, żeby to zwróciło słowo podziw.

Ankush soni
źródło

Odpowiedzi:

665

replacezastąpi wszystkie wystąpienia listu. Wszystko, co musisz zrobić, to użyć 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;
}
Gyan alias Gary Buyn
źródło
7
Dodałbym null != str && na początku kontroli.
James Oravec
12
masz na myśli str != null &&!
SSpoke
2
@SSpoke to to samo, twoje jest trochę ładniejsze do czytania :)
Marko
6
@Marko lol tak, ponieważ jest to standard, czuje się dziwnie, gdy ludzie wymyślają własne rzeczy.
SSpoke
26
@AdamJensen W C możesz przypadkowo napisać, if (str = NULL)co nie tylko zawsze da wartość false (NULL == 0 == false), ale także przypisze wartość, do strktórej najprawdopodobniej nie chcesz tego zrobić. Nie można jednak pisać, if (NULL = str)ponieważ NULL nie jest zmienną i nie można jej przypisać. Bezpieczniej jest umieścić NULL po lewej stronie. Nie jest to jednak problem w Javie.
Gyan alias Gary Buyn
236

Dlaczego nie tylko jedna wkładka?

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

Pełny kod

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

Próbny

Fahim Parkar
źródło
8
Należy rozważyć sprawdzenie pustego i pustego łańcucha. Wersja @BobBobBob jest lepsza
KDjava,
1
@KDjava: powyżej jest poprawne, biorąc pod uwagę, że przekazano prawidłowy ciąg. w przeciwnym razie musiałbym dodać blok try catch, aby sprawdzić, czy łańcuch jest poprawny ...
Fahim Parkar,
Dodałem sprawdzanie ciąg zerowy przed return str.substring(0,str.length()-1);jako ulepszenie
shareef
Dzięki temu źródło jest w użyciu na gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS
@FahimParkar: Ponieważ możliwe, że ostatni znak nie jest postacią, którą chcemy usunąć. Ale jak na pytanie, twoja odpowiedź jest poprawna
Ash18
91

Ponieważ zajmujemy się tym tematem, można również używać wyrażeń regularnych

"aaabcd".replaceFirst(".$",""); //=> aaabc  
iddqd
źródło
3
fajny sposób, gdy chcesz / musisz dokładnie zdefiniować, co chcesz przyciąć od końca łańcucha, a nie tylko X dowolne znaki
Julien
73

Opisany problem i proponowane rozwiązania czasami dotyczą usuwania separatorów. Jeśli tak jest w twoim przypadku, spójrz na Apache Commons StringUtils, ma on metodę o nazwie removeEnd, która jest bardzo elegancka.

Przykład:

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

Wynikałoby z: „ciąg 1 | ciąg 2 | ciąg 3”

Mart135688
źródło
Oto JAR dla wyżej wymienionych StringUtils: commons.apache.org/proper/commons-lang/download_lang.cgi
Tony H.
47
public String removeLastChar(String s) {
    if (s == null || s.length() == 0) {
        return s;
    }
    return s.substring(0, s.length()-1);
}
BobBobBob
źródło
4
Co jeśli ostatnia postać to para zastępcza o wysokiej / niskiej wartości?
Robert Allan Hennigan Leahy
@RobertAllanHenniganLeahy Zamieściłem odpowiedź, która obsługuje ten scenariusz.
Patrick Parker,
33

Nie próbuj na nowo wymyślać koła, podczas gdy inni już napisali biblioteki do wykonywania operacji na łańcuchach: org.apache.commons.lang3.StringUtils.chop()

Membersound
źródło
2
Jeśli chcesz usunąć TYLKO ostatnią postać - to najlepsza odpowiedź!
iaforek
Nie, nie jest, ponieważ „use Java” to okropna odpowiedź na pytanie Kotlina.
Mikkel Løkke
2
@ MikkelLøkke Nie wiem, ale to pytanie w żadnym wypadku nie jest pytaniem Kotlin?
Membersound
19

Użyj tego:

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

    string= string.substring(0, string.length() - 1);
 }
Navaneeth
źródło
11
if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

Na przykład słowo to „wielbiciel”; po uruchomieniu metody pojawia się „admie”. Chcę, żeby to zwróciło słowo podziw.

W przypadku, gdy próbujesz powstrzymać angielskie słowa

Wywodzenie się to proces redukowania odmiany fleksyjnej (lub czasami wyprowadzanej) do formy rdzennej, podstawowej lub rdzeniowej - zazwyczaj formy słowa pisanego.

...

Na przykład stemmer dla języka angielskiego powinien identyfikować ciąg „cats” (i ewentualnie „catlike”, „catty” itp.) Jako oparty na rdzeniu „cat” i „stemmer”, „stemming”, „stemped” jako na podstawie „łodygi”. Algorytm wywodzący redukuje słowa „wędkowanie”, „połów”, „ryba” i „rybak” do słowa rdzeniowego „ryba”.

Różnica między stemplami Lucene: EnglishStemmer, PorterStemmer, LovinsStemmer przedstawia niektóre opcje Java.

Mike Samuel
źródło
11

W Kotlin można użyć metody dropLast () klasy string. Spuści podaną liczbę z ciągu, zwróci nowy ciąg

var string1 = "Some Text"
string1 = string1.dropLast(1)
Mahavir Jain
źródło
9

Jeśli chodzi o czytelność, uważam to za najbardziej zwięzłe

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

Indeksy ujemne mogą być używane w narzędziu StringUtils Apache. Wszystkie liczby ujemne są traktowane od przesunięcia od końca łańcucha.

Kasturi
źródło
Nie powiedziałbym, że to najlepsza odpowiedź - dla uproszczenia użyj metody org.apache.commons.lang.StringUtils.chop (). Jednak sztuczka z -1 jest naprawdę fajna i patrzenie na inne odpowiedzi nie jest tak naprawdę używane / dobrze znane.
iaforek
4

usuwa ostatnie wystąpienie „xxx”:

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

usuwa ostatnie wystąpienie „xxx”, jeśli jest ostatnie:

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

możesz zamienić „xxx” na to, co chcesz, ale uważaj na znaki specjalne

Arkadiusz Cieśliński
źródło
4
 // creating StringBuilder
 StringBuilder builder = new StringBuilder(requestString);
 // removing last character from String
 builder.deleteCharAt(requestString.length() - 1);
Bachan Joseph
źródło
3
public String removeLastChar(String s) {
    if (!Util.isEmpty(s)) {
        s = s.substring(0, s.length()-1);
    }
    return s;
}
Ganesa Vijayakumar
źródło
3

Spójrz na klasę StringBuilder:

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"
eeocom
źródło
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;
}
Oleksandr Paldypanida
źródło
2

Jedna linijka (tylko zabawna alternatywa - nie próbuj tego w domu, a już udzielono świetnych odpowiedzi):

public String removeLastChar(String s){return (s != null && s.length() != 0) ? s.substring(0, s.length() - 1): s;}
Nick Louloudakis
źródło
2

Dlaczego nie użyć sekwencji ucieczki ...!

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

Życie jest teraz znacznie łatwiejsze. XD! ~ Czytelny jednowarstwowy

Tilak Maddy
źródło
Czy to nie jest Java? LMAO
baranskistad
Specjalne zachowanie „\ b” jest interpretowane przez czytnik ciągów, terminale tekstowe itp. W przeciwnym razie jest to tylko kolejna reprezentacja znaków ASCII. stackoverflow.com/a/11891895/4589003
Sudip Bhandari
2

Większość odpowiedzi tutaj zapomniała o parach zastępczych .

Na przykład znak 𝕫 (punkt kodowy U + 1D56B) nie pasuje do jednego char, więc aby być reprezentowanym, musi tworzyć zastępczą parę dwóch znaków.

Jeśli po prostu zastosuje się obecnie przyjętą odpowiedź (używając str.substring(0, str.length() - 1) , dzieli się parę zastępczą, co prowadzi do nieoczekiwanych rezultatów.

Należy również sprawdzić, czy ostatnia postać jest parą zastępczą:

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);
}
MC Emperor
źródło
Na rogu: czy to może kiedykolwiek rzucić IndexOutOfBoundsException? (np. czy jest możliwe, że Character.isSurrogate zwraca wartość true, gdy tak naprawdę nie ma przed nią znaku, co daje wynik str.length()-cutujemny).
GPI
Tak, to możliwe. W każdym razie jest to niepoprawny ciąg, ale nadal - jest możliwe, tak. Trzeba wtedy zastąpić 2przez 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);
    }
}

Wyjście: test-ab

Nadhu
źródło
1
 "String name" = "String name".substring(0, ("String name".length() - 1));

Używam tego w moim kodzie, jest to łatwe i proste. działa tylko, gdy String ma> 0. Mam go podłączony do przycisku i wewnątrz poniższej instrukcji if

if ("String name".length() > 0) {
    "String name" = "String name".substring(0, ("String name".length() - 1));
}
Donoso
źródło
1
public String removeLastCharacter(String str){
       String result = null;
        if ((str != null) && (str.length() > 0)) {
          return str.substring(0, str.length() - 1);
        }
        else{
            return "";
        }

}
C Williams
źródło
0

jeśli masz wyjątkowy charakter; w json wystarczy użyć String.replace (";", ""), w przeciwnym razie musisz przepisać wszystkie znaki w ciągu minus ostatni.

MoadKey
źródło
0

Jak zrobić znak w rekurencji na końcu:

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

na przykład:

removeChar ("hello world, let's go!",'l')  "heo word, et's go!llll"
removeChar("you should not go",'o')  "yu shuld nt goooo"
Simon Francisco
źródło
0

Oto odpowiedź, która działa z kodowymi punktami poza Podstawowym wielojęzycznym samolotem (Java 8+).

Korzystanie ze strumieni:

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

Bardziej wydajne może:

public String method(String str) {
    return str.isEmpty()? "": str.substring(0, str.length() - Character.charCount(str.codePointBefore(str.length())));
}
Patrick Parker
źródło
0

Możemy użyć podciągów. Oto przykład

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);    
    }
}
siedmiodniowa żałoba
źródło
0

wystarczy zastąpić warunek „jeśli” w ten sposób:

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

to załatwi sprawę.

Syed Salman Hassan
źródło
0

Załóżmy, że łączna długość mojego ciągu = 24 Chcę wyciąć ostatni znak po pozycji 14 do końca, co oznacza, że ​​chcę, aby był tam początek 14. Więc stosuję następujące rozwiązanie.

String date = "2019-07-31T22:00:00.000Z";
String result = date.substring(0, date.length() - 14);
Avinash Khadsan
źródło
0

Musiałem napisać kod dla podobnego problemu. Jednym ze sposobów, w jaki udało mi się to rozwiązać, była rekurencyjna metoda kodowania.

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

Większość kodu, który widziałem na ten temat, nie używa rekurencji, więc mam nadzieję, że mogę pomóc tobie lub komuś, kto ma ten sam problem.

Jacob Mehnert
źródło
0

Bułka z masłem:

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);
RoboC
źródło
-1

Jest to jeden ze sposobów usunięcia ostatniego znaku z ciągu:

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]);
}
Alagu Raja
źródło