Jak sprawdzić, czy znak jest równy pustej przestrzeni?

104

Oto co mam:

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

Ale ten kod mówi, że nie może znaleźć symbolu dla tej metody. Pamiętam, że Java miała taką porównywarkę ... Jakieś sugestie?

Jonik
źródło
2
pusta przestrzeń - ' 'bez treści?
Andreas Dolk

Odpowiedzi:

213
if (c == ' ')

charjest prymitywnym typem danych, więc można go porównać z ==.

Ponadto, używając podwójnych cudzysłowów tworzysz Stringstałą ( " "), podczas gdy w przypadku apostrofów jest to charstała ( ' ').

Nikita Rybak
źródło
88

Kod, którego potrzebujesz, zależy od tego, co masz na myśli mówiąc „puste miejsce”.

  • Jeśli masz na myśli znak spacji ASCII / Latin-1 / Unicode (0x20) aka SP, to:

    if (ch == ' ') {
        // ...
    }
    
  • Jeśli masz na myśli dowolny z tradycyjnych białych znaków ASCII (SP, HT, VT, CR, NL), to:

    if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n' || ch == '\x0b') {
        // ...
    }
    
  • Jeśli masz na myśli dowolny biały znak Unicode, to:

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

Zauważ, że istnieją białe znaki Unicode zawierające dodatkowe kody sterujące ASCII i kilka innych znaków Unicode w wyższych płaszczyznach kodu; zobacz javadoc dla Character.isWhitespace(char).


Oto co napisałeś:

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

Jest to błędne na wielu poziomach. Po pierwsze, sposób, w jaki kompilator języka Java próbuje to zinterpretować, jest wywołaniem metody z sygnaturą boolean Equals(char, String).

  • Jest to błędne, ponieważ nie istnieje żadna metoda, o czym kompilator zgłosił w komunikacie o błędzie.
  • Equalsi tak normalnie nie byłaby nazwą metody. Konwencja języka Java jest taka, że ​​nazwy metod zaczynają się od małej litery.
  • Twój kod (jak napisano) starał się porównać charakter i ciąg, ale chari Stringnie są porównywalne i nie mogą być oddane do wspólnego typu bazowego.

W Javie istnieje coś takiego jak komparator, ale jest to interfejs, a nie metoda, i jest zadeklarowany w ten sposób:

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

Innymi słowy, nazwa metody to compare(nie Equals), zwraca liczbę całkowitą (nie wartość logiczną) i porównuje dwie wartości, które można podwyższyć do typu podanego przez parametr type.


Ktoś (w usuniętej odpowiedzi!) Powiedział, że spróbował tego:

    if (c == " ")

To się nie udaje z dwóch powodów:

  • " "jest literałem typu String, a nie literałem znakowym, a Java nie zezwala na bezpośrednie porównywanie wartości Stringi char.

  • NIGDY nie należy porównywać ciągów znaków ani literałów ciągów przy użyciu ==. ==Operator od rodzaju odniesienia porównuje tożsamość obiektu, a nie wartość obiektu. W tym przypadku Stringczęsto mamy różne przedmioty o różnej tożsamości i tej samej wartości. ==Test często dają złą odpowiedź ... z punktu widzenia tego, co staramy się robić tutaj.

Stephen C.
źródło
20

Możesz użyć

Character.isWhitespace(c)

lub dowolna z innych dostępnych metod w klasie Character.

  if (c == ' ')

również działa.

Corv1nus
źródło
Cóż, ostatecznie zależy to od tego, czy sprawdza tylko spacje. Mam na myśli to, że jeśli zawiera kartę, dostaniesz fałszywy alarm.
Zaktualizowano. Może robić to, czego potrzebuje bezpośrednio od Postaci, chociaż jest to przesada.
Corv1nus
18

Ponieważ charjest to typ prymitywny, możesz po prostu pisać c == ' '.
Wystarczy wywołać equals()typy referencyjne, takie jak Stringlub Character.

SLaks
źródło
12

Moja sugestia byłaby taka:

if (c == ' ')
MartinStettner
źródło
11

Aby porównać znak, użyj ==operatora:

if (c == ' ')
codaddict
źródło
5

Character.isSpaceChar(c) || Character.isWhitespace(c) pracował dla mnie.

vbevans94
źródło
4

W tym przypadku myślisz o funkcji porównującej String "String".equals("some_text"). Znaki nie muszą korzystać z tej funkcji. Zamiast tego wystarczy standardowy ==operator porównania.

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

źródło
3

Na pierwszy rzut oka Twój kod się nie kompiluje. Ponieważ zagnieżdżona instrukcja if nie ma żadnych nawiasów klamrowych, weźmie pod uwagę następny wiersz kodu, który powinien wykonać. Porównujesz również znak ze stringiem, „”. Zamiast tego spróbuj porównać wartości jako znaki. Myślę, że poprawna składnia to:

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

Ale z drugiej strony, nie znam tej "Equal"klasy

bakoyaro
źródło
3

Możesz spróbować:

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

Lub:

if((int) ch) == 32)
{
    // Do something...
}
A-Sharabiani
źródło
-5

Aby porównać Strings, musisz użyć słowa kluczowego equals .

if(c.equals(""))
{
}
Adnan B.
źródło
1) To pytanie dotyczy porównywania znaków, a nie łańcuchów. 2) W equalsJavie nie ma słowa kluczowego. To jest identyfikator. 3) Ponieważ cjest char(typ prymitywny !!), nie możesz zadzwonić c.equals(...). 4) Nawet gdybyś mógł, nie ma charwartości, na którą jest mapowana "". To ostatnie oznacza łańcuch bez „znaków”. To nie może pasować do postaci.
Stephen C,
Kluczem do odpowiedzi na to pytanie jest znalezienie znaczenia dla „pustej przestrzeni”, które ma jakiś sens w kontekście.
Stephen C