0

私はJavaで奇妙な問題を抱えています。中置数式を評価し、最終結果を画面に返す数式計算機を作成しようとしています。私はタスクを達成するためにスタックを使用してきました。これまで、ハードコーディングされた文字列を入力に使用していましたが、同じ目的でコマンド ライン引数に変更しました。私の問題は、データ型と文字列がまったく同じであるにもかかわらず、使用しているスタックがコマンドライン入力から値をプッシュしないことです。

データをスタックにプッシュするコードは次のとおりです。

public class Expression 
{
    public static void main(String argv[]){

        Stack<String> operator = new Stack<String>();
        Stack<String> operand = new Stack<String>();

        /*
        String push[] = new String[argv.length];
        for (int i = 0; i<push.length; i++){
            push[i] = argv[i];
        }
        */

        for(int i = 0; i<argv.length; i++){
            if(argv[i] == "+" || argv[i] == "-" || argv[i] == "*" 
               || argv[i] == "/" || argv[i] == "^") {
                operator.push(argv[i]);
            } else if(argv[i] == "0" || argv[i] == "1" || argv[i] == "2" 
                      || argv[i] == "3" || argv[i] == "4" || argv[i] == "5" 
                      || argv[i] == "6" || argv[i] == "7" || argv[i] == "8" 
                      || argv[i] == "9") {
                operand.push(argv[i]);
            }
        }

        System.out.println(operand);
        System.out.println(operator);

        Stack<String> result = evaluateStack(operand, operator);
        System.out.println(result.toString());
    }
}

ハードコードされた文字列を使用してデバッガーを使用すると、スタックが正常にいっぱいになったことが示されていましたが、コマンドライン引数を使用すると、for ループが完了しても、常に 0 要素のスタックが表示されます。私は何を間違っていますか?

4

3 に答える 3

1

いつ「==」を使用し、いつ「equals」を使用するかを確認してください....

     "==" will be used to check the equality of the String objects 

    "equals(...)" will be used to the check the content of the String objects.

equals(...) メソッドを使用してオペランドをチェックすると、問題は解決します

オペレーター

于 2012-09-11T06:00:38.007 に答える
1

ここで 2 つの問題があります。1 つ目はString、Java の a は を使用して比較する必要があるということequalsです。Java で使用==すると、文字列の内容ではなく、実際には文字列のアドレスが比較されます。java Expression 1*2+32 番目の問題は、 のようにプログラムを呼び出すとargv[0]、この場合は合計 になること1*2+3です。これを修正するには、文字列内の各文字を反復処理する必要があります。

編集:これを投稿した後、引数がおそらく空白で区切られていることに気付きました1 * 2 + 3.

于 2012-09-11T05:54:43.017 に答える
1

理想的には、使用した等価演算子のために、スタックに何もプッシュしていません。argv[i] == "<any_str>"に変更しますargv[i].equals("<any_str>")。その後、動作するはずです。また、文字列の比較中equals()は、文字列がインターンされているかどうかわからないため、常にメソッドを使用してください

于 2012-09-11T05:51:30.380 に答える