1
votes

Comment trouver le nombre de doubles lettres consécutives (majuscules) dans une chaîne?

Je dois trouver le nombre de lettres majuscules consécutives dans une chaîne. Par exemple, "LITTLE RABBIT" Nombre de lettres majuscules consécutives = 2 (la première est TT et la seconde est BB) Le programme ne fonctionne pas.

Le programme envoie un message d'erreur comme suit

java.lang.StringIndexOutOfBoundsException: Index de chaîne hors limites: 14

try {
    String s = " LITTLE RABBIT";
    s.toUpperCase();
    int l = s.length();
    int a = 0;
    char ch1, ch2;
    for (int i = 0; i < l; i++) {
        ch1 = s.charAt(i);
        ch2 = s.charAt(i + 1);
        if (ch1 == ch2) {
            a++;
        }
    }
    System.out.println(a);
} catch (StringIndexOutOfBoundsException e) {
    System.out.println(e);
}


6 commentaires

Premièrement, vous n'êtes pas censé attraper StringIndexoutOfBoundsException sauf si vous ne faites que déboguer (et même alors ...). Deuxièmement, la cause première est que votre variable de rupture de boucle est correctement définie, mais vous la souillez en l'incrémentant arbitrairement de 1 dans l'instruction: s.charAt (i + 1);


utiliser i


Au fait, s.toUpperCase (); ne fait rien d'utile.


vous pouvez également couper la chaîne pour supprimer les espaces blancs supplémentaires.


Je connais s.toUpperCase (); ne fait rien d'utile. Ceci est un programme de test, je dois encore le modifier.


Il semble que la question était plus de trouver le nombre de lettres consécutives dans une chaîne que la cause de l'exception. Il convient de noter que le problème d'origine peut être résolu beaucoup plus simplement avec l'expression régulière: ([A-Z]) \ 1+ . Ensuite, il suffit de compter le nombre de correspondances stackoverflow.com/questions / 7378451 / java-regex-match-count


4 Réponses :


0
votes

La raison pour laquelle vous obtenez une exception est assez simple. Dans la dernière exécution de votre boucle, vous vérifiez si le dernier caractère de la chaîne est égal au caractère suivant. Votre chaîne ne contient plus de caractères, vous obtenez donc une exception. Pour éviter ce problème, vous devez couper votre boucle et utiliser for (int i = 0; i . Rappelez-vous: le premier caractère d'une chaîne a l'index 0 et le dernier caractère a l'index l-1. Dans cette configuration, vous n'avez pas besoin d'exécuter la boucle avec le dernier caractère pour pouvoir vous arrêter avant l-1


0 commentaires

0
votes

essayez d'utiliser le code ci-dessous. vous devez passer de 0 à String Size - 1. Mais vous traversez à la dernière position où aucun élément n'est présent. c'est pourquoi vous obtenez cette exception StringIndexOutOfBounds.

public static void main(String[] args) {
        try {
            String s = " LITTLE RABBIT";
            s.trim().toUpperCase();
            int l = (s.length() - 1);
            int a = 0;
            char ch1, ch2;
            for (int i = 0; i < l; i++) {
                ch1 = s.charAt(i);
                ch2 = s.charAt(i + 1);
                if (ch1 == ch2) {
                    a++;
                }
            }
            System.out.println(a);
        } catch (StringIndexOutOfBoundsException e) {
            e.printStackTrace();
        }

    }


0 commentaires

0
votes

Premièrement, vous n'êtes pas censé attraper StringIndexoutOfBoundsException à moins que vous ne fassiez que déboguer (et même alors ...).

Deuxièmement, la cause première est que votre variable de rupture de boucle est définie correctement, mais vous la souillez en l'incrémentant arbitrairement de 1 dans l'instruction: s.charAt (i + 1);

Troisièmement, voici une solution un peu plus simple utilisant regex.

| sets group 1 for back reference (group 0 is always the whole match if any)
| | posix script for uppercase letters
| |         | back-reference to group 1
| |         |  1 + repetition of back-reference
| |         |  |
(\\p{Upper})\\1+

Given...

2 (because LITTLE and RABBIT have both 2)
0 (no repeated capitalized letters)
3 (RABBBIT has 3 here, HELL only 2 so it returns the biggest)

Vous obtiendrez:

String[] test = {"LITTLE RABBIT", "BIG RAbbIT", "DEMON RABBBIT FROM HELL"};
Arrays.stream(test).forEach(
    (s) -> System.out.println(findMaxConsecutiveCapitalizedLetters(s))
);


0 commentaires

0
votes

Votre problème est que vous parcourez toute la chaîne tout en appelant également le caractère suivant. Par conséquent, lorsque vous atteignez le dernier caractère, vous rencontrez cette exception car vous appelez le personnage après le dernier. Puisque vous cherchez une solution simple, voici le code corrigé.

try
{
    String s = " LITTLE RABBIT";
    s.toUpperCase();
    int l = s.length();
    int a =0;
    char ch1, ch2;
    //Remove one so you no longer call it. It fixes it since the last one can't be a pair.
    for( int i =0; i < l-1; i++)
    {
        ch1 = s.charAt(i);
        ch2 = s.charAt(i+1);
        if( ch1 == ch2)
        {
            a++;
        }
    }
    System.out.println(a);
}
catch(StringIndexOutOfBoundsException e)
{
    System.out.println(e);
}


0 commentaires