Java 回文识别器

Java 回文识别器,java,char,palindrome,Java,Char,Palindrome,我在学Java。我正在构建这个回文识别器,并使用两个带字符的数组,我认为我已经找到了一个很好的实现方法,但我很想弄明白为什么到目前为止它没有按预期工作。正在发生的事情: 美国宇航局的圣诞老人,回文,检查为回文。 我不知道,任何东西,不是回文,检查为不是回文。 非回文,非回文,检查为回文。 我基本上需要一些帮助来理解我的代码到底哪里出错了。谢谢 /* "A Santa at Nasa" is an example of palindrome. */ import java.util.Sc

我在学Java。我正在构建这个回文识别器,并使用两个带字符的数组,我认为我已经找到了一个很好的实现方法,但我很想弄明白为什么到目前为止它没有按预期工作。正在发生的事情:

美国宇航局的圣诞老人,回文,检查为回文。 我不知道,任何东西,不是回文,检查为不是回文。 非回文,非回文,检查为回文。 我基本上需要一些帮助来理解我的代码到底哪里出错了。谢谢

/*
    "A Santa at Nasa" is an example of palindrome.
*/

import java.util.Scanner;

public class Palindrome
{
    public static void main (String[] args)
    {
        boolean isPalindrome = false;
        Scanner kb = new Scanner(System.in);
        System.out.println("Enter a string:");
        String userInput = kb.nextLine();
        userInput = userInput.trim().replaceAll(" ", "").toLowerCase();
        char[] array = new char[userInput.length()];
        char[] reverseArray = new char[userInput.length()];
        int i = 0;
        int j = userInput.length();

        do {
            i++;
            j--;

            array[i] = userInput.charAt(i);
            reverseArray[j] = userInput.charAt(j);

            if (array[i] != reverseArray[j])
            {
                isPalindrome = false;
            }
            else
            {
                isPalindrome = true;
            }

        } while (j > i);

        if(isPalindrome)
        {
            System.out.println("It's a palindrome.");
        }
        else
        {
            System.out.println("Not a palindrome.");
        }
    }
}

一旦确定输入不是回文,就应该结束测试

现在你的算法可以改变主意了


你还过早地增加了i

问题是,您必须在输入数组的第一个元素之前开始,因为您在循环的开头执行i++操作:

int i = -1;
此外,可以改善循环的退出条件,使其提前退出:

while (j > i && !isPalindrome);

问题是,每次检查两个字母时,都会设置isAlindrome。所以,当最后两个字母CHECK T相同时,它会说这是一个回文。相反,请尝试以下方法:

import java.util.Scanner;

public class Main
{
    public static void main (String[] args)
    {
        boolean isPalindrome = true;
        Scanner kb = new Scanner(System.in);
        System.out.println("Enter a string:");
        String userInput = kb.nextLine();
        userInput = userInput.trim().replaceAll(" ", "").toLowerCase();
        char[] array = new char[userInput.length()];
        char[] reverseArray = new char[userInput.length()];
        int i = 0;
        int j = userInput.length() - 1;

        while(i < j && isPalindrome) {

            array[i] = userInput.charAt(i);
            reverseArray[j] = userInput.charAt(j);

            if (array[i] != reverseArray[j])
                isPalindrome = false;

            i++;
            j--;

        }

        if(isPalindrome)
            System.out.println("It's a palindrome.");
        else
            System.out.println("Not a palindrome.");
    }
}
现在,isAlindrome布尔值在开始时设置为true,当我们发现与这两个字符不相同的内容相矛盾时,它会将isAlindrome设置为false

我还没有测试这段代码,所以可能还有其他错误。但这是我第一眼看到的

编辑:我不是从字符串的开头开始的。最好使用while而不是do-while,因为字符串可能是空的。

是否允许使用StringBuilder?如果是这样,您可以执行String reverseText=new StringBuilderuserInput.reverse.toString

如果不是,为什么不尝试遍历数组一次,然后在最后进行比较呢?保持数组和reverseArray初始值设定项不变,然后执行for或while循环,然后忠实地将userInput变量复制到两个数组中的正确位置

然后,您可以在最后使用一个比较来决定打印什么。

一些事情

您应该在循环结束时更改索引,以修复从1开始的较低索引。 在前面的更改中,您应该从userInput.length-1开始上一个索引,因为这将是您检查的第一个索引。 当您发现一个不匹配时,您应该停止,否则对于奇数长度的字符串,您的结果将始终是中间字符对其自身的检查,否则您的结果将最终是偶数字符串的两个中间字符对彼此的检查。
如果您想要完整的重新工作的解决方案,我可以发布它,但您可能可以从这里自己修复它

这听起来是一个熟悉调试器使用的好机会。在调试过程中,当您逐行查看代码并观察其行为和值时,逻辑在什么程度上偏离了预期?我认为错误来自I++in do循环。你在得到字符值之前先增加。我认为@Bathsheba是主要问题,但你也可能想在循环结束时增加你的计数器-你没有检查第一个字符,但你会在循环退出之前检查第一对j>I失败的字符。可能是Hi@David的重复,我怎么能这样做?目前我只使用Atom和一个终端,没有什么比IDE更新奇的了。op也把I,j的工作搞砸了:可能是偶然的。我,@Bathsheba?你的意思是从0开始而不是从-1开始吗?我弄错了,如果是这样,人们已经提出了解决办法。谢谢如果还有其他事情,请告诉我。不,你的解释已经非常有用了,我可以从这里开始工作,学习是我的目标。非常感谢我是,我也试过,但老实说,我有一大堆问题困扰着我/虽然你的代码看起来很简单,但我会尝试两者。非常感谢没问题!让我知道结果如何。我通过在-1处启动第一个数组,并在while循环上添加一个新的逻辑条件,以在它为false时立即退出循环,从而使它正常工作。稍后我将真正尝试StringBuilder,因为它似乎也是一个非常有用的学习类。非常感谢。我只是在j>I&&isPalindrome;相反,谢谢!