Come rimuovere l'ultimo carattere da una stringa?


483

Voglio rimuovere l'ultimo carattere da una stringa. Ho provato a fare questo:

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

Ottenere la lunghezza della stringa - 1 e sostituire l'ultima lettera con nulla (eliminandola), ma ogni volta che eseguo il programma, elimina le lettere intermedie che sono le stesse dell'ultima lettera.

Ad esempio, la parola è "ammiratore"; dopo aver eseguito il metodo, ottengo "admie". Voglio che restituisca la parola ammirare.

Risposte:


666

replacesostituirà tutte le istanze di una lettera. Tutto quello che devi fare è usare 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
Aggiungerei null != str && all'inizio del controllo.
James Oravec,

12
intendi str != null &&!
SSvocò il

2
@SSpoke è la stessa cosa, la tua è solo un po 'più piacevole da leggere :)
Marko,

6
@Marko lol sì poiché è lo standard, sembra strano quando le persone si inventano le proprie cose.
SSpoke il

26
@AdamJensen In C potresti scrivere accidentalmente if (str = NULL) che non solo valuterà sempre false (NULL == 0 == false) ma assegnerà anche un valore al strquale molto probabilmente non è quello che volevi fare. Non è possibile if (NULL = str)tuttavia scrivere perché NULL non è una variabile e non può essere assegnato a. Quindi, è una convenzione più sicura mettere il NULL a sinistra. Questo non è un problema in Java però.
Gyan aka Gary Buyn,

236

Perché non solo una fodera?

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

Codice completo

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

dimostrazione


8
Il controllo per la stringa nulla e vuota deve essere considerato .. La versione di @BobBobBob è migliore
KDjava

1
@KDjava: sopra è valido considerando che viene passata una stringa valida. altrimenti dovrei aggiungere il blocco try catch anche per verificare che la stringa sia corretta ...
Fahim Parkar

ho aggiunto il controllo per la stringa null prima return str.substring(0,str.length()-1);come miglioramento
shareef


@FahimParkar: Perché potrebbe essere possibile che l'ultimo personaggio non sia il personaggio che vogliamo rimuovere. Ma secondo la domanda, la tua risposta è corretta
Ash18,

91

Dato che siamo su un argomento, si possono usare anche espressioni regolari

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

3
bel modo, quando vuoi / devi definire esattamente cosa vuoi tagliare dalla fine della stringa, non solo X qualunque carattere
Julien

73

Il problema descritto e le soluzioni proposte a volte riguardano la rimozione dei separatori. Se questo è il tuo caso, dai un'occhiata a StringUtils di Apache Commons, ha un metodo chiamato removeEnd che è molto elegante.

Esempio:

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

Risultati: "stringa 1 | stringa 2 | stringa 3"


Ecco il JAR per il già citato 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);
}

4
Cosa succede se l'ultimo personaggio è una coppia surrogata alta / bassa?
Robert Allan Hennigan Leahy,

@RobertAllanHenniganLeahy Ho pubblicato una risposta che gestisce quello scenario.
Patrick Parker,


19

Usa questo:

 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;

Ad esempio, la parola è "ammiratore"; dopo aver eseguito il metodo, ottengo "admie". Voglio che restituisca la parola ammirare.

Nel caso in cui stai cercando di arginare le parole inglesi

Lo stemming è il processo per ridurre le parole flesse (o talvolta derivate) alla loro forma radice, base o radice, generalmente una forma scritta.

...

Uno stemmer per l'inglese, ad esempio, dovrebbe identificare la stringa "cats" (e possibilmente "catlike", "catty" ecc.) Come basata sulla radice "cat", e "stemmer", "stemming", "stemmed" come basato su "radice". Un algoritmo derivante riduce le parole "pesca", "pescato", "pesce" e "pescatore" alla parola radice "pesce".

Differenza tra gli stemmer Lucene: EnglishStemmer, PorterStemmer, LovinsStemmer delinea alcune opzioni Java.


11

In Kotlin puoi usare il metodo dropLast () della classe stringa. Rilascerà il numero dato dalla stringa, restituirà una nuova stringa

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

9

Per quanto riguarda la leggibilità, trovo che questo sia il più conciso

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

Gli indici negativi possono essere utilizzati nell'utilità StringUtils di Apache. Tutti i numeri negativi vengono trattati dall'offset dalla fine della stringa.


Non direi che questa è la risposta migliore - per semplicità usa il metodo org.apache.commons.lang.StringUtils.chop (). Tuttavia, il trucco con -1 è davvero bello e guardare le altre risposte non è davvero usato / ben noto.
altro

4

rimuove l'ultima occorrenza di 'xxx':

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

rimuove l'ultima occorrenza di 'xxx' se è ultima:

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

puoi sostituire "xxx" con ciò che desideri ma fai attenzione ai caratteri speciali


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

Guarda la classe 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

Una risposta di una sola riga (solo un'alternativa divertente - non provarla a casa e ottime risposte già fornite):

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


2

La maggior parte delle risposte qui ha dimenticato le coppie surrogate .

Ad esempio, il carattere 𝕫 (punto di codice U + 1D56B) non si adatta a un singolo char , quindi per essere rappresentato, deve formare una coppia surrogata di due caratteri.

Se si applica semplicemente la risposta attualmente accettata (usando str.substring(0, str.length() - 1) , si giunge alla coppia surrogata, portando a risultati inaspettati.

Si dovrebbe anche includere un controllo se l'ultimo personaggio è una coppia surrogata:

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

In un caso d'angolo: questo può mai buttare IndexOutOfBoundsException? (ad esempio è possibile che Character.isSurrogate ritorni vero quando in realtà non c'è alcun carattere prima di esso, rendendo str.length()-cutnegativo).
GPI

Sì, è possibile. È comunque una stringa non valida, ma comunque - è possibile, sì. Si dovrebbe quindi sostituire 2con 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);
    }
}

Uscita: test-ab


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

Sto usando questo nel mio codice, è facile e semplice. funziona solo mentre la stringa è> 0. L'ho collegato ad un pulsante e all'interno del seguente se dichiarazione

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

se hai un carattere speciale come; in json basta usare String.replace (";", "") altrimenti devi riscrivere tutti i caratteri nella stringa meno l'ultimo.


0

Come rendere il carattere nella ricorsione alla fine:

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

per esempio:

removeChar ("hello world, let's go!",'l')  "heo word, et's go!llll"
removeChar("you should not go",'o')  "yu shuld nt goooo"

0

Ecco una risposta che funziona con i punti di codice al di fuori del piano multilingue di base (Java 8+).

Utilizzando i flussi:

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

Più efficiente forse:

public String method(String str) {
    return str.isEmpty()? "": str.substring(0, str.length() - Character.charCount(str.codePointBefore(str.length())));
}

0

Possiamo usare la sottostringa. Ecco l'esempio,

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

basta sostituire la condizione di "if" in questo modo:

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

questo farà il trucco per te.


0

Supponiamo che la lunghezza totale della mia stringa = 24 voglia tagliare l'ultimo carattere dopo la posizione 14 alla fine, significa che voglio che l'inizio 14 sia lì. Quindi applico la seguente soluzione.

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

0

Ho dovuto scrivere il codice per un problema simile. Un modo in cui sono stato in grado di risolverlo ha usato un metodo ricorsivo di codifica.

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

La maggior parte del codice che ho visto su questo argomento non usa la ricorsione, quindi spero di poter aiutare te o qualcuno che ha lo stesso problema.


0

Vai tranquillo:

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

Questo è l'unico modo per rimuovere l'ultimo carattere nella stringa:

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]);
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.