2010-11-13 3 views
3

Pourquoi lors de la comparaison d'un char par rapport à un autre, doit-il être pris aussi à partir d'une chaîne? Par exemple;Java .charAt (i) problème de comparaison

Cela ne fonctionne pas

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

ne le fait

char zero = 0; 

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

La seule façon que je réussi à le faire fonctionner est comme ça ...

String zeros = "0000000000"; 

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

Quelqu'un peut-il expliquer si je suis doi Quelque chose ne va pas, ou si ce n'est pas acceptable de le faire comme les 2 meilleurs exemples. Si oui, pourquoi?

Répondre

10

Vous confondez

char zero = 0; 

avec

char zero = '0'; 

Le premier est le caractère nul (valeur ASCII de zéro), alors que ce dernier est le caractère représentant le chiffre zéro.

Cette confusion est un malheureux hang-over de C, avec char variables étant traitées comme des nombres ainsi que des caractères.

4

Vous recherchez le caractère '0'? Ensuite, comparez à « 0 », et non 0.

4

Vous comparez contre la valeur Unicode 0 (alias U + 0000, le caractère « null ») - qui n'est pas le même que le caractère Unicode représentant le chiffre 0 .

Utilisez '0' au lieu de 0:

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

Je ne suis pas à l'aise de dire aux gens d'utiliser 'charAt': il est cassé par la conception. – tchrist

3

Utilisez '0' au lieu de 0.

3

La réponse simple est que la valeur 0 est pas le même que le caractère '0' qui a une Code ASCII de 48 (IIRC).

Vous devriez comparer avec la valeur char charAt(i) == '0' ou soustraire le charbon avant la comparaison charAt(i) - '0' == 0

+0

Je ne pense pas que vous devriez dire aux gens d'utiliser la vieille méthode 'charAt' cassée. Trop de problèmes. – tchrist

3

Ces autres réponses ont raison, mais il y a une chose très importante que vous devez savoir. Vous ne devriez jamais utiliser chatAt! Vous devriez seulement utiliser codePointAt.

De même, vous ne devez pas utiliser aveuglément i++ pour passer à travers une chaîne. Vous devez voir si s.codePointAt(i) > Character.MAX_VALUE pour savoir si donner un extra i++ kicker.

Par exemple, pour imprimer tous les points de code dans un String s en notation standard "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("."); } 
    } 
} 

De cette façon, vous pouvez produire comme U+61.DF, U+3C3 et U+1F4A9.1F4A9 pour les chaînes correspondantes. Ce dernier ressemble à "\uD83D\uDCA9\uD83D\uDCA9", ce qui est tout simplement fou.

+2

Votre réponse est source de confusion pour quelqu'un qui ne connaît pas les charsets. Pour trouver '0' (ou n'importe quel caractère BMP) il n'y a rien de mal avec' charAt', ou quels problèmes voulez-vous dire? – Ishtar

+0

@Ishtar: Les problèmes que j'ai sont que les comptes de caractères seront désactivés. Quelque chose comme '" \ uD83D \ uDCA9 \ uD83D \ uDCA9 \ u0000 \ uD83D \ uDCA9 \ uD83D \ uDCA9 "' a seulement 5 points de code dedans, avec le NUL au numéro 3. C'est pourquoi le modèle Java '^ .... $ 'correspond à: parce que la classe Pattern traite toujours en unités logiques, comme il convient. – tchrist