比较字符和字符串

3
我正在编写一个程序,用于检查给定的句子是否为完全句,但我无法将每个字符与字符串中的字符进行比较。 有谁能建议我一种获取所需输出的方法吗?
    Scanner scan = new Scanner(System.in);
    String panagram = scan.nextLine();
    String word = panagram.toLowerCase();
    System.out.println(word);
    String a[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
            "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w",
            "x", "y", "z" };
    int count = 1;
    System.out.println("a=" + a.length);
    for (int i = 0; i < a.length; i++) {
        for (int j = 0; j < word.length(); j++) {

            if ((a[i]).equals(word.charAt(j)))// problem occurs here  {

                count++;
                break;
            }
        }

    }

    if (count == 26) {
        System.out.println("pangram");
    } else {
        System.out.println("not pangram");
    }

1
使用char[]代替String[] - RealSkeptic
1
你可以采用更好的方法。将句子中的任何字母字符(通常是 O(n),其中 n 为字符数)添加到集合中,然后检查 Set 的大小。请注意,检查是否正在添加的元素是 char 类型的 if 条件语句是 O(1) - TheLostMind
1
附注(与TheLostMind的评论相关):我不确定你的算法是否有效。考虑一个由26个a组成的字符串:在外部循环的第一次迭代中,您得到a [0] =“a”。现在,您循环遍历26个'a'字符的字符串,并在内部循环的每次迭代中调用count ++。最终,count将为26,而您的代码假定这是一个句母句(尽管它不是)。除此之外,它对于长度超过26个字符的字符串也无效。因此,最好使用TheLostMind建议的集合方法。 - Thomas
@vineethPrabhakaran 之所以无法找到相等的原因是String#equals方法将始终返回false,如果obj instanceof String == false,其中 objword.charAt(j)所表示的一个字符。由于obj是一个Char,您永远无法将一个String与另一个不表示StringObject进行比较。 - SomeJavaGuy
将代码中的 if ((a[i]).equals(word.charAt(j)) 稍作修改为 if ((a[i]).equals("" + word.charAt(j)),即可实现字符串之间的相等性检查。 - Developer Marius Žilėnas
显示剩余2条评论
6个回答

4
你可以将其转换为字符串然后进行比较。
String s = Character.toString('c');
if(s.equals(s2)){..}

或者您可以通过将其添加到空字符串中将其变成字符串。

String s = 'c' + "";
if(s.equals(s2)){..}

或者您可以比较它的ASCII值。

由于只有单个字符,为什么不使用字符数组。

char []a = {'a', 'b', 'c'....};
if(a[i] == 'a')//you could use == in this case.
{..}

此外,你不需要以那种方式进行检查。

你可以创建一个26大小的布尔数组,因为只有26个字符,然后检查每个字符是否至少出现一次。

boolean []arr = new boolean[26];
for(int i = 0; i < word.length(); ++i)
{
  arr[word.charAt(i) - 'a'] = true;
}
isPan(arr);
public boolean isPan(boolean[] arr)
{
for(int i = 0; i < arr.length; ++i)
 if(!arr[i])
   return false;
return true;
}

一个简单的O(n)解决方案。

或者你可以使用Set并检查它的大小。

HashSet<Character> set = new HashSet();
for(int i = 0; i < word.length(); ++i)
  set.add(word.charAt(i));
System.out.println(set.size() == 26 ? "Pangram" : "Not Pangram");

//A 2 liner would be
HashSet<Character> set = new HashSet<Character>(Arrays.asList(word.toCharArray()));
System.out.println(set.size() == 26 ? "Pangram" : "Not Pangram");

这是spookieCookie添加的一点。这些方法仅适用于字符串只有小写字母的情况。

String s = "sdgosdgoih3208ABDDu23pouqwpofjew@#$%^&".repalceAll("[^A-Za-z]+", "");
String s = s.toLowerCase();
//do the computation then

3
“Set” 的概念非常简洁。 - McNultyyy
那么,如何创建一个包含不仅是字母表中的字符的全字母句呢?可以添加yourstring.replaceAll("[^A-Za-z]+", "")来从字符串中删除除了字符以外的所有内容。在对其进行字符集设置之前,还应该执行yourstring.toLowerCase()。 - Developer Marius Žilėnas
@Spookiecookie 是的,使用集合方法在这种情况下会失败。但通常只对小写拉丁字母进行全字母句检查。 - Uma Kanth

4

您可以使用:

(a[i]).equals(String.valueOf(word.charAt(j)))

或者将您的a数组从String[]更改为char[],并使用==运算符比较字符。


3

将数组转换为ArrayList

List<Character> alphabet = Arrays.asList(a);

创建一个列表来存储读取的字符:
Set<Character> chars = new HashSet<>();

然后检查句子中的每个字符是否是字母表中的一部分。由于 Set 的特性,重复字符不会被添加。

for (Character c : word.toCharArray()) {
    chars.add(c);
}

然后检查 Set 的大小是否等于给定的字母表大小:

return (chars.size() == alphabet.size());

2
遍历列表多次可能会很慢(尽管在最坏情况下只有26个元素,但仍然会累积),因此最好使用集合。然后您甚至不需要检查chars.contains(c),只需添加它即可。您也可以跳过alphabet.contains(c),并在结尾处仅检查chars.size() == alphabet.size()以允许灵活的字母表。 - Thomas
非常正确!我会对我的答案进行相关修改。 - McNultyyy

2
尝试使用以下方法:
public void checkPanagram() {    
    boolean isPanagram = false;
    String word = "The quick brown fox jumps over the lazy dog";
    String a[] = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k",
        "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w",
        "x", "y", "z" };        
    for (int i = 0; i < a.length; i++) {
        if (word.toLowerCase().contains(a[i])) {
            isPanagram = true;
        } else {
            isPanagram = false;
            break;
        }
    }        
    if (isPanagram) System.out.println("Yes, panagram");
    else System.out.println("No, not panagram");
}

只是一些小建议:如果您将代码作为答案发布,同时附上更改的解释和原因会更好。这样做可以让其他人更容易地理解您的答案,而且在编写过程中,您也可以反思并发现可能存在的缺陷。 - Thomas
1
好的...我会记住的,下次会这样做 :-) - Kashyap Kansara

1
你可以使用String.contains(String)方法,因为a中的每个字母都已经是一个字符串。
    for (int i = 0; i < a.length; i++) {
        if (word.contains(a[i])) {
            count++;
            // } else { break;
        }
    }

一条提示:最好使用更规范的语法 String[] a,而不是为了兼容C/C++添加的语法 String a[]

0

要检查字符串与字符的相等性,您可以将代码进行最小化

if ((a[i]).equals(word.charAt(j)) 更改为 if ((a[i]).equals("" + word.charAt(j))

这样就可以在两个字符串之间进行相等性检查。

或者您可以将行 if ((a[i]).equals(word.charAt(j)) 更改为 if ((a[i]).equals(word.substring(j,j+1))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接