Java .charAt (i) проблема сравнения - PullRequest
3 голосов
/ 13 ноября 2010

Почему при сравнении символа с другим он также должен быть взят из строки?Например;

Это не работает

   while(i < t.length() && zeroCount < 5) {
        if(t.charAt(i) == 0){
            zeroCount++;
        }
        i++;
    }

И это не

char zero = 0;

      while(i < t.length() && zeroCount < 5) {
            if(t.charAt(i) == zero){
                zeroCount++;
            }
            i++;
        }

Единственный способ, которым яудалось заставить его работать вот так ...

String zeros = "0000000000";

      while(i < t.length() && zeroCount < 5) {
            if(t.charAt(i) == zeros.charAt(i)){
                zeroCount++;
            }
            i++;
        }

Может кто-нибудь объяснить, если я делаю что-то не так, или это просто неприемлемо, как в верхних 2 примерах.Если так, то почему?

Ответы [ 6 ]

10 голосов
/ 13 ноября 2010

Вы путаете

char zero = 0;

с

char zero = '0';

Первым является нулевой символ (значение ASCII, равное нулю), тогда как вторым является символ, представляющий цифру ноль..

Эта путаница - довольно неудачное похмелье от C, когда char переменные обрабатываются как числа, так и символы.

4 голосов
/ 13 ноября 2010

Вы сравниваете со значением Unicode 0 (он же U + 0000, символ "null") - это не то же самое, что символ Unicode , представляющий цифру 0 .

Используйте 0 вместо 0:

while(i < t.length() && zeroCount < 5) {
    if(t.charAt(i) == '0'){
        zeroCount++;
    }
    i++;
}
4 голосов
/ 13 ноября 2010

Вы ищете символ «0»? Затем сравните с «0», а не 0.

3 голосов
/ 13 ноября 2010

Эти другие ответы верны, но есть одна очень важная вещь, которую вы должны знать. Вы никогда не должны использовать chatAt! Вы должны использовать только codePointAt.

Точно так же вы не должны слепо использовать i++, чтобы натолкнуться на строку. Вам нужно посмотреть, может ли s.codePointAt(i) > Character.MAX_VALUE знать, дать ли дополнительный i++ кикер.

Например, чтобы распечатать все кодовые точки в String s в стандартном формате «U +»:

private static void say_U_contents(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

Таким образом, вы можете выводить как U+61.DF, U+3C3 и U+1F4A9.1F4A9 для соответствующих строк. Последний выглядит как "\uD83D\uDCA9\uD83D\uDCA9", что просто безумие.

3 голосов
/ 13 ноября 2010

Простой ответ заключается в том, что значение 0 отличается от символа '0', код ASCII которого равен 48 (IIRC).

Вы должны сравнить его со значением символа charAt(i) == '0' или вычесть символ перед сравнением charAt(i) - '0' == 0

3 голосов
/ 13 ноября 2010

Используйте «0» вместо 0.

...