Как проверить, равен ли символ пустому пространству?

104

Вот что у меня есть:

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

Но этот код говорит, что не может найти символ для этого метода. Я помню, как у Java был такой компаратор ... Есть предложения?

Йоник
источник
2
пустое пространство - ' 'без содержания?
Андреас Долк

Ответы:

213
if (c == ' ')

charявляется примитивным типом данных, поэтому его можно сравнить с ==.

Кроме того, используя двойные кавычки, вы создаете Stringconstant ( " "), а с одинарными кавычками - charconstant ( ' ').

Никита Рыбак
источник
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(не Equals), он возвращает целое число (не логическое) и сравнивает два значения, которые могут быть повышены до типа, заданного параметром типа.


Кто-то (в удаленном ответе!) Сказал, что пробовал это:

    if (c == " ")

Это не удается по двум причинам:

  • " "является буквальной строка и не литера, и Java не позволяет напрямую сравнивать Stringи charзначение.

  • НИКОГДА не сравнивайте строки или строковые литералы, используя ==. ==Оператор ссылочного типа сравнивает идентификатор объекта, а не значение объекта. В случае Stringс разными объектами с разной идентичностью и одинаковым значением, как правило, используются разные объекты. ==Тест часто дает неправильный ответ ... с точки зрения того , что вы пытаетесь сделать здесь.

Стивен С
источник
20

Вы могли бы использовать

Character.isWhitespace(c)

или любой из других доступных методов в классе Character.

  if (c == ' ')

тоже работает.

Corv1nus
источник
Ну, в конечном итоге это зависит от того, проверяет ли он только пробелы. Я имею в виду, что если он содержит вкладку, вы получите ложное срабатывание.
Обновлено. Он может делать то, что ему нужно, прямо из Персонажа, хотя это излишне.
Corv1nus
18

Поскольку charэто примитивный тип, можно просто писать c == ' '.
Вам нужно только вызвать equals()ссылочные типы, такие как Stringили Character.

SLaks
источник
12

Мое предложение было бы:

if (c == ' ')
MartinStettner
источник
11

Для сравнения персонажей вы используете ==оператор:

if (c == ' ')
codaddict
источник
5

Character.isSpaceChar(c) || Character.isWhitespace(c) работал у меня.

vbevans94
источник
4

В этом случае вы думаете о функции сравнения строк "String".equals("some_text"). Символам не нужно использовать эту функцию. Вместо этого ==будет достаточно стандартного оператора сравнения.

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

источник
3

На первый взгляд, ваш код не компилируется. Поскольку вложенный оператор if не имеет фигурных скобок, он будет рассматривать следующую строку как код, который должен выполнить. Кроме того, вы сравниваете символ со строкой "". Вместо этого попробуйте сравнить значения как символы. Я думаю, что правильный синтаксис будет:

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

Но опять же, я не знаком с "Equal"классом

Бакояро
источник
3

Можешь попробовать:

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

Или:

if((int) ch) == 32)
{
    // Do something...
}
А-Шарабиани
источник
-5

Для сравнения Stringsвы должны использовать ключевое слово equals .

if(c.equals(""))
{
}
Аднан Б.
источник
1) Этот вопрос касается сравнения символов, а не строк. 2) В equalsJava нет ключевого слова. Это идентификатор. 3) Поскольку cэто char(примитивный тип !!), вы не можете позвонить c.equals(...). 4) Даже если бы вы могли, нет никакого charзначения, которому соответствовали бы "". Последнее означает строку, в которой «нет символов». Это не может соответствовать персонажу.
Stephen C
Ключ к ответу на этот вопрос - придумать значение слова «пустое пространство», которое имеет некоторый смысл в контексте.
Stephen C