我试图通过使用Java中的set来确定字符串是否是pangram
我已经尝试了下面的code.Now,输出显示为不是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.");
}
}
输出应该是真或假,但我没有得到输出。
发布于 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
检查。
参见Character
:https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html的javadoc
还请注意,您不希望将大写字母与小写字母计算为不同的字母,因此您应该以两种方式之一调用例如toLowercase()
:
char s[]=str.toLowercase().toCharArray()
或者:
hs.add(Character.toLowercase(s[index]));
发布于 2019-07-20 17:19:11
您的代码中有一些需要纠正的错误。
str.toCharArray()还将在char s[]中放置空格。因此,计数将是27,包括空白。相反,您可以在放入HashSet之前检查空格。此外,也不需要使用we循环,因为我们可以直接获得HashSet大小。但是在您的代码块中,您使用的是带迭代器的while循环,因此i.hasNext()将始终为真,因此执行将进入无限循环。为了避免这种情况,您需要使用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++;
}
发布于 2019-07-20 18:42:32
我认为这是一项练习,但你唯一的规定是不使用set。你也可以这样做。Streams
和lambdas
并不是真正的advanced concepts
,而只是从Java8开始出现的additional features
。
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。
https://stackoverflow.com/questions/57126533
复制相似问题