在java中使用hashset的Pangram

在java中使用hashset的Pangram,java,string,set,hashset,pangram,Java,String,Set,Hashset,Pangram,我试图通过在Java中使用set来确定字符串是否为pangram 我已经尝试了下面的代码。现在输出显示为非pangram,但应该是pangram。请告诉我我的解决方案出了什么问题 // Java Program to illustrate Pangram import java.util.*; public class GFG { public static boolean checkPangram (String str)

我试图通过在Java中使用set来确定字符串是否为pangram

我已经尝试了下面的代码。现在输出显示为非pangram,但应该是pangram。请告诉我我的解决方案出了什么问题

    // 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."); 

        } 
    } 
输出应该为true或false,但我没有得到任何输出

迭代器::hasNext检查是否有下一个要迭代的元素,但它没有移动到下一个元素。要将迭代器移动到下一个元素,必须使用迭代器::next,它返回下一个元素。将while循环更改为:

while (i.hasNext()) {
    count++;
    i.next();
}
在将字符串转换为char数组之前,必须删除字符串中的空格,因为pangram不应考虑空格。此外,在创建集合时,您应该迭代直到达到字符数组的长度,而不是输入字符串的长度,因为我们将删除空格:

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

}
然而,老实说,您根本不需要迭代器。您只需检查集合大小:

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;
}
迭代器::hasNext检查是否有下一个元素要迭代,但它不会移动到下一个元素。要将迭代器移动到下一个元素,必须使用迭代器::next,它返回下一个元素。将while循环更改为:

while (i.hasNext()) {
    count++;
    i.next();
}
在将字符串转换为char数组之前,必须删除字符串中的空格,因为pangram不应考虑空格。此外,在创建集合时,您应该迭代直到达到字符数组的长度,而不是输入字符串的长度,因为我们将删除空格:

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

}
然而,老实说,您根本不需要迭代器。您只需检查集合大小:

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;
}
您需要学习如何调试自己的代码。 看

为什么返回错误? 因为计数是27

为什么计数=27? 因为你也算空间

我该如何解决这个问题? 在添加到hs之前,调用Character.isleters[index]进行检查。 请参见字符的javadoc:

还请注意,您不希望将大写字母与小写字母计算为不同的字母,因此您应该使用以下两种方式之一调用例如toLowercase:

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

您需要学习如何调试自己的代码。 看

为什么返回错误? 因为计数是27

为什么计数=27? 因为你也算空间

我该如何解决这个问题? 在添加到hs之前,调用Character.isleters[index]进行检查。 请参见字符的javadoc:

还请注意,您不希望将大写字母与小写字母计算为不同的字母,因此您应该使用以下两种方式之一调用例如toLowercase:

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


您的代码中有一些错误需要更正

str.toCharArray还将在char s[]中放置空格。因此,计数将为27,包括空格。相反,您可以在放入哈希集之前检查空格。也不需要使用while循环,因为我们可以直接获得HashSet大小。 但在您的代码块中,您使用的是带迭代器的while循环,因此i.hasNext将始终为true,因此执行将进入无限循环。为了避免这种情况,您需要使用i.next

看看下面的代码,你就会明白

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.");

    }
}
使用带迭代器的while循环应:

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

您的代码中有一些错误需要更正

str.toCharArray还将在char s[]中放置空格。因此,计数将为27,包括空格。相反,您可以在放入哈希集之前检查空格。也不需要使用while循环,因为我们可以直接获得HashSet大小。 但在您的代码块中,您使用的是带迭代器的while循环,因此i.hasNext将始终为true,因此执行将进入无限循环。为了避免这种情况,您需要使用i.next

看看下面的代码,你就会明白

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.");

    }
}
使用带迭代器的while循环应:

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

我想这是一个练习,但你唯一的规定是不要使用set。你也可以这样做。Streams和Lambda并不是真正的高级概念,只是自Java8以来出现的附加功能

String str=敏捷的棕色狐狸跳过懒狗; System.out.println字符串是否为+isPangramstr? :不是一个庞格拉姆。; } 公共静态布尔值isPangramString str{ 返回Arrays.streamstr.split.filter a->a.matches[a-Za-z].distinct.count==26; }
它将删除除上下字符以外的所有字符,然后将它们放入流中并过滤掉重复的字符。然后计算它们。如果计数等于26,这是一个pangram。

我想这是一个练习,但你唯一的规定是不要使用set。你也可以这样做。Streams和Lambda并不是真正的高级概念,只是自Java8以来出现的附加功能

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: ************");
    }

}
String str=敏捷的棕色狐狸跳过懒狗; System.out.println字符串是否为+isPangramstr? :不是一个庞格拉姆。; } 公共静态布尔值isPangramString str{ 返回Arrays.streamstr.split.filter a->a.匹配[a-Za-z]。不同 .count==26; }
它将删除除上下字符以外的所有字符,然后将它们放入流中并过滤掉重复的字符。然后计算它们。如果计数等于26,则为pangram。

请添加您得到的错误。阅读了解调试代码的提示。请添加您得到的错误。阅读了解调试代码的提示。很好,我忽略了应该考虑的大小写字符+1很好的一点,我没有考虑到大写/小写字符+1请注意,replaceAll\\s+仅消除空格,但句子通常也会包含标点符号,例如终止句点,因此您可能希望使用以下正则表达式之一:[^a-zA-Z]+非a-Z范围内的字符、\\P{Alpha}+非POSIX字母字符或\\P{L}+非unicode类别字母。请注意,unicode变体将保留重音字母,例如o,这对于pangram检查来说是一组完全不同的问题。请注意,replaceAll\\s+只会消除空格,但一个句子通常也会包含标点符号,例如终止句点,因此您可能希望使用这些正则表达式中的一个:[^a-zA-Z]+非A-Z范围内的字符、\\P{Alpha}+非POSIX字母字符或\\P{L}+非unicode类别字母。请注意,unicode变体将保留重音字母,例如ó,这是pangram检查的一组完全不同的问题。您好,欢迎使用SO!请坐飞机。感谢您提供了答案,但是您是否也可以添加关于代码如何解决问题的解释?您好,欢迎使用SO!请坐飞机。感谢您提供了一个答案,但是您是否也可以添加一个关于代码如何解决问题的解释?
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: ************");
    }

}