J'essaie de créer un programme simple qui compte les caractères majuscules dans une String
en boucle sur chaque caractère et en incrémentant une variable d'accumulation si le caractère est en majuscule. Voici mon code:
J S i Uppercase characters: 2
Lorsqu'il est exécuté, ce code génère:
String str = "JuSTin"; //3 uppercase characters int upperCaseCount = 0; //increment each time an uppercase character is encountered char character; //the current character for(int i = 0; i < str.length(); i++) { character = str.charAt(i); System.out.println(character); //Log all characters to console just to see what is going on if(Character.isUpperCase(character)) upperCaseCount++; i++; } System.out.println("Uppercase characters: " + upperCaseCount);
Quelle est la cause de cette sortie? Où sont les 'u' 'T' et 'n' dans "JuSTin"? Pourquoi upperCaseCount
est-il égal à 2 et non à 3?
4 Réponses :
Pourquoi incrémentez-vous i ++ dans la condition if. La valeur de i sera automatiquement incrémentée en utilisant la boucle for.
Supprimez le deuxième i ++
. Cela devrait fonctionner.
Dans for
boucle for (int i = 0; i
i code> en utilisant
i ++
mais vous avez à nouveau mis i ++
dans la boucle for
. La valeur de i
sera donc incrémenté deux fois. C'est pourquoi vous obtenez une mauvaise sortie. Supprimez simplement l'instruction i ++
après l'instruction if
.
Tout comme une information complémentaire (pour votre apprentissage), vous pouvez le résoudre de différentes manières en utilisant:
Chacune de ces méthodes a ses propres avantages ou inconvénients.
Avec un lambda
public static long countUpperCase(final String str) { // the 'var' keyword can be used with Java 10 or higher final var counter = new AtomicInteger(0); // convert a string into a List<Character> // Note that this is only applicable since Java 8 or higher var chars = str .chars() .mapToObj(c -> (char) c) .collect(Collectors.toList()); // count the number of uppercase letters chars.forEach(c -> { if(Character.isUpperCase(c)) { counter.incrementAndGet(); } }); return counter.get(); }
Avec une boucle for classique
public static long countUpperCase(final String str) { // \p{L} matches a single code point in the category "letter" // \p{L} matches all letters that are uppercase return str.split("(?=\\p{Lu})").length; }
Avec une nouvelle construction de boucle (Java 7 ou supérieur)
public static long countUpperCase(final String str) { long counter = 0; for(final char c: str.toCharArray()) { if(Character.isUpperCase(c)) { counter++; } } return counter; }
Il y a déjà des explications dans d'autres articles, par exemple Message SO en majuscules
Avec une expression régulière
public static long countUpperCase(final String str) { long counter = 0; for(int i=0; i<str.length(); i++) { if(Character.isUpperCase(str.charAt(i))) { counter++; } } return counter; }
Si vous souhaitez approfondir un peu plus, jetez un œil à ce PDF intéressant: Guide de Regexp
Avec une boucle forEach
XXX
Au-dessus et au-delà et très perspicace! Merci.
Vous faites
i ++
deux fois. Cela fait sauter des lettres. Cela semble être une faute de frappe.C'est la plus stupide que j'ai ressentie sur ce site ... merci. Dois-je fermer la question?
J'ai voté pour le fermer comme une faute de frappe, mais maintenant qu'il y a des réponses, vous ne pourrez pas le supprimer.