Java .charAt(i)比较问题

时间:2010-11-13 17:57:19

标签: java string comparison char

为什么在将char与另一个char进行比较时,还必须从字符串中获取?例如;

这不起作用

   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 个答案:

答案 0 :(得分:10)

你很困惑

char zero = 0;

char zero = '0';

前者是空字符(ASCII值为零),而后者是表示数字零的字符。

这种混乱是C的一个相当不幸的问题,char个变量被视为数字和字符。

答案 1 :(得分:4)

您正在寻找角色'0'?然后比较'0',而不是0.

答案 2 :(得分:4)

您正在与Unicode值0(又名U + 0000,“空”字符)进行比较 - 这与表示数字0 的Unicode字符不同。

使用'0'代替0:

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

答案 3 :(得分:3)

使用'0'代替0。

答案 4 :(得分:3)

简单的答案是值0与ASCII码'0'(IIRC)的字符48不同。

您应该将它与char值charAt(i) == '0'进行比较,或者在比较前减去char charAt(i) - '0' == 0

答案 5 :(得分:3)

这些其他答案是正确的,但有一件非常重要的事情你应该知道。你永远不应该使用chatAt!您应该只使用codePointAt

同样,你不能盲目地使用i++来突破字符串。您需要了解s.codePointAt(i) > Character.MAX_VALUE是否要提供额外的i++踢球者。

例如,以标准“U +”表示法打印出String s中的所有代码点:

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.DFU+3C3U+1F4A9.1F4A9。最后一个看起来像"\uD83D\uDCA9\uD83D\uDCA9",这简直就是疯了。