2

JOptionPane から 3+9-2*10/5 のような数式を読み取って、その結果を取得しようとしています。もちろん、操作の順序を考慮しています。String.split() を使用して文字列を数字のみとオペランドのみに分割し、乗算記号または除算記号のいずれかを探す for ループを作成しました。文字列で。

public static void main(String[] args)
{
    String mathString = JOptionPane.showInputDialog("Please type a simple math expression (i.e., without parentheses).");

    String[] parsedIntegers = mathString.split("\\D");
    String[] parsedOperands = mathString.split("\\d+");
    parsedOperands[0] = null;
    System.out.println(Arrays.toString(parsedIntegers));
    System.out.println(Arrays.toString(parsedOperands));

      for (int index = 1; index <= parsedOperands.length; index = index + 1)
      {

          if (parsedOperands[index].equals("*"))
           {
                 System.out.println("The multiplication sign is at index " + index + ".");
                 int multResult = Character.getNumericValue(parsedIntegers[index - 1].charAt(index - 1)) * Character.getNumericValue(parsedIntegers[index].charAt(index));
                 System.out.println(multResult);
           }
      }
}

文字列配列 parsedOperands は次のようになります: [null, +, -, *, /]. 文字列配列 parsedIntegers は次のようになります: [3, 9, 2, 10, 5].

ただし、parsedOperands のインデックス 3 にある "*" を探し、parsedIntegers の (index - 1) と (index) にあるものを乗算しようとすると、Java は IndexOutOfBoundsException を返します。なぜこれが起こるのですか?何か不足していますか?

エラーは次のとおりです。

[3, 9, 2, 10, 5]

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 2

[null, +, -, *, /]

The multiplication sign is at index 3.
    at java.lang.String.charAt(String.java:658)
    at programmingpractice.SolveMathExpression.main(SolveMathExpression.java:49)
Java Result: 1
4

4 に答える 4

2

parsedOperands.length よりも 1 つ小さい値で停止する必要があるため<、 ではなくを使用する必要があり<=ます。

for (int index = 1; index < parsedOperands.length; index = index + 1)

ところで、数値を 1 増やすための特別な演算子 (++) があります。このコードは短いですが、上記の行と同等です:

for (int index = 1; index < parsedOperands.length; index++)
于 2013-01-24T20:55:37.737 に答える
1

配列の長さに等しいインデックスも検討しています。つまり、配列の長さは 4 であり、 for ループは、条件のためにインデックス 4 の要素もチェックします。( index <= parsedOperands.length;)

  for (int index = 1; index <= parsedOperands.length; index = index + 1)

する必要があります

  for (int index = 1; index <= parsedOperands.length-1; index = index + 1)
于 2013-01-24T20:55:35.237 に答える
0

ル:

あなたのエラーは実際にはここにあります:

int multResult = Character.getNumericValue(parsedIntegers[index - 1].charAt(index - 1)) * Character.getNumericValue(parsedIntegers[index].charAt(index));

使用する必要があります

int multResult = Integer.valueOf(parsedIntegers[index - 1]) * Integer.valueOf(parsedIntegers[index]);

これにより、可能な限り多くの桁を持つ整数を扱うことができます。

しかし、残りは残ります。Java 配列は 0 ベースです。forステートメントを次のように書き換えます。

for (int index = 1; index < parsedOperands.length; index++)

実際、最後の部分 はindex++、(少なくとも私には)見栄えが良いだけです。これは、バリアント(index = index + 1)も問題ないためです。

詳細については、こちらも参照してください

于 2013-01-24T20:58:11.900 に答える
0

配列の各要素parsedIntegersは 1 文字の文字列であるため、 を使用する場合は次のようcharAtにする必要がありますcharAt(0)

int multResult = Character.getNumericValue(parsedIntegers[index - 1].charAt(0)) *
                 Character.getNumericValue(parsedIntegers[index].charAt(0));

charAt(index)or thereを使用charAt(index - 1)すると、1 文字の文字列の末尾を超えて読み取ろうとし、StringIndexOutOfBoundsException取得した をスローします。

ただし、これを行うためのより堅牢な方法は、おそらく使用Integer.parseIntすることで、複数桁の整数を使用できます。

int multResult = Integer.parseInt(parsedIntegers[index - 1]) *
                 Integer.parseInt(parsedIntegers[index]);
于 2013-01-24T21:00:07.303 に答える