0

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

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

我目前两次都得到无效的答案(无论输入什么)我不太确定 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");
    }
}

}

我想我是血统的评论它

4

8 回答 8

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");
    }
于 2013-02-22T06:16:54.710 回答
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" );
}
于 2013-02-22T06:24:32.543 回答
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);
}

i永远不会执行,因为:的初始值stringLength - 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 - 1stringLength,否则您将忽略最后一个字符。

于 2013-02-22T06:18:21.033 回答
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);
}
于 2013-02-22T06:20:06.277 回答
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 for 循环。

于 2013-02-22T06:23:24.193 回答
0

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

String str = "Able was I ere I saw Elba"
boolean palindrome = str.equalsIgnoreCase(new StringBuilder(str).reverse().toString());

是的,就是这样。

于 2013-02-22T06:20:45.490 回答
0

将第一个 for 循环从 stringLength-1 更改为 stringLength 因为您使用的是 < 而不是 <=

将第二个 for 循环更改为

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

此外,将回文默认设置为 true 并删除

else{
    palindrome = true;
}

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

编辑:第三个 for 循环也应该是 stringLength 而不是 stringLength-1 因为你使用的是 < 而不是 <=

于 2013-02-22T06:26:51.840 回答
0

无需将所有内容复制到数组中。字符串基本上是一个数组本身。您可以使用 访问各个字符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;
}

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

于 2013-02-22T06:34:40.237 回答