2010-11-13 96 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