Java 为什么赢了';t本报税表“;是”;对于两个字谜?

Java 为什么赢了';t本报税表“;是”;对于两个字谜?,java,Java,编辑:我现在看到计数不起作用了。我更新了代码,所以现在如果count大于或等于任意一个单词,它将返回“yes”。我想这是我唯一需要做的修复,谢谢 当提供两个输入短语时,它应该检查一个单词的字母是否都在另一个单词中,而不考虑大小写。例如,cat和cat可以工作,cat和catt、dogged和do等也可以工作。我的代码对一些输入有效,而对其他输入无效,我不知道为什么。我尝试了输入“cat”和“cat”,但“moo”和“moo”不起作用。我还假设使用count可能是问题的一部分。我也尝试过使用数组,

编辑:我现在看到计数不起作用了。我更新了代码,所以现在如果count大于或等于任意一个单词,它将返回“yes”。我想这是我唯一需要做的修复,谢谢

当提供两个输入短语时,它应该检查一个单词的字母是否都在另一个单词中,而不考虑大小写。例如,cat和cat可以工作,cat和catt、dogged和do等也可以工作。我的代码对一些输入有效,而对其他输入无效,我不知道为什么。我尝试了输入“cat”和“cat”,但“moo”和“moo”不起作用。我还假设使用
count
可能是问题的一部分。我也尝试过使用数组,但我认为这可能更简单。我不是在寻找答案,只是解释为什么我的代码没有打印出应该打印的内容

以下是我的两门课:

    import java.util.*;
    public class SuperAnTester{
    public static void main(String[] args){
        System.out.println("Enter two words: ");
        Scanner scan = new Scanner(System.in);
        String phraseone = scan.nextLine();
        String phrasetwo = scan.nextLine();
        SuperAnagram x = new SuperAnagram(phraseone, phrasetwo);
        x.superAn();
    }}

    public class SuperAnagram{
    private String firstWord;
    private String secondWord;

    public SuperAnagram(String first, String second){
        firstWord = first;
        secondWord = second;
    }

    public void superAn(){
        int count = 0;
        firstWord.toLowerCase();
        secondWord.toLowerCase();

        for (int n = 0; n < firstWord.length(); n++){
            for (int x = 0; x < secondWord.length(); x++){
                if (firstWord.charAt(n) == secondWord.charAt(x)){
                    count++;
                }}}

        if (count >= firstWord.length() || count >= secondWord.length()){
            System.out.println("Yes");
        } else{
            System.out.println("No");
        }}}
import java.util.*;
公共级超级智能{
公共静态void main(字符串[]args){
System.out.println(“输入两个单词:”);
扫描仪扫描=新扫描仪(System.in);
String phraseone=scan.nextLine();
String phrasetwo=scan.nextLine();
SuperNagram x=新的SuperNagram(第一句,第二句);
x、 superAn();
}}
公共类超磁盘{
私有字符串首字;
私有字符串第二个字;
公共SuperNagram(第一个字符串,第二个字符串){
第一个字=第一个;
第二个字=第二个;
}
公共空间超级计算机(){
整数计数=0;
firstWord.toLowerCase();
第二个单词。toLowerCase();
for(int n=0;n=firstWord.length()|计数>=secondWord.length()){
System.out.println(“是”);
}否则{
系统输出打印项次(“否”);
}}}

问题可能在这里

    firstWord.toLowerCase();
    secondWord.toLowerCase();
换成

    firstWord=firstWord.toLowerCase();
    secondWord=secondWord.toLowerCase();

String
是不可变的类。您必须将其分配回字符串以反映更改。

这非常简单

例如,字母“d”的“do”和“doott”计数将增加一次(以doott的第一个d为单位),字母“o”的计数将增加两次(以doott的第一个和第二个o为单位)

所以count等于3,do和doott长度都不等于3


您可以使用
StringUtils.countMatches(yourString,yourchar);
检查两个字符串的数字是否小于或等于第二个字符串。

此代码将不起作用,因为如果您有
cat
caate

c == c OK count = 1
...
a == a OK count = 2
...
a == a OK count = 3
...
t == t OK count = 4
因此,在结束时,计数=4

计数!=到3(cat)和计数!=5(caate)

因此,您必须考虑冗余字符


另一个错误是,您将字符串改为小写,但没有保存它。因此,只需将firstWord.toLowerCase()指定给firstWord,将secondWord.toLowerCase()指定给secondWord即可

firstWord = firstWord.toLowerCase();
secondWord = secondWord.toLowerCase();

你的例子让我有点困惑。我不认为dog和dogg通常被认为是字谜?我认为字谜的一个先决条件是,两个词应该有相同的字符数。 请查找一个示例(假设您只有ascii字符):

私有静态布尔isAnagram(字符串a、字符串b){
如果(a==null | | b==null | | a.length()!=b.length())返回false;
byte charCount[]=新字节[256];
a=a.toLowerCase();
b=b.toLowerCase();
对于(int i=0;i
基于维基百科:

字谜是一种文字游戏,是重新排列单词的结果 一个单词或短语的字母产生一个新词或短语,使用 原始字母仅一次;例如,可以是 重新排列成马车


此解决方案是正确的,
firstWord.toLowerCase()
对对象
firstWord
没有副作用(对于
secondWord
,同样如此).是的,我知道。我也读过其他帖子。我想现在OP已经找到了答案。哦,那么计数只是多次计算两个字母?是的,就是这样。所以你必须检查“是”字谜对该用户尝试测试的内容来说不是一个好词。我可以使用firstword.contains(secondWord)吗或者类似的?你不应该删除你的问题…对不起,我认为这是阻止回复的最简单的方法,因为我知道我错在哪里。别忘了验证帮助你下一个用户的答案。这是本网站的目的。你应该将其中一个答案标记为“已接受”“在这里,每个人都可以从任何人的问题中学习。如果有人遇到同样的问题并搜索它呢。他不应该为同一个问题发布新问题,他应该从中学习。
private static boolean isAnagram(String a, String b) {
    if (a == null || b == null || a.length() != b.length()) return false;

    byte charCount[] = new byte[256];

    a = a.toLowerCase();
    b = b.toLowerCase();

    for (int i = 0 ; i < a.length() ; ++i) {
        charCount[a.charAt(i)]++;
    }

    for (int i = 0; i < b.length() ; ++i) {
        int current = --charCount[b.charAt(i)];
        if (current < 0) return false;
    }

    return true;
}