0

私はクラスでこれをやっていますが、10年以上練習していないので、これは本当に得意ではありません。ユーザーが回文かどうかを判断する方法を選択できるように、メニューを表示するプログラムを作成しようとしています。

テストが完了したら、メニューを再表示する必要があります。2 つのクラスを 1 つのクラスに結合したため、isPalindrome メソッドでスタック オーバーフロー エラーが発生しました。これにより、出力で発生していた別の問題が解決されると思いました。私が取ることができる考えや指示はありますか?

import java.util.Scanner;

public class PalHelper 
{
public String pal;
public void MenuList() 
{
System.out.println("How would you like to check your phrase?");
System.out.println("1. Check the first letter like it's the last letter - Leave no phrase unturned!");
System.out.println("2. I Prefer my Palindromes have the gentle treatment");
System.out.println("3. We're done here");
System.out.print("Selection: ");
}

public PalHelper() 
{
Scanner decision = new Scanner(System.in);
    MenuList();

switch (decision.nextInt()) 
{
    //to access the character by character method of determination
    case 1:
    System.out.print("Enter Phrase to Test, the Hard Way:");
    Scanner keyboard1 = new Scanner(System.in); //declares scanner variable for user entry
    String UserInput1 = keyboard1.next();//Phrase variable
    Boolean test1 = isPalindrome(UserInput1);
            if (test1 == true){
                System.out.println(UserInput1+" is a palindrome. That doesn't make you smart.");    
                        }
            else {
                System.out.println(UserInput1+" is a not palindrome. Why don't you think a little harder and try again.");
                        }
    System.out.println("..\n..\n..\n");
    keyboard1.close();
    new MenuList();
    break;

    //to access the string buffer method of determination
    case 2:
    System.out.print("Thank you for choosing the gentle way, please enter your phrase:");
    Scanner keyboard2 = new Scanner(System.in); //declares scanner variable for user entry
    String UserInput2 = keyboard2.next();
    Boolean test2 = isPalindrome2(UserInput2);
    if (test2 == true){
                System.out.println(UserInput2+" is a palindrome. Congratulations! You are so wonderful!");  
                    }
            else {
                System.out.println(UserInput2+" is a not palindrome. It's ok, I'm sure you'll get it next time.");
                    }
    System.out.println("..\n..\n..\n");
    keyboard2.close();
    new MenuList();
    break;

//exit menu
    case 3:
    System.out.println ( "Too bad – I hid a boot!" );    
    break;

//response to input other than 1,2,3
    default:
    System.out.println ( "No sir! Away! A papaya war is on." );
    System.out.println("..\n..\n..\n");
    new MenuList();
    break;

    }// close switch
}//close pal helper




public void Palindrome(String UserInput) {

}

public boolean isPalindrome(String UserInput) {
pal = UserInput.toUpperCase();   
if (pal.length() <= 1) {//one character, automatically a palindrome
   return true;     
}

char start = pal.charAt(0);
char end = pal.charAt(pal.length()-1);
        if (Character.isLetter(start) &&
            Character.isLetter(end)) {//check if first and last characters match

            if (start != end) {
                return false;     //if the beginning & ending characters are not the same it's not a palindrome      
            }
            else {

            Palindrome subpal = new Palindrome(pal.substring(1,pal.length()-1));
            return subpal.isPalindrome();  //check middle dropping start and end letters
            }
        }
        else if (!Character.isLetter(start)) {
            Palindrome subpal = new Palindrome(pal.substring(1));
            return subpal.isPalindrome(pal);      //check if first letter is a letter, drop if not
        }
        else {
            Palindrome subpal = new Palindrome(pal.substring(0,pal.length()-1));
            return subpal.isPalindrome(pal);      //check if first letter is a letter, drop if not
        }                       

}//close isPalindrome
public boolean isPalindrome2(String UserInput){

 pal = UserInput.toUpperCase();
 pal = pal.replaceAll("\\W", "");//gets rid of space and punctuation
 StringBuffer check = new StringBuffer(pal);//reverses pal string and creates new stringbuffer for check
 check.reverse();


        if (check.toString().equals(pal)){//checks for equality between pal and it's reverse
            return true;
        }
        else {
            return false;
        }

  }//close isPalindrome2

public static void main (String[]args) 
{
new PalHelper();

}//close main
}//close class
4

2 に答える 2

0

上記の私のコメントとは別に、私が気付いた問題があります。場合によっては、部分文字列を使用して新しい Palindrome インスタンスを作成しますが、isPalindrome()メソッドへの再帰中に完全な文字列を渡します。これにより、再帰が終了することはありません (これにより、コードを追跡するのも難しくなります)。

于 2013-02-14T20:31:46.547 に答える
0
  1. あなたの例には何かが欠けています.次の行には閉じ括弧がありません:

    回文 subpal = 新しい回文(pal.substring(1,pal.length()-1);

  2. あなたのコメントはコードと一致していないようです:

    subpal.isPalindrome(pal) を返します。//最初の文字が文字かどうかを確認し、そうでない場合はドロップします

  3. メソッドに出力を追加するisPalindrome()か、デバッグしてみてください。おそらく正しい文字列で呼び出しておらず、同じ文字列を何度もループしてしまうでしょう。

    public boolean isPalindrome(String UserInput) { System.out.println(UserInput); ...

編集:あなたのコードがあなたが投稿したように本当に正確である場合、vhallacは正しいですisPalindrome()。完全な文字列で呼び出します。

于 2013-02-14T20:34:43.493 に答える