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.

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

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


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


@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  

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”


Oto JAR dla wyżej wymienionych StringUtils: commons.apache.org/proper/commons-lang/download_lang.cgi
Tony H.



19

Użyj tego:

 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;

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.


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)

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.


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


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

3
public String removeLastChar(String s) {
    if (!Util.isEmpty(s)) {
        s = s.substring(0, s.length()-1);
    }
    return s;
}

3

Spójrz na klasę 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

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


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

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


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

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

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.


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"

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

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

0

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

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

to załatwi sprawę.


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

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.


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

-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]);
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.