检查字符串是否为回文(java)(新手状态)

时间:2013-02-22 06:15:24

标签: java logic palindrome

我正在尝试检查是否输入字符串,该字符串是回文

如果显示正面的东西 如果不是......一些消极的(无效的)

我目前的答案无效两次(无论输入什么) 我不太确定for循环或布尔语句是否有问题。

    //ACTION FROM BUTTON PERFORMED HERE
private void ButtonActionPerformed(ActionEvent evt) {
    //creating variables
    String myString = textField1.getText();
    int stringLength = myString.length();
    char arrayOne[] = new char[stringLength];
    char arrayTwo[] = new char[stringLength];
    boolean palindrome = false;

    //for loop to setup ARRAY ONE
    for(int i = 0; i < stringLength-1; i++){
        arrayOne[i] = myString.charAt(i);
    }

    //for loop to setup ARRAY TWO
    for(int i = stringLength-1; stringLength-1 > i; i--){
        arrayTwo[i] = myString.charAt(i);
    }

    //for loop checking if array indexes are equivalent in value (char)
    for(int i = 0; i < stringLength-1; i++){
        if(arrayOne[i] != arrayTwo[i]){
            palindrome = false;
        }
        else{
            palindrome = true;
        }
    }

    //assigning text to the text boxes based on boolean palindrome
    if(palindrome == true){
        textField2.setText("Valid");
    }
    if(palindrome ==false){
        textField2.setText("Invalid");
    }
}

}

我想我已经下了评论

8 个答案:

答案 0 :(得分:3)

更改

for(int i = stringLength-1; stringLength-1 > i; i--)

for(int i = 0; i < stringLength-1; i++)

并更改

for(int i = stringLength-1; i-1 > 0; i--)

for(int i = stringLength-1; i-1 >= 0; i--)

修改

这是一个调试节目!!

这是一个有效的代码:

    String myString = textField1.getText();
    int stringLength = myString.length();
    char arrayOne[] = new char[stringLength];
    char arrayTwo[] = new char[stringLength];
    boolean palindrome = true;
    //for loop to setup ARRAY ONE
    for(int i = 0; i <= stringLength-1; i++){
        arrayOne[i] = myString.charAt(i);
    }

    //for loop to setup ARRAY TWO
    for(int i = stringLength-1, pos = 0; i >= 0; i--, pos++){
        arrayTwo[pos] = myString.charAt(i);
    }

    //for loop checking if array indexes are equivalent in value (char)
    for(int i = 0; i <= stringLength-1; i++){
        if(arrayOne[i] != arrayTwo[i]){
            palindrome = false;
            break;
        }
    }

    //assigning text to the text boxes based on boolean palindrome
    if(palindrome == true){
          textField2.setText("Valid");
    }
    else{
        textField2.setText("Invalid");
    }

答案 1 :(得分:2)

我同意关于你的错误的其他答案,但我认为更简洁的解决方案是

boolean isPalindrome(String myString) {    
    int n = myString.length;
    for( int i = 0; i < n/2; i++ )
        if (myString.charAt(i) != myString.charAt(n-i-1)) return false;
    return true;    
}

您的代码现在是

private void ButtonActionPerformed(ActionEvent evt) {
    String myString = textField1.getText();     
    textField2.setText( isPalindrome(myString) ? "Valid" : "Invalid" );
}

答案 2 :(得分:1)

此循环复制除最后一个之外的所有字符,这可能不是您想要的字符:

//for loop to setup ARRAY ONE
for(int i = 0; i < stringLength-1; i++){
    arrayOne[i] = myString.charAt(i);
}

它可能应该像这样修复:

//for loop to setup ARRAY ONE
for(int i = 0; i < stringLength; i++)
{
    arrayOne [i] = myString.charAt (i);
}

这个循环的主体:

//for loop to setup ARRAY TWO
for (int i = stringLength-1; stringLength-1 > i; i--)
{
    arrayTwo [i] = myString.charAt (i);
}

永远不会被执行,因为istringLength - 1的初始值不满足循环条件:stringLength - 1 > i

您应该将其更改为:

// For loop to setup ARRAY TWO
for (int i = 0; i < stringLength; i++)
{
    arrayTwo [i] = myString.charAt (stringLength - i - 1);
}

此后,在此循环之后:

// for loop checking if array indexes are equivalent in value (char)
for (int i = 0; i < stringLength-1; i++)
{
    if (arrayOne [i] != arrayTwo [i])
    {
        palindrome = false;
    }
    else
    {
        palindrome = true;
    }
}

变量palindrome将仅包含最后一次比较的结果,因此如果除了最后一个字符之外的所有字符都不同但最后一个字符相等,palindrome将是true,这可能不是什么你自找的。可能你应该改变这样的代码:

palindrome = true;
for (int i = 0; i < stringLength; i++)
{
    if (arrayOne [i] != arrayTwo [i])
    {
        palindrome = false;
    }
}

请注意,我还将stringLength - 1更改为stringLength,否则您忽略了最后一个字符。

答案 3 :(得分:1)

//for loop to setup ARRAY TWO
for(int i = stringLength-1; stringLength-1 > i; i--){
    arrayTwo[i] = myString.charAt(i);
}

这在第一次迭代后就会失败。

您需要将其更改为:

//for loop to setup ARRAY TWO
for(int i = stringLength-1; i > 0; i--){
    arrayTwo[i] = myString.charAt(i);
}

答案 4 :(得分:0)

在java中测试回文的最简单方法

String str = "Able was I ere I saw Elba"
boolean palindrome = str.equalsIgnoreCase(new StringBuilder(str).reverse().toString());
是的,就是这样。

答案 5 :(得分:0)

public static void main(String[] args) {
    String s = "akaq";
    boolean b = false;
    for (int i = 0, j = s.length() - 1; i < j; i++, j--) {
        if (s.charAt(i) == s.charAt(j)) {
            b = true;
            continue;
        } else {
            b = false;
            break;
        }
    }
    if (b)
        System.out.println("Palindrome");
    else
        System.out.println("Not Palindrome");
}

尝试这样的事情而不是2-3次循环。

答案 6 :(得分:0)

将第一个for循环从stringLength-1更改为stringLength,因为您正在使用&lt;而不是&lt; =

将第二个for循环更改为

if(int i = stringLength-1; i>=0; i--)

此外,默认情况下将palindrome设置为true并删除

else{
    palindrome = true;
}

部分因为现在如果循环的第一个和最后一个字符相同,但不是中间,则返回true。

编辑:第三个for循环也应该是stringLength而不是stringLength-1,因为你正在使用&lt;而不是&lt; =

答案 7 :(得分:0)

无需将所有内容复制到数组中。 String本质上是一个数组。您可以使用charAt()访问各个字符。

此外,不需要循环String的整个长度,因为相等是关联的。

所以简单地使用:

public boolean isPalindrome(String s) {
    for (int i = 0; i < s.length() / 2; i++) {                  // only until halfway
        if (s.charAt(i) != s.charAt(s.length() - i - 1)) {      // accessing characters of String directly
            return false;
        }
    }
    return true;
}

最后一句话:如果String的长度是奇数,则不需要检查中间字符。所以在上面的代码中通过

进行划分