จะตรวจสอบได้อย่างไรว่าถ่านเท่ากับพื้นที่ว่างหรือไม่?


105

นี่คือสิ่งที่ฉันมี:

private static int countNumChars(String s) {
    for(char c : s.toCharArray()){
        if (Equals(c," "))
    }
}

แต่รหัสนั้นบอกว่าไม่พบ Symbol สำหรับวิธีการนั้น ฉันจำได้ว่า Java มีตัวเปรียบเทียบแบบนี้ ... มีข้อเสนอแนะไหม


2
พื้นที่ว่าง - ' 'ไม่มีเนื้อหา?
Andreas Dolk

คำตอบ:


214
if (c == ' ')

charเป็นประเภทข้อมูลดั้งเดิมดังนั้นจึงสามารถเปรียบเทียบกับ==.

นอกจากนี้โดยใช้เครื่องหมายคำพูดคู่คุณสร้างStringค่าคงที่ ( " ") ในขณะที่อัญประกาศเดี่ยวเป็นcharค่าคงที่ ( ' ')


88

รหัสที่คุณต้องการขึ้นอยู่กับความหมายของ "พื้นที่ว่าง"

  • หากคุณหมายถึงอักขระช่องว่าง ASCII / Latin-1 / Unicode (0x20) หรือที่เรียกว่า SP ดังนั้น:

    if (ch == ' ') {
        // ...
    }
  • หากคุณหมายถึงอักขระช่องว่าง ASCII แบบดั้งเดิม (SP, HT, VT, CR, NL) แล้ว:

    if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '\x0b') {
        // ...
    }
  • หากคุณหมายถึงอักขระช่องว่าง Unicode ใด ๆ ให้ทำดังนี้

    if (Character.isWhitespace(ch)) {
        // ...
    }

โปรดทราบว่าช่องว่าง Unicode มีรหัสควบคุม ASCII เพิ่มเติมและอักขระ Unicode อื่น ๆ ในระนาบรหัสที่สูงกว่า ดู Javadoc Character.isWhitespace(char)สำหรับ


สิ่งที่คุณเขียนคือ:

    if (Equals(ch, " ")) {
        // ...
    }

สิ่งนี้ผิดในหลายระดับ ประการแรกวิธีที่คอมไพลเลอร์ Java พยายามตีความว่าเป็นการเรียกใช้เมธอดที่มีลายเซ็นของboolean Equals(char, String).

  • สิ่งนี้ผิดเนื่องจากไม่มีวิธีการตามที่คอมไพลเลอร์รายงานในข้อความแสดงข้อผิดพลาด
  • Equalsปกติจะไม่ใช่ชื่อของวิธีการอยู่แล้ว อนุสัญญา Java คือชื่อเมธอดเริ่มต้นด้วยอักษรตัวพิมพ์เล็ก
  • รหัสของคุณ (เขียน) คือการพยายามที่จะเปรียบเทียบตัวอักษรและสตริง แต่charและStringไม่ได้เปรียบและไม่สามารถโยนไปประเภทฐานร่วมกัน

มีสิ่งนี้เป็นตัวเปรียบเทียบใน Java แต่มันเป็นอินเทอร์เฟซไม่ใช่เมธอดและมีการประกาศดังนี้:

    public interface Comparator<T> {
        public int compare(T v1, T v2);
    }

กล่าวอีกนัยหนึ่งชื่อเมธอดคือcompare(not Equals) จะส่งคืนจำนวนเต็ม (ไม่ใช่บูลีน) และเปรียบเทียบค่าสองค่าที่สามารถเลื่อนระดับเป็นประเภทที่กำหนดโดยพารามิเตอร์ type


มีคน (ในคำตอบที่ถูกลบ!) กล่าวว่าพวกเขาลองทำสิ่งนี้:

    if (c == " ")

ซึ่งล้มเหลวด้วยเหตุผลสองประการ:

  • " "เป็นสตริงลิเทอรัลไม่ใช่อักขระลิเทอรัลและ Java ไม่อนุญาตให้เปรียบเทียบโดยตรงของStringและcharค่า

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


20

คุณสามารถใช้

Character.isWhitespace(c)

หรือวิธีการอื่น ๆ ที่มีอยู่ในคลาส Character

  if (c == ' ')

ยังใช้งานได้


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

อัปเดตแล้ว เขาสามารถทำสิ่งที่ต้องการได้โดยตรงจากตัวละครแม้ว่ามันจะมากเกินไป
Corv1nus

18

เนื่องจากcharเป็นประเภทดั้งเดิมคุณสามารถเขียนc == ' 'ได้
คุณจะต้องเรียกequals()ประเภทเช่นการอ้างอิงหรือStringCharacter





4

"String".equals("some_text")ในกรณีนี้คุณกำลังคิดของสตริงฟังก์ชั่นการเปรียบเทียบ Chars ไม่จำเป็นต้องใช้ฟังก์ชันนี้ แต่ตัว==ดำเนินการเปรียบเทียบมาตรฐานจะเพียงพอ

private static int countNumChars(String s) {
    for(char c : s.toCharArray()){
        if (c == ' ') // your resulting outcome
    }
}

3

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

if(c == ' '){
   //do something here
}

แต่แล้วอีกครั้งฉันไม่คุ้นเคยกับ"Equal"ชั้นเรียน



-5

ในการเปรียบเทียบStringsคุณต้องใช้คำหลักเท่ากับ

if(c.equals(""))
{
}

1) คำถามนี้เกี่ยวกับการเปรียบเทียบอักขระไม่ใช่สตริง 2) ไม่มีequalsคีย์เวิร์ดใน Java มันเป็นตัวระบุ 3) เนื่องจากcเป็นchar(แบบดั้งเดิม !!) คุณไม่สามารถโทรc.equals(...)ได้ 4) แม้ว่าคุณจะทำได้ แต่ก็ไม่มีcharค่าใดที่จะจับคู่""ได้ ส่วนหลังหมายถึงสตริงที่ "ไม่มีอักขระอยู่ในนั้น" ที่ไม่สามารถจับคู่อักขระ
Stephen C

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