2
votes

Compter les lettres majuscules dans une chaîne

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?


3 commentaires

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.


4 Réponses :


1
votes

Pourquoi incrémentez-vous i ++ dans la condition if. La valeur de i sera automatiquement incrémentée en utilisant la boucle for.


0 commentaires

2
votes

Supprimez le deuxième i ++ . Cela devrait fonctionner.


0 commentaires

0
votes

Dans for boucle for (int i = 0; i vous incrémentez déjà la valeur de i 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 .


0 commentaires

4
votes

Tout comme une information complémentaire (pour votre apprentissage), vous pouvez le résoudre de différentes manières en utilisant:

  • lambda,
  • boucle for "classique",
  • construction de boucle introduite dans Java 7,
  • expression régulière,
  • ou boucle forEach

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


1 commentaires

Au-dessus et au-delà et très perspicace! Merci.