1
votes

Pangram utilisant hashset en java

J'essaie de déterminer si la chaîne est pangram ou non en utilisant set en Java

J'ai essayé le code ci-dessous.Maintenant, la sortie n'est pas un pangram, mais cela devrait être un pangram. Veuillez me dire ce qui ne va pas dans ma solution

    // Java Program to illustrate Pangram 
    import java.util.*;
    public class GFG 
    { 
        public static boolean checkPangram (String str) 
        { 
            int index = 0,count=0; 
            char s[]=str.toCharArray();
            Set<Character> hs= new HashSet<Character>();
            for(index=0;index<str.length();index++)
            {
                hs.add(s[index]); 
            }
            Iterator<Character> i=hs.iterator();
            while(i.hasNext())
            {
              count++;
              i.next();
            }
            if(count==26)
              return true;
            return false;
        } 

        // Driver Code 
        public static void main(String[] args) 
        { 
            String str = "the quick brown fox jumps over the lazy dog"; 

            if (checkPangram(str) == true) 
                System.out.print(str + " is a pangram."); 
            else
                System.out.print(str+ " is not a pangram."); 

        } 
    } 

la sortie doit être vraie ou fausse mais je n'obtiens aucune sortie


2 commentaires

Veuillez ajouter l'erreur que vous obtenez.


Lisezericlippert.com/2014/03/05/how-to-debug-small-programs pourobtenir des conseils sur le débogage de votre code.


5 Réponses :


2
votes

Iterator::hasNext vérifie s'il y a un élément suivant à itérer, mais il ne passe pas à l'élément suivant. Pour déplacer l'itérateur vers l'élément suivant, vous devez utiliser Iterator::next qui renvoie l'élément suivant. Changez votre boucle while en:

public static boolean checkPangram(String str) {
    char[] s = str.replaceAll("\\s+", "")
                .toCharArray();

    Set<Character> hs = new HashSet<Character>();

    for (int index = 0; index < s.length; index++) {
        hs.add(s[index]);
    }

    return hs.size() == 26;
}

Vous devez supprimer les espaces de votre String avant de la convertir en tableau de caractères car les espaces ne doivent pas être pris en compte pour les pangrammes. De plus, lors de la création de votre Set vous devez itérer jusqu'à ce que la longueur de votre tableau de caractères soit atteinte - pas la longueur de la chaîne d'entrée (car nous supprimerons les espaces):

public static boolean checkPangram(String str) {
    int index = 0, count = 0;

    char s[] = str.replaceAll("\\s+","") //remove spaces
            .toCharArray();

    Set<Character> hs = new HashSet<Character>();

    for (index = 0; index < s.length; index++) { //iterate over your charArray
        hs.add(s[index]);
    }

    Iterator<Character> i = hs.iterator();

    while (i.hasNext()) {
        count++;
        i.next();
    }

    return count == 26;  //simplified condition result to be returned

}

Cependant, pour être honnête, vous n'avez pas du tout besoin d'itérateur. Vous pouvez simplement vérifier la taille définie:

while (i.hasNext()) {
    count++;
    i.next();
}


1 commentaires

Notez que replaceAll("\\s+", "") n'élimine que les espaces, mais une phrase contiendra souvent aussi de la ponctuation, par exemple un point de fin, vous pouvez donc utiliser l'une de ces expressions régulières à la place: "[^a-zA-Z]+" (pas de caractère dans la plage AZ) , "\\P{Alpha}+" (pas de" caractère alphabétique POSIX ") ou "\\P{L}+" (pas de catégorie Unicode" Lettre ") . Notez que la variante unicode conservera les lettres accentuées, par exemple ó , et c'est un tout autre ensemble de problèmes pour la vérification des pangrammes.



1
votes

Vous devez apprendre à déboguer votre propre code.
Voir Qu'est-ce qu'un débogueur et comment peut-il m'aider à diagnostiquer les problèmes?

Pourquoi renvoie-t-il faux?
Parce que le count est de 27.

Pourquoi count = 27 ?
Parce que vous comptez aussi les espaces.

Comment résoudre ce problème?
Appelez Character.isLetter(s[index]) pour vérifier avant d'ajouter à hs .
Voir javadoc of Character : https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html

Notez également que vous ne voulez pas compter les lettres majuscules et minuscules comme étant différentes, vous devez donc appeler par exemple toLowercase() , de l'une des deux manières suivantes:

hs.add(Character.toLowercase(s[index]));

ou:

char s[]=str.toLowercase().toCharArray()


1 commentaires

Bon point, j'ai manqué que les caractères majuscules / minuscules doivent être pris en compte. +1



0
votes

Il y a des erreurs dans votre code qui doivent être corrigées.

str.toCharArray () mettra également des espaces blancs dans char s []. Par conséquent, le compte sera de 27, y compris les espaces blancs. Au lieu de cela, vous pouvez vérifier les espaces avant de mettre dans HashSet. Pas besoin non plus d'utiliser la boucle while car nous pouvons directement obtenir la taille du HashSet. Mais dans votre bloc de code, vous utilisez la boucle while avec l'itérateur, donc i.hasNext () sera toujours vrai, donc l'exécution se déroule dans une boucle infinie. Pour éviter cela, vous devez utiliser i.next ().

Jetez un œil au code ci-dessous, vous comprendrez.

Iterator<Character> i = hs.iterator();
        while(i.hasNext()){
        char temp = i.next();
          count++;
        }

L'utilisation de la boucle while avec l'itérateur doit être:

package problems;

import java.util.HashSet;
import java.util.Set;

public class StringCompareTo {

    public static boolean checkPangram(String str) {
        int index = 0;
        char s[] = str.toCharArray();
        Set<Character> hs = new HashSet<Character>();
        for (index = 0; index < str.length(); index++) {
            if(!Character.isWhitespace(s[index]))
            hs.add(s[index]);
        }
        if (hs.size() == 26)
            return true;
        return false;
    }

    // Driver Code
    public static void main(String[] args) {
        String str = "the quick brown fox jumps over the lazy dog";

        if (checkPangram(str) == true)
            System.out.print(str + " is a pangram.");
        else
            System.out.print(str + " is not a pangram.");

    }
}


0 commentaires

0
votes

Je suppose que c'était un exercice, mais votre seule stipulation était de ne pas utiliser de set. Vous pouvez également le faire de cette façon. Streams et les lambdas ne sont pas advanced concepts vraiment advanced concepts mais simplement additional features qui existent depuis Java 8.

       String str = "the quick brown fox jumps over the lazy dog";
       System.out.println("The string is " + (isPangram(str) ? ""
                : "not ") + "a pangram.");
       }
       public static boolean isPangram(String str) {
          return Arrays.stream(str.split("")).filter(
                a -> a.matches("[A-Za-z]")).distinct().count() == 26;

       }

Il élimine tous les caractères sauf les caractères supérieurs et inférieurs, puis les met dans un flux et filtre les doublons. Ensuite, il les compte. Si le compte est égal à 26, c'est un pangramme.


0 commentaires

0
votes
public static void main(String[] args){

String pangramTxt="The quick brown fox jumps over the lazy dog";
checkPangram(pangramTxt);


}

public static void checkPangram(String rawTxt){
    HashSet<Character> set=new HashSet<>();
    //remove nonword characters eg space etc
    
    char[] charArr=rawTxt.replaceAll("\\W+","").toLowerCase().toCharArray();
    
    for(Character val: charArr){
        set.add(val);
    }
    
    //26 ... the alphabet
    if(set.size()==26){
     System.out.println("Text is pangram: ************");
    }

}

1 commentaires

Salut et bienvenue à SO! Veuillez faire le tour . Merci d'avoir répondu, mais pouvez-vous également ajouter une explication sur la façon dont votre code résout le problème?