2012-01-25 4 views
4

私はプログラミングクラスの課題に取り組んでいますが、私はいくつかの難しさに遭遇しました。基本的に質問は、私たちは回文をチェックするプログラムを書くことを尋ねます。ループとスタック、palindromeの宿題の割り当て

  • ユーザが文字列を文字は、このように、スタックのうち一度に一つを引かれる
  • スタックに一度に一つの文字を押され
  • テキスト(NO非alphanumberic文字ができません。)に入ります文字列
  • を逆に元が逆と同じであれば、私たちは回文

を持っている私はしかし私のループを有するいくつかの問題を抱えているとそれから知らない、誰もが持っていません任意のアドバイスまたはポインタ?私は間違って何をしていますか?

これまで私がこれまで持っていたことは次のとおりです。

import java.util.Stack; 
import java.util.regex.*; 
import javax.swing.*; 

public class Question1 { 

    static Stack PDrome = new Stack(); 

    public static String Reverse (String input) { 
     String reverse; 

     if (input.length() <= 1) { 
      return input; 
     } 

     //pushing onto the stack 
     for (int i=0; i<input.length();i++) { 
      PDrome.push(input.charAt(i)); 
     } 


     //popping from the stack into the string 
     for (int i=0; i<input.length(); i++) { 
      PDrome.pop()=reverse.charAt(i); 
     } 

     return reverse; 
    } 

    //Illegal char check method 
    public static boolean checker (String input) { 
     Pattern p = Pattern.compile("[^a-z0-9]", Pattern.CASE_INSENSITIVE); 
     Matcher m = p.matcher(input); 
     boolean b = m.find(); 

     if (b) { 
      System.out.println("There is a special character in your string"); 
      System.exit(0); 
     } 

     return b;  
    } 


    //Main 
    public static void main (String [] args) { 
     //input 
     String input = JOptionPane.showInputDialog("Enter text to check if it's a palndrome"); 

     //error case 
     if (input==null); { 
      System.out.println("Nothing Entered"); 
      System.exit(0); 
     } 

     //checking for illegal chars 
     checker(input); 
    } 
} 

答えて

3

この部分:追加するときという

String reverse = ""; 
... 
//popping from the stack into the string 
for (int i=0; i<input.length(); i++) 
{ 
    // appends the popped character to reverse 
    reverse += PDrome.pop(); 
} 

注:

String reverse; 
... 
//popping from the stack into the string 
for (int i=0; i<input.length(); i++) 
{ 
    PDrome.pop()=reverse.charAt(i); 
} 

は次のようにする必要があります多数の文字列、これはisn ' Javaの文字列は不変であり、繰り返し文字列を追加すると毎回新しい文字列を作成する必要があるため、これを行う最良の方法です。この問題は十分に小さいので問題はありませんが、問題が大きくなるとStringBuffer/StringBuilderを使用することになります。

+0

私は心に留めておきます、あなたの返事に感謝します。それは多くの助けになりました! – Eogcloud

+0

+1: 'StringBuffer'アドバイス。 1つのこと:StringBufferは同期されています。 Java 5以降には 'StringBuilder'があります。これは同じですが、同期化されていないので、ローカル変数(ほとんどの場合)としてメソッド内で使用するような、1つのスレッドのニーズには優れています。 – helios

2

PDrome.pop()=reverse.charAt(i);が間違っています。

  1. 逆はnullである - > NullPointerExceptionが
  2. あなたは、関数に値を代入していますか? (pop())

ビルドスタックからpop'pingを逆にする必要があります。

ですから、空の文字列で始まる必要があります:reverse = "";と、スタックから取り出した文字を追加します。

while (!PDrome.isEmpty()) 
    reverse += PDrome.pop(); 

詳細を命名フィールドやメソッド名を起動するために、非大文字を使用してください:

"someIntegerVariable" 
"methodForCalculation" 

クラス名とインターフェイス名を開始するのに大文字のみ:

Stack 
ArrayList 
MyClass 

:)

(Javaの規則から)

+0

Ahhhhh!私は間違ってやっていることを見て、頭の中で意味をなさないが、どういうことが間違っているのか分からなかった。 また、感謝の上にメソッドの – Eogcloud

+1

@ Eogcloud - 文字列をconcat'ingの代わりにStringBuilderを使用する - すでに良い事例に慣れる:)(文字列 - concatは、新しい文字列オブジェクトがすべての連結!) – quaylar

2

実際にここで何をしていますか?

PDrome.pop()=reverse.charAt(i); 

あなたは、一度に1つのcharを取得し、reverseにそれを追加する使用PDrome.pop()を持っている必要があります。

+0

それは私の考えを横切って試してみようとするものよりも擬似コードの方がずっと似ていました。 – Eogcloud

1

これは私の意見で書いた方がはるかにクリーンな方法です。再帰的アプローチです。

bool isPalindrome(String s) 
{ 
    if(s.length() <= 1) 
     return true; 

    return s[0] == s[s.length() - 1] && isPalindrome(s.substr(1, s.length() - 2); 
} 

ご覧のとおり、少し短くなっています。