Comment supprimer le dernier caractère d'une chaîne?

483

Je souhaite supprimer le dernier caractère d'une chaîne. J'ai essayé de faire ça:

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

Obtenir la longueur de la chaîne - 1 et remplacer la dernière lettre par rien (la supprimer), mais chaque fois que j'exécute le programme, il supprime les lettres du milieu qui sont les mêmes que la dernière lettre.

Par exemple, le mot est "admirateur"; après avoir exécuté la méthode, je reçois "admie". Je veux qu'il renvoie le mot admirer.

Ankush soni
la source

Réponses:

666

replaceremplacera toutes les instances d'une lettre. Il vous suffit d'utiliser 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
la source
7
J'ajouterais null != str && au début du chèque.
James Oravec
12
tu veux dire str != null &&!
SSpoke
2
@SSpoke c'est la même chose, la vôtre est juste un peu plus agréable à lire :)
Marko
6
@Marko lol oui puisque c'est la norme, ça fait bizarre quand les gens inventent leurs propres trucs.
SSpoke
26
@AdamJensen En C, vous pourriez accidentellement écrire if (str = NULL)ce qui sera non seulement toujours évalué à faux (NULL == 0 == false) mais assignera également une valeur à strlaquelle ce n'est probablement pas ce que vous vouliez faire. Vous ne pouvez if (NULL = str)cependant pas écrire car NULL n'est pas une variable et ne peut pas être affecté à. Donc, c'est une convention plus sûre de mettre le NULL à gauche. Ce n'est cependant pas un problème en Java.
Gyan aka Gary Buyn
236

Pourquoi pas un seul paquebot?

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

Code complet

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

Démo

Fahim Parkar
la source
8
La vérification de la chaîne vide et vide doit être considérée. La version @BobBobBob est meilleure
KDjava
1
@KDjava: ci-dessus est valide en considérant que la chaîne valide est passée. sinon je devrais aussi ajouter le bloc try catch pour vérifier que la chaîne est correcte ...
Fahim Parkar
j'ai ajouté la vérification de la chaîne nulle avant return str.substring(0,str.length()-1);comme amélioration
shareef
Merci, cette source est utilisée sur gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS
@FahimParkar: Parce qu'il est possible que le dernier caractère ne soit pas le caractère que nous voulons supprimer. Mais selon la question, votre réponse est correcte
Ash18
91

Puisque nous sommes sur un sujet, on peut aussi utiliser des expressions régulières

"aaabcd".replaceFirst(".$",""); //=> aaabc  
iddqd
la source
3
belle façon, quand vous voulez / devez définir exactement ce que vous voulez couper à partir de la fin de la chaîne, pas seulement X quels que soient les caractères
Julien
73

Le problème décrit et les solutions proposées concernent parfois la suppression des séparateurs. Si c'est votre cas, jetez un œil à Apache Commons StringUtils, il a une méthode appelée removeEnd qui est très élégante.

Exemple:

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

Résultat: "chaîne 1 | chaîne 2 | chaîne 3"

Mart135688
la source
Voici le JAR pour les StringUtils mentionnés ci - dessus: 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
la source
4
Et si le dernier caractère est une paire de substitution haute / basse?
Robert Allan Hennigan Leahy
@RobertAllanHenniganLeahy J'ai posté une réponse qui gère ce scénario.
Patrick Parker
33

N'essayez pas de réinventer la roue, alors que d'autres ont déjà écrit des bibliothèques pour effectuer des manipulations de chaînes: org.apache.commons.lang3.StringUtils.chop()

membersound
la source
2
Si vous souhaitez supprimer le dernier caractère UNIQUEMENT - c'est la meilleure réponse!
iaforek
Non, ce n'est pas le cas, car «utiliser Java» est une réponse terrible à une question Kotlin.
Mikkel Løkke
2
@ MikkelLøkke Je ne sais pas, mais cette question n'est pas une question Kotlin en tout cas ??
membersound
19

Utilisez ceci:

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

    string= string.substring(0, string.length() - 1);
 }
Navaneeth
la source
11
if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

Par exemple, le mot est "admirateur"; après avoir exécuté la méthode, je reçois "admie". Je veux qu'il renvoie le mot admirer.

Dans le cas où vous essayez d' endiguer les mots anglais

La racine est le processus de réduction des mots fléchis (ou parfois dérivés) à leur forme racine, base ou racine - généralement une forme de mot écrite.

...

Un stemmer pour l'anglais, par exemple, devrait identifier la chaîne "cats" (et éventuellement "catlike", "catty" etc.) comme étant basée sur la racine "cat", et "stemmer", "stemming", "stemmed" comme basé sur "tige". Un algorithme de dérivation réduit les mots «pêche», «pêché», «poisson» et «pêcheur» au mot racine «poisson».

Différence entre les stemmers Lucene: EnglishStemmer, PorterStemmer, LovinsStemmer décrit certaines options Java.

Mike Samuel
la source
11

Dans Kotlin, vous pouvez utiliser la méthode dropLast () de la classe de chaîne. Il supprimera le nombre donné de la chaîne, retournera une nouvelle chaîne

var string1 = "Some Text"
string1 = string1.dropLast(1)
Mahavir Jain
la source
9

En ce qui concerne la lisibilité, je trouve que c'est le plus concis

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

Les index négatifs peuvent être utilisés dans l'utilitaire StringUtils d'Apache. Tous les nombres négatifs sont traités à partir du décalage à partir de la fin de la chaîne.

Kasturi
la source
Je ne dirais pas que c'est la meilleure réponse - pour plus de simplicité, utilisez la méthode org.apache.commons.lang.StringUtils.chop (). Pourtant, l'astuce avec -1 est vraiment sympa et regarder les autres réponses n'est pas vraiment utilisé / bien connu.
iaforek
4

supprime la dernière occurrence du 'xxx':

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

supprime la dernière occurrence de 'xxx' si elle est la dernière:

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

vous pouvez remplacer le «xxx» sur ce que vous voulez mais faites attention aux caractères spéciaux

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

Regardez la classe StringBuilder:

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"
aeocom
la source
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
la source
2

Une réponse à une ligne (juste une alternative amusante - n'essayez pas cela à la maison, et d'excellentes réponses déjà données):

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

Pourquoi ne pas utiliser la séquence d'échappement ...!

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

La vie est beaucoup plus facile maintenant. XD! ~ Une doublure lisible

Tilak Maddy
la source
N'est-ce pas Java. LMAO
baranskistad
Le comportement spécial de '\ b' est interprété par le lecteur de chaînes, les terminaux de texte, etc. sinon c'est juste une autre représentation de caractères ASCII. stackoverflow.com/a/11891895/4589003
Sudip Bhandari
2

La plupart des réponses ici ont oublié les paires de substitution .

Par exemple, le caractère 𝕫 (point de code U + 1D56B) ne rentre pas dans un seul char , donc pour être représenté, il doit former une paire de substitution de deux caractères.

Si l'on applique simplement la réponse actuellement acceptée (en utilisant str.substring(0, str.length() - 1) , on épissure la paire de substitution, ce qui conduit à des résultats inattendus.

Il convient également de vérifier si le dernier caractère est une paire de substitution:

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);
}
Empereur MC
la source
Sur un étui d'angle: cela peut-il jamais être lancé IndexOutOfBoundsException? (Par exemple, est-il possible que Character.isSurrogate renvoie true alors qu'il n'y a en fait aucun caractère devant lui, ce qui rend str.length()-cutnégatif).
GPI
Oui, c'est possible. C'est une chaîne invalide de toute façon, mais quand même - c'est possible, oui. Il faut alors remplacer 2par 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);
    }
}

Sortie: test-ab

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

J'utilise ceci dans mon code, c'est facile et simple. cela ne fonctionne que lorsque la chaîne est> 0. Je l'ai connecté à un bouton et à l'intérieur de l' instruction if suivante

if ("String name".length() > 0) {
    "String name" = "String name".substring(0, ("String name".length() - 1));
}
Donoso
la source
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
la source
0

si vous avez un caractère spécial comme; dans json, utilisez simplement String.replace (";", "") sinon vous devez réécrire tous les caractères de la chaîne moins le dernier.

MoadKey
la source
0

Comment faire le caractère dans la récursivité à la fin:

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

par exemple:

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

Voici une réponse qui fonctionne avec des points de code en dehors du plan multilingue de base (Java 8+).

Utilisation de flux:

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

Plus efficace peut-être:

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

Nous pouvons utiliser une sous-chaîne. Voici l'exemple,

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);    
    }
}
Shiva
la source
0

remplacez simplement la condition "si" comme ceci:

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

cela fera l'affaire pour vous.

Syed Salman Hassan
la source
0

Supposons que la longueur totale de ma chaîne = 24 Je veux couper le dernier caractère après la position 14 pour terminer, je veux dire que le début de 14 doit être là. J'applique donc la solution suivante.

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

J'ai dû écrire du code pour un problème similaire. Une façon que j'ai pu le résoudre a utilisé une méthode récursive de codage.

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 plupart du code que j'ai vu sur ce sujet n'utilise pas la récursivité, donc j'espère pouvoir vous aider, vous ou quelqu'un qui a le même problème.

Jacob Mehnert
la source
0

Peasy facile:

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
la source
-1

C'est la seule façon de supprimer le dernier caractère de la chaîne:

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
la source