首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在java中使用hashset的Pangram

在java中使用hashset的Pangram
EN

Stack Overflow用户
提问于 2019-07-20 16:21:38
回答 4查看 582关注 0票数 1

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

我已经尝试了下面的code.Now,输出显示为不是pangram,但应该是pangram。请告诉我我的解决方案有什么问题

代码语言:javascript
运行
复制
    // 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."); 

        } 
    } 

输出应该是真或假,但我没有得到输出。

EN

回答 4

Stack Overflow用户

发布于 2019-07-20 17:01:07

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

请参阅What is a debugger and how can it help me diagnose problems?

它为什么还假的?

因为count是27岁。

为什么count = 27__?

因为你也算上了空格。

我该怎么解决这个问题?

在添加到Character.isLetter(s[index])之前,请调用hs检查。

参见Characterhttps://docs.oracle.com/javase/8/docs/api/java/lang/Character.html的javadoc

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

代码语言:javascript
运行
复制
char s[]=str.toLowercase().toCharArray()

或者:

代码语言:javascript
运行
复制
hs.add(Character.toLowercase(s[index]));
票数 2
EN

Stack Overflow用户

发布于 2019-07-20 17:19:11

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

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

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

代码语言:javascript
运行
复制
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循环应该是:

代码语言:javascript
运行
复制
Iterator<Character> i = hs.iterator();
        while(i.hasNext()){
        char temp = i.next();
          count++;
        }
票数 0
EN

Stack Overflow用户

发布于 2019-07-20 18:42:32

我认为这是一项练习,但你唯一的规定是不使用set。你也可以这样做。Streamslambdas并不是真正的advanced concepts,而只是从Java8开始出现的additional features

代码语言:javascript
运行
复制
       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;

       }

它将除上、下字符外的所有字符进行裁剪,然后将它们放入流中并过滤掉重复的字符。那它就算了。如果计数等于26,则为pangram。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57126533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档