ChatGPT解决这个技术问题 Extra ChatGPT

如何从字符串中删除最后一个字符?

我想从字符串中删除最后一个字符。我试过这样做:

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

获取字符串的长度 - 1 并将最后一个字母替换为空(删除它),但是每次我运行程序时,它都会删除与最后一个字母相同的中间字母。

例如,单词是“admirer”;运行该方法后,我得到“admie”。我希望它返回佩服这个词。


T
Tot Zam

replace 将替换一个字母的所有实例。您需要做的就是使用 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;
}

我会在检查的开头添加 null != str &&
你的意思是str != null &&
@SSpoke 是一样的,你的读起来更好看:)
@Marko 大声笑是的,因为这是标准,当人们自己制作东西时感觉很奇怪。
@AdamJensen 在C 中,您可能不小心编写了 if (str = NULL) ,它不仅总是会评估为假(NULL == 0 == false),而且还会为 str 分配一个值,这很可能不是您想要做的。但是你不能写 if (NULL = str) 因为 NULL 不是一个变量并且不能被赋值。因此,将 NULL 放在左侧是一个更安全的约定。不过,这在 Java 中不是问题。
D
Daniel De León

为什么不只有一个班轮?

public static String removeLastChar(String str) {
    return removeLastChars(str, 1);
}

public static String removeLastChars(String str, int chars) {
    return str.substring(0, str.length() - chars);
}

完整代码

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) + "==");
    }
    
    public static String removeLastChar(String str) {
        return removeLastChars(str, 1);
    }

    public static String removeLastChars(String str, int chars) {
        return str.substring(0, str.length() - chars);
    }
}

演示


应该考虑检查空字符串和空字符串。@BobBobBob 版本更好
@KDjava:考虑到传递了有效的字符串,以上是有效的。否则我还必须添加 try catch 块来检查字符串是否正确......
我在 return str.substring(0,str.length()-1); 之前添加了对空字符串的检查作为改进
@FahimParkar:因为最后一个字符可能不是我们要删除的字符。但是根据问题,您的答案是正确的
i
iddqd

由于我们在一个主题上,所以也可以使用正则表达式

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

不错的方法,当您想要/需要准确定义要从字符串末尾修剪的内容时,而不仅仅是 X 任何字符
u
user3132194

所描述的问题和建议的解决方案有时与移除分隔物有关。如果这是您的情况,请查看 Apache Commons StringUtils,它有一个名为 removeEnd 的方法,非常优雅。

例子:

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

将导致:“字符串 1|字符串 2|字符串 3”


B
BobBobBob
public String removeLastChar(String s) {
    if (s == null || s.length() == 0) {
        return s;
    }
    return s.substring(0, s.length()-1);
}

如果最后一个字符是高/低代理对怎么办?
@RobertAllanHenniganLeahy 我发布了一个处理该场景的 answer
u
user3132194

不要试图重新发明轮子,而其他人已经编写了库来执行字符串操作:org.apache.commons.lang3.StringUtils.chop()


如果您只想删除最后一个字符 - 这是最好的答案!
不,不是,因为“使用 Java”是对 Kotlin 问题的糟糕回答。
@MikkelLøkke 我不知道,但无论如何这个问题都不是 Kotlin 问题?
J
Jeeva

在 Kotlin 中,您可以使用字符串类的 dropLast() 方法。它将从字符串中删除给定的数字,返回一个新字符串

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

B
Bhavin Nattar

用这个:

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

    string= string.substring(0, string.length() - 1);
 }

C
Community
if (str.endsWith("x")) {
  return str.substring(0, str.length() - 1);
}
return str;

例如,单词是“admirer”;运行该方法后,我得到“admie”。我希望它返回佩服这个词。

如果您尝试 stem 英语单词

词干提取是将屈折(或有时派生)的词简化为词干、基础或词根形式(通常是书面词形式)的过程。 ...例如,英语的词干分析器应将字符串“cats”(可能还有“catlike”、“catty”等)识别为基于词根“cat”、“stemmer”、“stemming”、“以“词干”为基础。词干算法将单词“fishing”、“fished”、“fish”和“fisher”简化为词根“fish”。

Difference between Lucene stemmers: EnglishStemmer, PorterStemmer, LovinsStemmer 概述了一些 Java 选项。


K
Kasturi

就可读性而言,我觉得这是最简洁的

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

负索引可以在 Apache 的 StringUtils 实用程序中使用。所有负数都从字符串末尾的偏移量开始处理。


我不会说这是最好的答案 - 为简单起见,请使用 org.apache.commons.lang.StringUtils.chop() 方法。然而,使用 -1 的技巧非常好,并且查看其他答案并没有真正使用/众所周知。
D
Donoso
 string = string.substring(0, (string.length() - 1));

我在我的代码中使用它,它很简单。它仅在字符串 > 0 时有效。我将它连接到一个按钮并在以下 if 语句中

if (string.length() > 0) {
    string = string.substring(0, (string.length() - 1));
}

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

A
Arkadiusz Cieśliński

删除最后一次出现的“xxx”:

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

如果是最后一次,则删除最后一次出现的“xxx”:

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

您可以根据需要替换“xxx”,但要注意特殊字符


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

t
tstempko

一个简单的任务怎么能变得复杂。我的解决方案是:

public String removeLastChar(String s) {
    return s[0..-1]
}

或者

public String removeLastChar(String s) {
    if (s.length() > 0) {
        return s[0..-1]
    }
    return s
}

s[0..-1] 是 java 吗?
bruh..这不是java
a
aeocom

查看 StringBuilder 类:

    StringBuilder sb=new StringBuilder("toto,");
    System.out.println(sb.deleteCharAt(sb.length()-1));//display "toto"

i
intcreator
// 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;
}

N
Nick Louloudakis

一个单一的答案(只是一个有趣的选择 - 不要在家里尝试这个,并且已经给出了很好的答案):

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

M
MC Emperor

这里的大多数答案都忘记了 surrogate pairs

例如,字符 𝕫(代码点 U+1D56B)不适合单个 char,因此为了表示,它必须形成两个字符的代理对。

如果简单地应用当前接受的答案(使用 str.substring(0, str.length() - 1),则拼接代理对,导致意外结果。

还应该包括检查最后一个字符是否是代理对:

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

在极端情况下:这可以抛出 IndexOutOfBoundsException 吗? (例如,如果 Character.isSurrogate 之前实际上没有字符,是否有可能返回 true,从而使 str.length()-cut 为负数)。
是的,这是可能的。无论如何,它是一个无效的字符串,但仍然 - 有可能,是的。然后应将 2 替换为 Math.min(2, str.length())
N
Nadhu

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

输出:测试-ab


C
C Williams
public String removeLastCharacter(String str){
       String result = null;
        if ((str != null) && (str.length() > 0)) {
          return str.substring(0, str.length() - 1);
        }
        else{
            return "";
        }

}

V
Vasanthakumar Jagannathan

如果我们想删除给定文件的文件扩展名,

** 示例代码

 public static String removeNCharactersFromLast(String str,int n){
    if (str != null && (str.length() > 0)) {
        return str.substring(0, str.length() - n);
    }

    return "";

}

M
MoadKey

如果您有特殊字符,例如;在 json 中只需使用 String.replace(";", "") 否则您必须重写字符串中的所有字符减去最后一个字符。


T
Tilak Maddy

为什么不使用 escape sequence ...!

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

现在生活轻松多了。 XD! ~ 可读的单行


这不是Java吗。 LMAO
'\b' 的特殊行为由字符串阅读器、文本终端等解释。否则它只是另一种 ASCII 字符表示。 stackoverflow.com/a/11891895/4589003
C
CodeF0x

最后如何在递归中制作char:

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

举个例子:

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

P
Patrick Parker

这是一个适用于基本多语言平面(Java 8+)之外的代码点的答案。

使用流:

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

可能更有效:

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

S
Syed Salman Hassan

只需像这样替换“if”的条件:

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

这将为您解决问题。


D
Dharman

假设我的字符串的总长度=24 我想在位置 14 之后剪切最后一个字符以结束,这意味着我希望从 14 开始。所以我应用以下解决方案。

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

U
Unmitigated

我不得不为类似的问题编写代码。我能够解决它的一种方法是使用递归编码方法。

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

我在这个主题上看到的大多数代码都没有使用递归,所以希望我能帮助你或遇到同样问题的人。


R
RoboC

十分简单:

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