在 java 中使用哈希集的 Pangram
Pangram using hashset in java
我正在尝试使用 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.");
}
}
输出应该是 true 或 false 但我没有得到输出
Iterator::hasNext
检查是否有下一个元素要迭代,但它并没有移动到下一个元素。要将迭代器移动到下一个元素,您必须使用 Iterator::next
which returns 下一个元素。将您的 while 循环更改为 :
while (i.hasNext()) {
count++;
i.next();
}
在将其转换为 char 数组之前,您必须从 String
中删除空格,因为 pangram 不应考虑空格。此外,在创建 Set
时,您应该迭代直到达到 char 数组的长度 - 而不是输入字符串的长度(因为我们将删除空格):
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;
}
您需要学习如何调试您自己的代码。
参见 What is a debugger and how can it help me diagnose problems?
为什么返回 false?
因为 count
是 27.
为什么是count = 27
?
因为你也数空格了。
我该如何解决?
在添加到 hs
.
之前调用 Character.isLetter(s[index])
检查
请参阅 Character
的 javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html
另请注意,您不想将大写字母与小写字母视为不同,因此您应该调用例如toLowercase()
,采用以下两种方式之一:
char s[]=str.toLowercase().toCharArray()
或:
hs.add(Character.toLowercase(s[index]));
您的代码中存在一些错误,需要更正。
str.toCharArray() 也会将白色的 spaces 放入 char s[]。因此计数将为 27,包括白色 space。相反,您可以在放入 HashSet 之前检查 whitespace。也不需要使用 while 循环,因为我们可以直接获取 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++;
}
我认为这是一个练习,但你唯一的规定是不使用集合。你也可以这样做。 Streams
和 lambdas
并不是真正的 advanced concepts
,而只是自 Java 8.
以来就存在的 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。
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: ************");
}
}
我正在尝试使用 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.");
}
}
输出应该是 true 或 false 但我没有得到输出
Iterator::hasNext
检查是否有下一个元素要迭代,但它并没有移动到下一个元素。要将迭代器移动到下一个元素,您必须使用 Iterator::next
which returns 下一个元素。将您的 while 循环更改为 :
while (i.hasNext()) {
count++;
i.next();
}
在将其转换为 char 数组之前,您必须从 String
中删除空格,因为 pangram 不应考虑空格。此外,在创建 Set
时,您应该迭代直到达到 char 数组的长度 - 而不是输入字符串的长度(因为我们将删除空格):
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;
}
您需要学习如何调试您自己的代码。
参见 What is a debugger and how can it help me diagnose problems?
为什么返回 false?
因为 count
是 27.
为什么是count = 27
?
因为你也数空格了。
我该如何解决?
在添加到 hs
.
之前调用 Character.isLetter(s[index])
检查
请参阅 Character
的 javadoc:https://docs.oracle.com/javase/8/docs/api/java/lang/Character.html
另请注意,您不想将大写字母与小写字母视为不同,因此您应该调用例如toLowercase()
,采用以下两种方式之一:
char s[]=str.toLowercase().toCharArray()
或:
hs.add(Character.toLowercase(s[index]));
您的代码中存在一些错误,需要更正。
str.toCharArray() 也会将白色的 spaces 放入 char s[]。因此计数将为 27,包括白色 space。相反,您可以在放入 HashSet 之前检查 whitespace。也不需要使用 while 循环,因为我们可以直接获取 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++;
}
我认为这是一个练习,但你唯一的规定是不使用集合。你也可以这样做。 Streams
和 lambdas
并不是真正的 advanced concepts
,而只是自 Java 8.
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。
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: ************");
}
}