Cách biểu diễn char trống trong lớp Ký tự Java


125

Tôi muốn thể hiện một ký tự trống trong Java như ""trong Chuỗi ...

Như thế char ch = an empty character;

Thật ra tôi muốn thay thế một nhân vật mà không để lại không gian.

Tôi nghĩ rằng nó có thể đủ để hiểu điều này có nghĩa là gì: không có nhân vật nào thậm chí không gian.


2
Hiển thị một ví dụ về hoạt động thay thế bạn muốn thực hiện.
sudocode

1
@rahulsri Tôi không thể xem mã bạn đang đề cập đến.
Peter Lawrey

2
Tôi nghĩ rằng OP muốn thực hiện String.replace(' ', EMPTY_CHARACTER)để có hiệu ứng tương tự như String.replace(" ", ""). Tức là loại bỏ tất cả các không gian.
Roland

Câu trả lời:


133

Bạn có thể gán '\u0000'(hoặc 0). Đối với mục đích này, sử dụng Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;

5
Không gì '\0'chính xác nghĩa là gì? @AVD
bánh mì nướng quế

8
@cinnamontoast - Đó là một chữ null char
adatapost

11
Một ký tự null null vẫn là một ký tự và chiếm không gian lưu trữ.
Jimmy T.

7
Câu hỏi yêu cầu một cách để thể hiện 'không có ký tự'. Mặc dù ký tự null rất hữu ích trong nhiều tình huống, nó vẫn là một ký tự theo đúng nghĩa của nó, vì vậy không thể là câu trả lời cho câu hỏi này. Câu trả lời đúng, đã được đưa ra bởi user3001, là sử dụng loại tham chiếu Ký tự được đóng hộp của Java và cung cấp cho nó giá trị 'null' khi cần 'không có ký tự'.
Chris Hatton

2
@AVD Có, và rahulsri hỏi cách thể hiện một nhân vật bị mất tích. Vì vậy, một tham chiếu nhân vật null phù hợp.
Chris Hatton

95

charcó nghĩa là chính xác một ký tự. Bạn không thể gán 0 ký tự cho loại này.

Điều đó có nghĩa là không có giá trị char nào String.replace(char, char)sẽ trả về một chuỗi có độ dài khác nhau.


13
Ba năm sau khi thực tế, cuối cùng cũng có người đưa ra một câu trả lời đúng và đầy đủ.
Maln normalulo

Đây là một câu trả lời rất chính xác.
Edgar Asatryan

36

Vì Ký tự là một lớp xuất phát từ Object, bạn có thể gán null làm "thể hiện":

Character myChar = null;

Vấn đề được giải quyết;)


5
Đây là một giải pháp chính xác và nên là câu trả lời được chấp nhận.
Chris Hatton

2
Mặc dù điều này không trả lời OP, nhưng đó là điều tôi đang tìm kiếm.
Elyess Abouda

2
Câu trả lời đúng nhất là "không thể thực hiện được". Đây là gần nhất bạn có thể nhận được.
Maln normalulo

2
Nhân vật là vậy, nhưng char thì không.
Pieter De Bie

12

Chuỗi rỗng là một trình bao bọc trên a char[]không có phần tử. Bạn có thể có một sản phẩm nào char[]. Nhưng bạn không thể có một "sản phẩm nào" char. Giống như các nguyên thủy khác, charphải có một giá trị.

Bạn nói rằng bạn muốn "thay thế một nhân vật mà không để lại một khoảng trống".

Nếu bạn đang làm việc với a char[], thì bạn sẽ tạo một cái mới char[]với phần tử đó bị loại bỏ.

Nếu bạn đang làm việc với a String, thì bạn sẽ tạo một String(Chuỗi không thay đổi) mới với ký tự bị xóa.

Dưới đây là một số mẫu về cách bạn có thể xóa char:

public static void main(String[] args) throws Exception {

    String s = "abcdefg";
    int index = s.indexOf('d');

    // delete a char from a char[]
    char[] array = s.toCharArray();
    char[] tmp = new char[array.length-1];
    System.arraycopy(array, 0, tmp, 0, index);
    System.arraycopy(array, index+1, tmp, index, tmp.length-index);
    System.err.println(new String(tmp));

    // delete a char from a String using replace
    String s1 = s.replace("d", "");
    System.err.println(s1);

    // delete a char from a String using StringBuilder
    StringBuilder sb = new StringBuilder(s);
    sb.deleteCharAt(index);
    s1 = sb.toString();
    System.err.println(s1);

}

Ngoài giải pháp thay thế (), hai giải pháp khác sẽ chỉ thay thế lần xuất hiện đầu tiên của nhân vật và không phải tất cả.
sactiw

8

Như charscó thể được biểu diễn dưới dạng Số nguyên (ASCII-Code), bạn chỉ cần viết:

char c = 0;

Số 0 trong ASCII-Code là null.


0 dưới dạng đơn vị mã UTF-16 ( char) là mã hóa UTF-16 hoàn chỉnh cho mã hóa Unicode U + 0000. Bất kỳ sự tương đồng với một số bộ ký tự hoặc mã hóa ký tự khác là không liên quan. UTF-16 là những gì Java sử dụng.
Tom Blodget

6

Nếu bạn muốn thay thế một ký tự trong Chuỗi mà không để lại bất kỳ khoảng trống nào thì bạn có thể đạt được điều này bằng cách sử dụng StringBuilder. Chuỗi là đối tượng bất biến trong java, bạn không thể sửa đổi nó.

String str = "Hello";
StringBuilder sb = new StringBuilder(str);
sb.deleteCharAt(1); // to replace e character

3

Bạn không thể. "" là nghĩa đen của một chuỗi, không chứa ký tự. Nó không chứa "ký tự trống" (ý của bạn là gì).


3

Tôi vẫn đang tìm kiếm điều này. Đơn giản chỉ cần đặt char c = 0;và nó hoạt động hoàn hảo. Thử nó.

Ví dụ: nếu bạn đang cố xóa các ký tự trùng lặp khỏi Chuỗi, một cách sẽ là chuyển đổi chuỗi thành mảng char và lưu trữ trong một tập hợp các ký tự sẽ tự động ngăn các bản sao.

Tuy nhiên, một cách khác sẽ là chuyển đổi chuỗi thành một mảng char, sử dụng hai vòng lặp for và so sánh từng ký tự với phần còn lại của chuỗi / char (hoạt động Big O trên N ^ 2), sau đó cho mỗi lần tìm thấy trùng lặp chỉ cần đặt char đó thành 0 ..

... và sử dụng new String(char[])để chuyển đổi mảng char kết quả thành chuỗi và sau đó sysout để in (đây là tất cả java btw). bạn sẽ quan sát tất cả các ký tự được đặt thành 0 chỉ đơn giản là không có ở đó và tất cả các bản sao đã biến mất. bài viết dài, nhưng chỉ muốn cho bạn một ví dụ.

Vì vậy, có đặt char c = 0;hoặc nếu cho mảng char, đặt cArray[i]=0cho ký tự trùng lặp cụ thể đó và bạn sẽ xóa nó.


2

Trong java không có gì là ký tự trống rỗng , nói cách khác, '' không có nghĩa không giống như "" có nghĩa là một chuỗi ký tự trống

Cách gần nhất mà bạn có thể nói về việc thể hiện ký tự trống theo nghĩa đen là thông qua char có độ dài bằng không [], đại loại như:

char[] cArr = {};         // cArr is a zero length array
char[] cArr = new char[0] // this does the same

Nếu bạn tham khảo lớp String, hàm tạo mặc định của nó tạo một chuỗi ký tự trống bằng cách sử dụng new char[0]

Ngoài ra, sử dụng Character.MIN_VALUE là không chính xác vì nó không thực sự là ký tự trống mà là giá trị nhỏ nhất của loại ký tự.

Tôi cũng không thích Character c = null;như một giải pháp chủ yếu vì jvm sẽ ném NPE nếu nó cố gắng bỏ hộp. Thứ hai, null về cơ bản là một tham chiếu đến loại tham chiếu wrt không có gì và ở đây chúng ta đang xử lý loại nguyên thủy không chấp nhận null là một giá trị có thể.

Giả sử trong chuỗi, nói str, OP muốn thay thế tất cả các lần xuất hiện của một ký tự, nói 'x', bằng ký tự trống '', sau đó thử sử dụng:

str.replace("x", "");

1

đây là cách tôi làm

char[] myEmptyCharArray = "".toCharArray();

Đó không phải là một nhân vật trống rỗng. Nó là một mảng ký tự có độ dài bằng không.
Stephen C

1
char ch = Character.MIN_VALUE;

Đoạn mã trên sẽ khởi tạo biến chvới giá trị tối thiểu mà char có thể có (tức là \u0000).


1

Bạn có thể làm một cái gì đó như thế này:

mystring.replace(""+ch, "");

0

Bạn chỉ có thể sử dụng lại một nhân vật hiện có. ví dụ: \0Nếu bạn đặt chuỗi này trong Chuỗi, bạn sẽ có Chuỗi có một ký tự trong đó.


Nói rằng bạn muốn charnhư vậy khi bạn làm

String s = 
char ch = ?
String s2 = s + ch; // there is not char which does this.
assert s.equals(s2);

thay vào đó, những gì bạn phải làm là

String s = 
char ch = MY_NULL_CHAR;
String s2 = ch == MY_NULL_CHAR ? s : s + ch;
assert s.equals(s2);

1
Ý bạn là it not workedgì Bạn có nghĩa là nó không biên dịch? Trong trường hợp đó, nó sẽ là char ch = '\0';hoặcchar ch = 0;
Peter Lawrey

@rahulsri Tất cả các nhân vật là nhân vật và không có nhân vật nào không phải là nhân vật. Bạn cần tìm ra yêu cầu thực sự của bạn là gì và cố gắng giải quyết nó theo một cách khác. Nhân nulvật này là một trong nhiều nhân vật đặc biệt chỉ ra một nhân vật không thực sự ở đó, nhưng bản thân nó vẫn là một nhân vật.
Peter Lawrey

2
"Nếu thần có thể làm bất cứ điều gì, thần có thể tạo ra một tảng đá thậm chí anh ta không thể nâng?" Nó tương tự như câu hỏi; Bạn có thể tạo một nhân vật không phải là một nhân vật?
Peter Lawrey

0

Sử dụng \btoán tử (toán tử thoát backspace) trong tham số thứ hai

String test= "Anna Banana";

System.out.println(test); //returns Anna Banana<br><br>
System.out.println(test.replaceAll(" ","\b")); //returns AnnaBanana removing all the spaces in the string

xD ... những điều thú vị sẽ dẫn đến kết quả nếu cố gắng sử dụng chuỗi xéo (vâng, sai lệch, biến dạng, biến dạng) như một phần của ví dụ tên tệp.
Scre

0

Hey tôi luôn tạo phương thức cho các công cụ tùy chỉnh thường không được thực hiện trong java. Đây là một phương pháp đơn giản tôi đã thực hiện để xóa ký tự khỏi String Fast

    public static String removeChar(String str, char c){
        StringBuilder strNew=new StringBuilder(str.length());
        char charRead;
        for(int i=0;i<str.length();i++){
            charRead=str.charAt(i);
            if(charRead!=c)
                strNew.append(charRead);
        }
        return strNew.toString();
    }

Để giải thích, có, không có ký tự null để thay thế, nhưng bạn có thể xóa ký tự như thế này. Tôi biết đó là một câu hỏi cũ, nhưng tôi đang đăng câu trả lời này vì mã này có thể hữu ích cho một số ngườ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.