วิธีแสดงถ่านว่างในคลาส Java Character


126

ฉันต้องการแทนอักขระว่างใน Java เช่นเดียวกับ ""ใน String ...

เช่นนั้น char ch = an empty character;

อันที่จริงฉันต้องการแทนที่อักขระโดยไม่เว้นวรรค

ฉันคิดว่ามันอาจจะเพียงพอที่จะเข้าใจว่านี่หมายถึงอะไร: ไม่มีอักขระใดที่ไม่มีแม้แต่ช่องว่าง


2
แสดงตัวอย่างของการดำเนินการแทนที่ที่คุณต้องการดำเนินการ
sudocode

1
@rahulsri ฉันไม่เห็นรหัสที่คุณอ้างถึง
Peter Lawrey

3
ผมคิดว่า OP ต้องการที่จะดำเนินการให้มีผลเช่นเดียวกับString.replace(' ', EMPTY_CHARACTER) String.replace(" ", "")คือลบช่องว่างทั้งหมด
Roland

คำตอบ:


134

คุณสามารถกำหนด'\u0000'(หรือ 0) เพื่อจุดประสงค์นี้ให้ใช้Character.MIN_VALUE.

Character ch = Character.MIN_VALUE;

5
สิ่งที่ไม่'\0'ว่าหมายความว่าอย่างไร @AVD
ขนมปังอบเชย

8
@cinnamontoast - มันเป็นตัวอักษร null char
adatapost

11
ค่า null char ลิเทอรัลยังคงเป็นอักขระและใช้พื้นที่ในการจัดเก็บ
Jimmy T.

7
คำถามถามหาวิธีแทนค่า 'ไม่มีอักขระ' แม้ว่าอักขระโมฆะจะมีประโยชน์ในหลาย ๆ สถานการณ์ แต่ก็ยังคงเป็นอักขระที่ถูกต้องดังนั้นจึงไม่สามารถเป็นคำตอบสำหรับคำถามนี้ คำตอบที่ถูกต้องซึ่งได้รับจาก user3001 แล้วคือการใช้ประเภทการอ้างอิงอักขระชนิดบรรจุกล่องของ Java และให้ค่าเป็น 'null' เมื่อต้องการ 'no character'
Chris Hatton

2
@AVD ใช่และ rahulsri ถามว่าจะแสดงตัวละครที่หายไปได้อย่างไร ดังนั้นการอ้างอิงอักขระว่างจึงพอดี
Chris Hatton

97

charหมายถึงอักขระหนึ่งตัว คุณไม่สามารถกำหนดอักขระศูนย์ให้กับประเภทนี้

นั่นหมายความว่าไม่มีค่าถ่านที่String.replace(char, char)จะส่งคืนสตริงที่มีความยาวต่างกัน


14
สามปีหลังจากข้อเท็จจริงในที่สุดก็มีคนให้คำตอบที่ถูกต้องและครบถ้วน
Malnormalulo

นี่เป็นคำตอบที่ถูกต้องมาก
Edgar Asatryan

36

เนื่องจาก Character เป็นคลาสที่มาจาก Object คุณสามารถกำหนด null เป็น "instance":

Character myChar = null;

แก้ไขปัญหา ;)


5
นี่เป็นวิธีแก้ปัญหาที่ถูกต้องและควรเป็นคำตอบที่ได้รับการยอมรับ
Chris Hatton

2
แม้ว่าสิ่งนี้จะไม่ตอบโจทย์ OP แต่ก็เป็นสิ่งที่ฉันกำลังมองหา
Elyess Abouda

2
คำตอบที่ถูกต้องที่สุดคือ "ไม่สามารถทำได้" นี่คือที่ใกล้ที่สุดที่คุณจะได้รับ
Malnormalulo

2
ตัวละครเป็น แต่ถ่านไม่ใช่
Pieter De Bie

12

สตริงว่างคือกระดาษห่อหุ้มที่char[]ไม่มีองค์ประกอบ char[]คุณสามารถมีที่ว่างเปล่า แต่คุณไม่สามารถมี "ว่าง" charได้ เช่นเดียวกับของดั้งเดิมอื่น ๆcharต้องมีค่า

คุณบอกว่าคุณต้องการ "แทนที่อักขระโดยไม่เว้นวรรค"

หากคุณกำลังจัดการกับ a char[]คุณจะต้องสร้างใหม่char[]โดยลบองค์ประกอบนั้นออก

หากคุณกำลังจัดการกับ a Stringคุณจะต้องสร้างใหม่String(สตริงไม่เปลี่ยนรูป) โดยลบอักขระออก

นี่คือตัวอย่างบางส่วนของวิธีการลบถ่าน:

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

}

นอกเหนือจากโซลูชันการแทนที่ () อีกสองตัวจะแทนที่เพียงแค่การเกิดขึ้นครั้งแรกของอักขระไม่ใช่ทั้งหมด
sactiw

8

ในฐานะที่charsสามารถแสดงเป็นจำนวนเต็ม (รหัส ASCII) คุณสามารถเขียน:

char c = 0;

0 ใน ASCII-Code nullคือ


0 เป็นหน่วยรหัส UTF-16 ( char) คือการเข้ารหัส UTF-16 ที่สมบูรณ์สำหรับ Unicode codepoint U + 0000 ความคล้ายคลึงกันใด ๆ กับชุดอักขระอื่น ๆ หรือการเข้ารหัสอักขระไม่เกี่ยวข้อง UTF-16 คือสิ่งที่ Java ใช้
Tom Blodget

6

หากคุณต้องการแทนที่อักขระใน String โดยไม่เหลือพื้นที่ว่างคุณสามารถทำได้โดยใช้ StringBuilder String เป็นวัตถุที่ไม่เปลี่ยนรูปใน java คุณไม่สามารถแก้ไขได้

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

3

คุณทำไม่ได้ "" เป็นลิเทอรัลสำหรับสตริงซึ่งไม่มีอักขระ ไม่มี "อักขระว่าง" (อะไรก็ตามที่คุณหมายถึง)


3

ฉันกำลังมองหาสิ่งนี้ เพียงตั้งค่าchar c = 0;และใช้งานได้อย่างสมบูรณ์ ลองมัน.

ตัวอย่างเช่นหากคุณกำลังพยายามลบอักขระที่ซ้ำกันออกจากสตริงวิธีหนึ่งคือการแปลงสตริงเป็นอาร์เรย์ถ่านและเก็บไว้ในแฮชเซตของอักขระซึ่งจะป้องกันไม่ให้ซ้ำกันโดยอัตโนมัติ

อย่างไรก็ตามอีกวิธีหนึ่งคือการแปลงสตริงเป็นอาร์เรย์ char ใช้สองสำหรับลูปและเปรียบเทียบแต่ละอักขระกับส่วนที่เหลือของสตริง / อาร์เรย์ถ่าน (Big O ในกิจกรรม N ^ 2) จากนั้นสำหรับแต่ละรายการที่ซ้ำกันพบ เพียงแค่ตั้งค่าถ่านนั้นเป็น 0 ..

... และใช้new String(char[])เพื่อแปลงอาร์เรย์ char ผลลัพธ์เป็นสตริงจากนั้น sysout เพื่อพิมพ์ (นี่คือ java btw ทั้งหมด) คุณจะสังเกตว่าตัวอักษรทั้งหมดที่ตั้งค่าเป็นศูนย์นั้นไม่อยู่ที่นั่นและรายการที่ซ้ำกันทั้งหมดจะหายไป โพสต์ยาว แต่แค่อยากยกตัวอย่าง

ดังนั้นใช่ตั้งค่าchar c = 0;หรือถ้าสำหรับอาร์เรย์ถ่านให้ตั้งค่าcArray[i]=0สำหรับอักขระที่ซ้ำกันนั้นและคุณจะลบออก


2

ใน java ไม่มีตัวอักษรว่างเปล่าหรืออีกนัยหนึ่งคือ '' ไม่มีความหมายต่างจาก "" ซึ่งหมายถึงสตริงที่ว่างเปล่า

สิ่งที่ใกล้เคียงที่สุดที่คุณสามารถทำได้เกี่ยวกับการแสดงลิเทอรัลอักขระว่างคือผ่านความยาวศูนย์ char [] เช่น

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

หากคุณอ้างถึงคลาส String ตัวสร้างเริ่มต้นจะสร้างลำดับอักขระว่างโดยใช้ new char[0]

นอกจากนี้การใช้ Character.MIN_VALUE ไม่ถูกต้องเนื่องจากไม่ใช่อักขระที่ว่างเปล่าแทนที่จะเป็นค่าที่น้อยที่สุดของอักขระประเภท

ฉันไม่ชอบCharacter c = null;วิธีแก้ปัญหาเป็นหลักเพราะ jvm จะโยน NPE หากพยายามยกเลิกการใส่กล่อง ประการที่สอง null นั้นเป็นการอ้างอิงถึงประเภทการอ้างอิงที่ไม่มีอะไรเลยและที่นี่เรากำลังจัดการกับประเภทดั้งเดิมซึ่งไม่ยอมรับค่าว่างเป็นค่าที่เป็นไปได้

สมมติว่าในสตริงพูดว่า str OP ต้องการแทนที่การเกิดขึ้นทั้งหมดของอักขระพูด 'x' ด้วยอักขระว่าง '' จากนั้นลองใช้:

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

1

นี่คือวิธีที่ฉันทำ

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

นั่นไม่ใช่ตัวละครที่ว่างเปล่า เป็นอาร์เรย์อักขระที่มีความยาวเป็นศูนย์
Stephen C

1
char ch = Character.MIN_VALUE;

โค้ดด้านบนจะเริ่มต้นตัวแปรchด้วยค่าต่ำสุดที่ถ่านสามารถมีได้ (เช่น\u0000)



0

คุณสามารถใช้อักขระที่มีอยู่ซ้ำได้เท่านั้น เช่น\0ถ้าคุณใส่สิ่งนี้ใน String คุณจะมี String ที่มีอักขระหนึ่งตัวอยู่


สมมติว่าคุณต้องการแบบcharนั้นเมื่อคุณทำ

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

สิ่งที่คุณต้องทำแทนคือ

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

1
คุณหมายถึงit not workedอะไร? คุณหมายความว่ามันไม่ได้รวบรวม? ในกรณีนั้นจะเป็นchar ch = '\0';หรือchar ch = 0;
Peter Lawrey

@rahulsri ตัวละครทั้งหมดเป็นตัวละครและไม่มีตัวละครใดที่ไม่ใช่ตัวละคร คุณต้องค้นหาว่าความต้องการที่แท้จริงของคุณคืออะไรและพยายามแก้ไขด้วยวิธีอื่น nulตัวละครที่เป็นหนึ่งในตัวละครพิเศษมากมายซึ่งแสดงให้เห็นตัวละครซึ่งไม่ได้จริงๆมี แต่มันเป็นตัวเองยังคงเป็นตัวละคร
Peter Lawrey

2
"ถ้าพระเจ้าสามารถทำอะไรพระเจ้าจะสร้างหินขึ้นมาได้หรือไม่?" คล้ายกับคำถาม; คุณสามารถสร้างตัวละครที่ไม่ใช่ตัวละครได้หรือไม่?
Peter Lawrey

0

ใช้ตัว\bดำเนินการ (ตัวดำเนินการหนี backspace) ในพารามิเตอร์ที่สอง

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 ... สิ่งที่น่าขบขันจะเกิดขึ้นหากพยายามใช้สตริงที่แหลกเหลว (ใช่, แหลกเหลว, ขย้ำ, ทำให้เสียโฉม) เป็นส่วนหนึ่งของชื่อไฟล์เช่น
Scre

0

เฮ้ฉันมักจะสร้างวิธีการสำหรับสิ่งที่กำหนดเองซึ่งมักจะไม่ได้ใช้ใน java นี่คือวิธีง่ายๆที่ฉันสร้างขึ้นเพื่อลบตัวละครออกจาก 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();
    }

สำหรับการแสดงความชัดเจนใช่ไม่มีอักขระว่างสำหรับการแทนที่ แต่คุณสามารถลบอักขระเช่นนี้ได้ ฉันรู้ว่ามันเป็นคำถามเก่า แต่ฉันกำลังโพสต์คำตอบนี้เนื่องจากรหัสนี้อาจเป็นประโยชน์สำหรับบางคน

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