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 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 に答える
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 - 1したことに注意してくださいstringLength。そうしないと、最後の文字を無視していました。

于 2013-02-22T06:18:21.033 に答える
0

<=ではなく<を使用しているため、最初のforループをstringLength-1からstringLengthのみに変更します。

2番目のforループをに変更します

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

また、デフォルトで回文をtrueに設定し、

else{
    palindrome = true;
}

これは、ループの最初の文字と最後の文字が同じで、中央が同じでない場合、trueを返すためです。

編集:また、<=ではなく<を使用しているため、3番目のforループはstringLength-1ではなくstringLengthである必要があります

于 2013-02-22T06:26:51.840 に答える
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

すべてを配列にコピーする必要はありません。文字列は基本的に配列そのものです。で個々の文字にアクセスできますcharAt()

また、等式は連想的であるため、文字列の全長をループする必要はありません。

したがって、単に使用します:

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 に答える
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 に答える