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.