2017-03-05 6 views
0

私はStringTokenizerを使用して、String入力内の要素で2つのスタックを作成しようとしています。私はwhileループに埋め込まれた2つのifループを使用して、正しいタイプのトークンをそれぞれのスタックに移入しようとしています。私はタイプを決定する条件を実際に設定する方法に苦労しています。ここに私がこれまで持っているものがあります。Javaでトークンの種類を決定するにはどうすればよいですか?

+0

1. whileループ本体でtoken.nextElement()を複数回呼び出さないでください。 2. http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java –

+0

を読み、 '=='を使って文字列を比較し、 '.equals(otherObject)'を代わりに使う –

+0

あなたはこのサイトを初めて利用しているようですので、[このヘルプページ](http://stackoverflow.com/help/someone-answers)をご覧ください。基本的には、控えめな回答の隣にある緑色のチェックマークをクリックして、回答者に報酬を与えるようにあなたの質問を解決済みとマークする必要があります。 –

答えて

0

まず、文字列に==を使用しないでください。代わりに.equals()を使用してください。

次の問題は、最初の条件で比較するトークンが2条件のものとは異なることです。 token.nextToken()は、最初のトークンを返し、それをTokenizerから削除します。

最初の要素を格納する一時変数を作成することができます。あなたはそれを何かと比較するのにこれを使うことができます。あなたも一緒に通常のものを行うことができますので

Stack numbers = new Stack(); 
Stack operators = new Stack(); 
StringTokenizer token = new StringTokenizer(expr, delimiters, true); 

while(token.hasMoreTokens()) { 
    String tmp = token.nextElement() 
    if(tmp.equals(...)){ 

    } 
    if(tmp.equals(...){ 

    } 
} 
+0

okay私は、トークナイザは、コンパイラがそれが何であるかを考えて(すなわち、3を見ればintと仮定して)、型を作成したと考えました。あなたの答えをありがとう! –

0

答え

返されるトークンは、実際には文字列です。私はあなたの正確な要件が何であるか知らないが、このような何かが動作するはずです:すべての

List<String> operators = Arrays.asList("+", "-", "*", "/"); 
StringTokenizer token = ...; 

while(token.hasMoreTokens()){ 
    String next = token.nextElement(); 
    if(operators.contains(next)){ 
     //operator 
    } 
    else if(next.matches("\\d+")){ 
     //number 
    } 
    else { 
     //error? 
    } 
} 

まずあなたが次のトークンのために使用して、変数を使用する必要があります、のnextElementは()もトークナイザからトークンが削除されますので、どこかに置かなければなりません。次に、文字列を比較して型を判別できます。ここでは、それが所定の演算子のリストであるかどうか、正規表現\d+と一致するかどうかを確認します。それが数字かどうか。

廃止

StringTokenizer JavaDocは、それがString.splitの賛成で廃止されましたと言う:

StringTokenizerは、その使用は新しいコードでは推奨されて の理由が、互換性のために保持されているレガシークラスです。 この機能を求める人は、文字列 またはjava.util.regexパッケージのsplitメソッドを使用することをお勧めします。

このクラスを使用することをおすすめします。

+0

これは、左から右に入力される数式を解決するためのアルゴリズムの一部です(通常の操作順序は無視されます)。あなたの返事をありがとう –

関連する問題