Làm thế nào để loại bỏ ký tự cuối cùng khỏi một chuỗi?


483

Tôi muốn xóa ký tự cuối cùng khỏi chuỗi. Tôi đã cố gắng làm điều này:

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

Lấy độ dài của chuỗi - 1 và thay thế chữ cái cuối cùng bằng không có gì (xóa nó), nhưng mỗi khi tôi chạy chương trình, nó sẽ xóa các chữ cái giống như chữ cái cuối cùng.

Ví dụ, từ này là "người ngưỡng mộ"; Sau khi tôi chạy phương thức, tôi nhận được "admie." Tôi muốn nó trả lại từ ngưỡng mộ.

Câu trả lời:


666

replacesẽ thay thế tất cả các trường hợp của một lá thư. Tất cả bạn cần làm là sử dụng 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
Tôi sẽ thêm null != str && vào lúc bắt đầu kiểm tra.
James Oravec

12
bạn có ý nghĩa str != null &&!
SSpoke

2
@SSpoke cũng vậy, bạn chỉ đọc một chút thôi :)
Marko

6
@Marko lol vâng, vì nó là tiêu chuẩn, cảm thấy kỳ lạ khi mọi người tự tạo ra thứ của mình.
SSpoke

26
@AdamJensen Trong C, bạn có thể vô tình viết if (str = NULL), điều này không chỉ luôn luôn đánh giá thành sai (NULL == 0 == false) mà còn gán giá trị strrất có thể không phải là điều bạn muốn làm. if (NULL = str)Tuy nhiên, bạn không thể viết vì NULL không phải là biến và không thể gán cho. Vì vậy, đó là một quy ước an toàn hơn để đặt NULL ở bên trái. Đây không phải là một vấn đề trong Java.
Gyan aka Gary Buyn

236

Tại sao không chỉ là một lớp lót?

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

Mã đầy đủ

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

Bản giới thiệu


8
Cần xem xét kiểm tra chuỗi rỗng và chuỗi rỗng .. Phiên bản @BobBobBob tốt hơn
KDjava

1
@KDjava: ở trên là hợp lệ khi xem xét chuỗi hợp lệ được thông qua. nếu không tôi cũng phải thêm khối thử bắt để kiểm tra xem chuỗi đó có đúng không ...
Fahim Parkar

tôi đã thêm kiểm tra chuỗi null trước khi return str.substring(0,str.length()-1);cải thiện
shareef

Cảm ơn nguồn này đang được sử dụng tại gist.github.com/CrandellWS/e254a215c54aa4be0400a3511a23f730
CrandellWS

@FahimParkar: Bởi vì có thể nhân vật cuối cùng không phải là nhân vật mà chúng tôi muốn loại bỏ. Nhưng theo câu hỏi, câu trả lời của bạn là chính xác
Ash18

91

Vì chúng ta đang ở một chủ đề, người ta cũng có thể sử dụng các biểu thức thông thường

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

3
Cách hay, khi bạn muốn / cần xác định chính xác những gì bạn muốn cắt từ cuối chuỗi, không chỉ X bất kỳ ký tự nào
Julien

73

Vấn đề được mô tả và các giải pháp đề xuất đôi khi liên quan đến việc loại bỏ các dải phân cách. Nếu đây là trường hợp của bạn, thì hãy xem Apache Commons StringUtils, nó có một phương thức gọi là removeEnd rất thanh lịch.

Thí dụ:

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

Sẽ dẫn đến: "chuỗi 1 | chuỗi 2 | chuỗi 3"


Đây là JAR cho StringUtils đã nói ở trên: commons.apache.org/proper/commons-lang/doad_lang.cgi
Tony H.


33

Đừng cố phát minh lại bánh xe, trong khi những người khác đã viết thư viện để thực hiện thao tác chuỗi: org.apache.commons.lang3.StringUtils.chop()


2
Nếu bạn muốn loại bỏ ký tự cuối cùng CHỈ - đây là câu trả lời tốt nhất!
iaforek

Không, không phải vậy, vì "sử dụng Java" là một câu trả lời khủng khiếp cho câu hỏi của Kotlin.
Mikkel Løkke

2
@ MikkelLøkke Tôi không biết, nhưng câu hỏi này không phải là câu hỏi của Kotlin trong mọi trường hợp ??
viên

19

Dùng cái này:

 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;

Ví dụ, từ này là "người ngưỡng mộ"; Sau khi tôi chạy phương thức, tôi nhận được "admie." Tôi muốn nó trả lại từ ngưỡng mộ.

Trong trường hợp bạn đang cố gắng bắt nguồn từ tiếng Anh

Xuất phát là quá trình giảm các từ bị biến dạng (hoặc đôi khi có nguồn gốc) thành dạng gốc, gốc hoặc gốc của họ nói chung là một dạng từ viết.

...

Ví dụ, một từ gốc tiếng Anh nên xác định chuỗi "cat" (và có thể là "catlike", "catty", v.v.) dựa trên gốc "cat" và "thân cây", "thân cây", "thân cây" dựa trên "thân cây". Một thuật toán xuất phát làm giảm các từ "câu cá", "đánh bắt", "câu cá" và "câu cá" thành từ gốc, "cá".

Sự khác biệt giữa các trình phát Lucene: EnglishStemmer, PorterStemmer, LovinsStemmer phác thảo một số tùy chọn Java.


11

Trong Kotlin, bạn có thể sử dụng phương thức dropLast () của lớp chuỗi. Nó sẽ thả số đã cho từ chuỗi, trả về một chuỗi mới

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

9

Theo như khả năng đọc, tôi thấy điều này là ngắn gọn nhất

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

Các chỉ mục phủ định có thể được sử dụng trong tiện ích StringUtils của Apache. Tất cả các số âm được xử lý từ phần bù từ cuối chuỗi.


Tôi sẽ không nói đây là câu trả lời tốt nhất - để đơn giản, hãy sử dụng phương thức org.apache.commons.lang.StringUtils.chop (). Tuy nhiên, mẹo với -1 thực sự rất hay và nhìn vào các câu trả lời khác không thực sự được sử dụng / được nhiều người biết đến.
iaforek

4

xóa lần xuất hiện cuối cùng của 'xxx':

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

xóa lần xuất hiện cuối cùng của 'xxx' nếu nó là lần cuối:

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

bạn có thể thay thế 'xxx' trên những gì bạn muốn nhưng xem ra các ký tự đặc biệt


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

Hãy tìm đến lớp 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

Câu trả lời một câu (chỉ là một cách thay thế vui nhộn - đừng thử điều này ở nhà và đã có câu trả lời tuyệt vời):

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

2

Tại sao không sử dụng trình tự thoát ...!

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

Cuộc sống bây giờ dễ dàng hơn nhiều. XD! ~ Một lớp lót có thể đọc được


Đây không phải là Java. LMAO
baranskistad

Hành vi đặc biệt của '\ b' được diễn giải bởi trình đọc chuỗi, thiết bị đầu cuối văn bản, v.v. nếu không, nó chỉ là một biểu diễn ký tự ASCII khác. stackoverflow.com/a/11891895/4589003
Sudip Bhandari

2

Hầu hết các câu trả lời ở đây quên về cặp thay thế .

Chẳng hạn, ký tự (mật mã U + 1D56B) không khớp với một ký tự char, do đó, để được thể hiện, nó phải tạo thành một cặp thay thế gồm hai ký tự.

Nếu một người chỉ đơn giản áp dụng câu trả lời hiện được chấp nhận (sử dụng str.substring(0, str.length() - 1), một người sẽ ghép cặp thay thế, dẫn đến kết quả không mong muốn.

Người ta cũng nên bao gồm kiểm tra xem nhân vật cuối cùng có phải là một cặp thay thế hay không:

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

Trên một trường hợp góc: điều này bao giờ có thể ném IndexOutOfBoundsException? (ví dụ: có thể là Character.isSurrogate trả về true khi thực sự không có char trước nó, làm cho str.length()-cutphủ định).
GPI

Vâng, điều đó là có thể. Dù sao đó cũng là một chuỗi không hợp lệ, nhưng vẫn có thể - đúng vậy. Sau đó nên thay thế 2bằng Math.min(2, str.length()).
MC Hoàng đế

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

Đầu ra: test-ab


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

Tôi đang sử dụng mã này trong mã của mình, thật dễ dàng và đơn giản. nó chỉ hoạt động trong khi Chuỗi> 0. Tôi có kết nối với một nút và bên trong câu lệnh if sau

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

nếu bạn có tính cách đặc biệt như; trong json chỉ cần sử dụng String.replace (";", "") nếu không bạn phải viết lại tất cả các ký tự trong chuỗi trừ đi lần cuối.


0

Làm thế nào để tạo char trong đệ quy ở cuối:

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

ví dụ như:

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

0

Đây là một câu trả lời hoạt động với các điểm mã bên ngoài Mặt phẳng đa ngôn ngữ cơ bản (Java 8+).

Sử dụng luồng:

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

Hiệu quả hơn có thể:

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

0

Chúng ta có thể sử dụng chuỗi con. Đây là ví dụ,

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

chỉ cần thay thế điều kiện "nếu" như thế này:

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

Điều này sẽ làm cho các mẹo cho bạn.


0

Giả sử tổng chiều dài chuỗi của tôi = 24 Tôi muốn cắt ký tự cuối cùng sau khi vị trí 14 kết thúc, nghĩa là tôi muốn bắt đầu 14 ở đó. Vì vậy, tôi áp dụng giải pháp sau đây.

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

0

Tôi đã phải viết mã cho một vấn đề tương tự. Một cách mà tôi có thể giải quyết nó là sử dụng một phương pháp mã hóa đệ quy.

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

Hầu hết các mã tôi đã thấy trong chủ đề này không sử dụng đệ quy vì vậy hy vọng tôi có thể giúp bạn hoặc ai đó có cùng vấn đề.


0

Dễ như ăn bánh:

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

Đây là một cách để loại bỏ ký tự cuối cùng trong chuỗi:

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]);
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.