2010-11-13 58 views
3

为什么比较字符与另一个字符时,它也必须从字符串中取出?例如;Java .charAt(i)比较问题

这不起作用

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++; 
     } 

任何人都可以解释如果是doi如果出现错误,或者如果它不能像前两个例子那样做。如果是这样,为什么?

回答

10

你混淆

char zero = 0; 

char zero = '0'; 

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

这个混淆是一个相当不幸的从C挂起,char变量被视为数字和字符。

4

您正在查找字符'0'?然后比较为'0',而不是0.

4

您正在比较Unicode值0(又名U + 0000,“null”字符) - 它与Unicode字符不同,代表数字0

使用“0”,而不是0:

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

我不习惯告诉人们使用'charAt':它的设计破坏了。 – tchrist 2010-11-13 19:22:10

3

使用“0”,而不是0。

3

简单的回答是该值0是不一样的,其具有的字符'0' ASCII代码48(IIRC)。

你应该把它与char值charAt(i) == '0'比较或比较charAt(i) - '0' == 0

+0

我不认为你应该告诉人们使用旧的破坏'charAt'方法。问题太多了。 – tchrist 2010-11-13 19:23:13

3

之前减去焦炭这些其他的答案是不是正确的,但有你应该知道一个非常重要的事情。你永远不应该使用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.DFU+3C3U+1F4A9.1F4A9为相应的字符串。最后一个看起来像"\uD83D\uDCA9\uD83D\uDCA9",这简直是疯了。

+2

对于不了解字符集的人来说,你的答案令人困惑。为了找到'0'(或任何BMP字符),charAt没有错,或者你的意思是什么问题? – Ishtar 2010-11-13 22:00:39

+0

@Ishtar:我遇到的问题是字符数不准。类似于“\ uD83D \ uDCA9 \ uD83D \ uDCA9 \ u0000 \ uD83D \ uDCA9 \ uD83D \ uDCA9”'只有5个代码点,NUL在3号。这就是为什么Java模式'^ .... 。$'匹配它:因为Pattern类总是以逻辑单位进行处理,这是正确的。 – tchrist 2010-11-13 22:38:14