วิธีการลบอักขระตัวสุดท้ายออกจากสตริง


483

ฉันต้องการลบอักขระตัวสุดท้ายออกจากสตริง ฉันพยายามทำสิ่งนี้:

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." ฉันต้องการที่จะกลับคำชื่นชม

คำตอบ:


665

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

7
ฉันจะเพิ่มnull != str && ที่จุดเริ่มต้นของการตรวจสอบ
James Oravec

12
คุณหมายถึงstr != null &&!
SSpoke

2
@SSpoke มันเป็นสิ่งเดียวกันคุณเป็นเพียงเล็ก ๆ น้อย ๆ ดีกว่าการอ่าน :)
มาร์โค

6
@ Marko lol ใช่เพราะมันเป็นมาตรฐานรู้สึกแปลก ๆ เมื่อผู้คนทำสิ่งของของตัวเองขึ้นมา
SSpoke

26
@AdamJensen ใน C คุณสามารถเขียนได้โดยไม่ตั้งใจif (str = NULL)ซึ่งไม่เพียง แต่จะประเมินว่าเป็นเท็จเสมอ (NULL == 0 == false) แต่จะกำหนดค่าstrที่มักจะไม่ใช่สิ่งที่คุณต้องการทำ คุณไม่สามารถเขียนได้if (NULL = str)อย่างไรก็ตามเนื่องจาก NULL ไม่ใช่ตัวแปรและไม่สามารถกำหนดได้ ดังนั้นจึงเป็นเรื่องที่ปลอดภัยกว่าที่จะวาง NULL ไว้ทางซ้าย นี่ไม่ใช่ปัญหาใน Java แม้ว่า
Gyan aka Gary Buyn

236

ทำไมต้องไม่ใช่แค่ซับเดียว?

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

รหัสเต็ม

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

การสาธิต


8
ควรตรวจสอบสตริงว่างและสตริงว่าง .. @BobBobBob เวอร์ชันดีกว่า
KDjava

1
@KDjava: ด้านบนใช้ได้กับการพิจารณาว่าสตริงที่ถูกต้องถูกส่งผ่าน อื่นที่ฉันจะต้องเพิ่มลองจับบล็อกยังจะตรวจสอบสตริงที่ถูกต้อง ...
Fahim Parkar

ฉันได้เพิ่มการตรวจสอบสตริงว่างก่อนreturn str.substring(0,str.length()-1);ปรับปรุง
shareef

ขอขอบคุณแหล่งข้อมูลนี้ถูกใช้งานอยู่ที่gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS

@FahimParkar: อาจเป็นไปได้ว่าตัวละครตัวสุดท้ายไม่ใช่ตัวละครที่เราต้องการลบ แต่ตามคำถามคำตอบของคุณถูกต้อง
Ash18

91

เนื่องจากเราอยู่ในหัวข้อหนึ่งจึงสามารถใช้นิพจน์ทั่วไปได้เช่นกัน

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

3
วิธีที่ดีเมื่อคุณต้องการ / จำเป็นต้องกำหนดสิ่งที่คุณต้องการตัดแต่งจากจุดสิ้นสุดของสตริงไม่ใช่แค่ X ตัวอักษรอะไรก็ตาม
Julien

73

ปัญหาที่อธิบายและวิธีแก้ปัญหาที่เสนอบางครั้งเกี่ยวข้องกับการลบตัวคั่น หากเป็นกรณีของคุณให้ดู Apache Commons StringUtils มันมีวิธีการที่เรียกว่า removeEndซึ่งสวยงามมาก

ตัวอย่าง:

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

จะส่งผลให้: "string 1 | string 2 | string 3"


นี่คือ JAR สำหรับ 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
เกิดอะไรขึ้นถ้าตัวละครสุดท้ายเป็นคู่ตัวแทนสูง / ต่ำ
Robert Allan Hennigan Leahy

@RobertAllanHenniganLeahy ฉันโพสต์คำตอบที่จัดการสถานการณ์นั้น
Patrick Parker

33

อย่าพยายามบูรณาการวงล้อในขณะที่คนอื่นมีห้องสมุดที่เขียนแล้วเพื่อทำการจัดการสตริง: org.apache.commons.lang3.StringUtils.chop()


2
หากคุณต้องการลบตัวอักษรตัวสุดท้ายเท่านั้นนี่คือคำตอบที่ดีที่สุด!
iaforek

ไม่ไม่ใช่เพราะ "use Java" เป็นคำตอบที่น่ากลัวสำหรับคำถาม Kotlin
Mikkel Løkke

2
@ MikkelLøkkeฉันไม่รู้ แต่คำถามนี้ไม่ใช่คำถาม Kotlin ในกรณีใด ๆ ??
membersound


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

ตัวอย่างเช่นคำว่า "admirer"; หลังจากที่ฉันใช้วิธีการฉันได้รับ "admie." ฉันต้องการที่จะกลับคำชื่นชม

ในกรณีที่คุณกำลังพยายามที่จะมีต้นกำเนิดคำภาษาอังกฤษ

Stemming เป็นกระบวนการในการลดคำที่ผัน (หรือบางครั้งที่ได้มา) ไปยังรูปแบบสเตมฐานหรือรูทของพวกเขา - โดยทั่วไปเป็นรูปแบบคำที่เขียน

...

ตัวอย่าง Stemmer สำหรับภาษาอังกฤษควรระบุสตริง "cats" (และอาจเป็น "catlike", "catty" เป็นต้น) ตามรากของ "cat" และ "stemmer", "Stemming", "Stemmed" เป็น ขึ้นอยู่กับ "ลำต้น" อัลกอริธึมการ Stemming ลดคำว่า "การตกปลา", "การตกปลา", "ปลา" และ "การตกปลา" ให้กับคำว่า "ปลา"

ความแตกต่างระหว่าง Lucene Stemmers: EnglishStemmer, PorterStemmer, LovinsStemmerแสดงตัวเลือก Java บางอย่าง


11

ใน Kotlin คุณสามารถใช้วิธี dropLast () ของคลาสสตริง มันจะวางจำนวนที่กำหนดจากสตริงกลับสตริงใหม่

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

9

เท่าที่ความกังวลเกี่ยวกับความสามารถในการอ่านฉันคิดว่านี่เป็นเรื่องที่กระชับที่สุด

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

ดัชนีเชิงลบสามารถใช้ในยูทิลิตี้ StringUtils ของ Apache ตัวเลขลบทั้งหมดจะได้รับการชดเชยจากจุดสิ้นสุดของสตริง


ฉันจะไม่พูดว่านี่เป็นคำตอบที่ดีที่สุด - เพื่อความเรียบง่ายใช้ org.apache.commons.lang.StringUtils.chop () วิธีการ ทฤษฏีเคล็ดลับที่มี -1 นั้นดีมากและดูคำตอบอื่น ๆ ที่ไม่ได้ใช้ / รู้จักกันดี
iaforek

4

ลบการเกิดขึ้นครั้งสุดท้ายของ 'xxx':

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

ลบการเกิดขึ้นครั้งสุดท้ายของ 'xxx' หากมันเป็นครั้งสุดท้าย:

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

คุณสามารถแทนที่ 'xxx' ในสิ่งที่คุณต้องการ แต่ระวังตัวอักษรพิเศษ


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


3

ดูที่คลาส 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

คำตอบหนึ่งซับ (เพียงทางเลือกที่ตลก - อย่าลองทำที่บ้านและคำตอบที่ยอดเยี่ยมให้แล้ว):

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

2

ทำไมไม่ใช้ลำดับการหลบหนี ... !

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

ชีวิตง่ายขึ้นแล้วตอนนี้ XD! ~ A หนึ่งซับอ่านได้


ไม่ใช่จาวานี้ LMAO
baranskistad

พฤติกรรมพิเศษของ '\ b' ถูกตีความโดยตัวอ่านสตริงเทอร์มินัลข้อความ ฯลฯ มิฉะนั้นมันก็เป็นเพียงการแสดงตัวอักษร ASCII อีกตัว stackoverflow.com/a/11891895/4589003
Sudip Bhandari

2

คำตอบส่วนใหญ่ที่นี่ลืมเกี่ยวกับคู่ตัวแทนคู่ตัวแทน

ตัวอย่างเช่นตัวละคร𝕫 (codepoint U + 1D56B) ไม่พอดีกับตัวเดียว charดังนั้นเพื่อที่จะแสดงมันจะต้องเป็นคู่ตัวแทนสองตัวอักษร

หากมีเพียงใช้คำตอบที่ยอมรับในปัจจุบัน (ใช้ str.substring(0, str.length() - 1)งานหนึ่งคู่ splices คู่ตัวแทนที่นำไปสู่ผลลัพธ์ที่ไม่คาดคิด

หนึ่งควรรวมการตรวจสอบว่าตัวละครสุดท้ายเป็นคู่ตัวแทน:

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 จะส่งกลับค่าจริงเมื่อไม่มีตัวอักษรก่อนหน้านั้นทำให้str.length()-cutเกิดลบ)
GPI

ใช่มันเป็นไปได้ มันเป็นสตริงที่ไม่ถูกต้องอยู่ดี แต่ก็ยังเป็นไปได้ - ใช่ หนึ่งแล้วควรเปลี่ยนโดย2 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);
    }
}

เอาต์พุต: ทดสอบ -ab


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

ฉันใช้สิ่งนี้ในรหัสของฉันมันง่ายและง่าย มันทำงานได้เฉพาะในขณะที่ String เป็น> 0 ฉันได้มันเชื่อมต่อกับปุ่มและภายในถ้าคำสั่งต่อไปนี้

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

หากคุณมีตัวละครพิเศษเช่น; ใน json เพียงแค่ใช้ String.replace (";", "") มิฉะนั้นคุณจะต้องเขียนตัวละครใหม่ทั้งหมดในสตริงลบด้วยตัวสุดท้าย


0

วิธีการทำถ่านในการเรียกซ้ำในตอนท้าย:

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"

0

นี่คือคำตอบที่ทำงานร่วมกับ codepoints นอก Basic Multilingual Plane (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())));
}

0

เราสามารถใช้ซับสตริง นี่คือตัวอย่าง

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

เพียงแค่แทนที่เงื่อนไขของ "ถ้า" เช่นนี้:

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

นี้จะทำเคล็ดลับสำหรับคุณ


0

สมมติว่าความยาวทั้งหมดของสตริงของฉัน = 24 ฉันต้องการตัดอักขระตัวสุดท้ายหลังจากตำแหน่ง 14 ถึงจุดสิ้นสุดหมายความว่าฉันต้องการเริ่มต้นที่ 14 เพื่อไปที่นั่น ดังนั้นฉันจึงใช้วิธีแก้ปัญหาต่อไปนี้

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

0

ฉันต้องเขียนรหัสสำหรับปัญหาที่คล้ายกัน วิธีหนึ่งที่ฉันสามารถแก้ไขได้นั้นใช้วิธีการเข้ารหัสซ้ำ

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

รหัสส่วนใหญ่ที่ฉันเห็นในหัวข้อนี้ไม่ได้ใช้การเรียกซ้ำดังนั้นหวังว่าฉันจะสามารถช่วยคุณหรือคนที่มีปัญหาเดียวกัน


0

Peasy ง่าย ๆ :

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

นี่เป็นวิธีหนึ่งในการลบอักขระตัวสุดท้ายในสตริง:

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]);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.