Wie überprüfe ich, ob ein Zeichen einem leeren Feld entspricht?

104

Folgendes habe ich:

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

Dieser Code besagt jedoch, dass das Symbol für diese Methode nicht gefunden werden kann. Ich erinnere mich, dass Java einen solchen Vergleich hatte ... Irgendwelche Vorschläge?

Jonik
quelle
2
leerer Raum - ein ' 'ohne Inhalt?
Andreas Dolk

Antworten:

213
if (c == ' ')

charist ein primitiver Datentyp, mit dem er verglichen werden kann ==.

Wenn Sie doppelte Anführungszeichen verwenden, erstellen Sie außerdem StringKonstante ( " "), während es sich bei einfachen Anführungszeichen um eine charKonstante ( ' ') handelt.

Nikita Rybak
quelle
87

Der Code, den Sie benötigen, hängt davon ab, was Sie unter "leerem Raum" verstehen.

  • Wenn Sie das ASCII / Latin-1 / Unicode-Leerzeichen (0x20) oder SP meinen, dann:

    if (ch == ' ') {
        // ...
    }
    
  • Wenn Sie eines der traditionellen ASCII-Leerzeichen (SP, HT, VT, CR, NL) meinen, dann:

    if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '\x0b') {
        // ...
    }
    
  • Wenn Sie ein Unicode-Leerzeichen meinen, dann:

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

Beachten Sie, dass es Unicode-Leerzeichen gibt, die zusätzliche ASCII-Steuercodes und einige andere Unicode-Zeichen in höheren Codeebenen enthalten. siehe den Javadoc für Character.isWhitespace(char).


Was Sie geschrieben haben, war Folgendes:

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

Dies ist auf mehreren Ebenen falsch. Erstens ist die Art und Weise, wie der Java-Compiler versucht, dies als Aufruf einer Methode mit der Signatur von zu interpretieren boolean Equals(char, String).

  • Dies ist falsch, da keine Methode vorhanden ist, wie der Compiler in der Fehlermeldung gemeldet hat.
  • Equalswäre normalerweise sowieso nicht der Name einer Methode. Die Java-Konvention besagt, dass Methodennamen mit einem Kleinbuchstaben beginnen.
  • Ihr Code (wie geschrieben) wurde versucht , einen Charakter und einen String zu vergleichen, aber charund Stringist nicht vergleichbar und kann nicht auf einen gemeinsamen Basistyp umgewandelt werden.

Es gibt so etwas wie einen Komparator in Java, aber es ist eine Schnittstelle, keine Methode, und es wird wie folgt deklariert:

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

Mit anderen Worten, der Methodenname ist compare(nicht Equals), er gibt eine Ganzzahl (kein Boolescher Wert) zurück und vergleicht zwei Werte, die auf den durch den Typparameter angegebenen Typ heraufgestuft werden können.


Jemand (in einer gelöschten Antwort!) Sagte, er habe Folgendes versucht:

    if (c == " ")

Das scheitert aus zwei Gründen:

  • " "ist ein String-Literal und kein Zeichenliteral, und Java erlaubt keinen direkten Vergleich von Stringund charWerten.

  • Sie sollten NIEMALS Strings oder String-Literale mit vergleichen ==. Der ==Operator eines Referenztyps vergleicht die Objektidentität und nicht den Objektwert. Im Falle Stringist es üblich, unterschiedliche Objekte mit unterschiedlicher Identität und gleichem Wert zu haben. Ein ==Test gibt oft die falsche Antwort ... aus der Perspektive dessen, was Sie hier versuchen.

Stephen C.
quelle
20

Du könntest benutzen

Character.isWhitespace(c)

oder eine der anderen verfügbaren Methoden in der Zeichenklasse.

  if (c == ' ')

funktioniert auch.

Corv1nus
quelle
Nun, es kommt letztendlich darauf an, ob er nur nach Leerzeichen sucht. Ich meine, wenn es einen Tab enthält, würden Sie ein falsches Positiv erhalten.
Aktualisiert. Er kann direkt vom Charakter aus tun, was er braucht, obwohl es übertrieben ist.
Corv1nus
18

Da chares sich um einen primitiven Typ handelt, können Sie einfach schreiben c == ' '.
Sie müssen nur equals()Referenztypen wie Stringoder aufrufen Character.

SLaks
quelle
12

Mein Vorschlag wäre:

if (c == ' ')
MartinStettner
quelle
11

Um Zeichen zu vergleichen, verwenden Sie den ==Operator:

if (c == ' ')
Codaddict
quelle
5

Character.isSpaceChar(c) || Character.isWhitespace(c) arbeitete für mich.

vbevans94
quelle
4

In diesem Fall denken Sie an die String-Vergleichsfunktion "String".equals("some_text"). Zeichen müssen diese Funktion nicht verwenden. Stattdessen reicht ein Standardvergleichsoperator ==aus.

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

quelle
3

Auf den ersten Blick wird Ihr Code nicht kompiliert. Da die verschachtelte if-Anweisung keine geschweiften Klammern enthält, wird in der nächsten Zeile der Code berücksichtigt, den sie ausführen soll. Außerdem vergleichen Sie ein Zeichen mit einem String "". Versuchen Sie stattdessen, die Werte als Zeichen zu vergleichen. Ich denke, die richtige Syntax wäre:

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

Aber andererseits bin ich mit der "Equal"Klasse nicht vertraut

Bakoyaro
quelle
3

Du kannst es versuchen:

if(Character.isSpaceChar(ch))
{
    // Do something...
}

Oder:

if((int) ch) == 32)
{
    // Do something...
}
A-Sharabiani
quelle
-5

Zum Vergleichen müssen StringsSie das Schlüsselwort equals verwenden .

if(c.equals(""))
{
}
Adnan B.
quelle
1) Bei dieser Frage geht es um den Vergleich von Zeichen, nicht von Zeichenfolgen. 2) equalsIn Java gibt es kein Schlüsselwort. Es ist eine Kennung. 3) Da ces sich um einen char(primitiven Typ !!) handelt, können Sie nicht anrufen c.equals(...). 4) Selbst wenn Sie könnten, gibt es keinen charWert, der zugeordnet ist "". Letzteres bedeutet eine Zeichenfolge mit "keinen Zeichen". Das kann nicht mit einem Charakter übereinstimmen.
Stephen C
Der Schlüssel zur Beantwortung dieser Frage liegt darin, eine Bedeutung für "leeren Raum" zu finden, die im Kontext einen Sinn ergibt.
Stephen C