2015-03-31 5 views
-2

У меня возникла проблема с попыткой получить оценку строки. Мой метод оценки верен, поэтому я не собираюсь делиться им, но я не могу понять, что метод действительно подходит к оценке. Я пробовал практически все, и кажется, что я либо получаю ссылки на объекты, либо идентификаторы желаний, либо разные типы (статические и нестатические).Как использовать метод Eval

Я хочу знать, как получить метод eval() для работы.

Во всяком случае, вот код:

import java.util.Stack; 

public class Postfix 
{ 
    String expr; 

    public Postfix(String e) 
    { 
     expr = e; 
    } 

    public double eval() 
    { 
     Stack<Double> stack = new Stack<Double>(); 
     String[] word = expr.split("\\s+"); 
     for (int i = 0; i < word.length; i++) 
     { 
      double a, b, c; 
      switch(word[i]) 
      { 
       case "+": 
        b = stack.pop(); 
        a = stack.pop(); 
        stack.push(a + b); 
        break; 
       default: 
        stack.push(Double.parseDouble(word[i])); 
        break; 
      } 
     } 
     return stack.peek(); 
    } 
} 
+2

Какой у вас код ?, что вы ожидаете от него, и что он делает вместо этого, точно? Включите точное и полное сообщение об ошибке, которое вы получите, если оно есть. –

+1

Перефразируйте вопрос, даже не в состоянии понять, что именно ваша проблема? –

+0

вы вызываете метод? – SomeJavaGuy

ответ

0

ОК, вы до сих пор не выкладываю трассировку стека исключения, хотя это где ваше расследование всегда следует начинать, так как он говорит, что проблема есть, и где это происходит. У нас есть послание, за исключением, хотя, и я могу догадаться из кода, где происходит от:

Исключение: java.lang.NumberFormatException (пустая строка)

Это происходит из следующих линия:

stack.push(Double.parseDouble(word[i])); 

значение, переданное в parseDouble() должна быть строка, представляющая число, но это не так. Это пустая строка, как говорится в сообщении об ошибке.

Зачем? Использование отладчика обнаружит проблему тривиально. Вы передаете следующую строку: " 3 4 + " - expr.split("\\s+"). В результате получается следующий массив (как вы могли бы также знать, распечатав его с помощью System.out.println(Arrays.toString(word))):

[, 3, 4, +] 

Таким образом, она содержит пустую строку в начале, вызванную дополнительными ведущими пространства в вашем выражении.

Замените его на "3 4 +" или позвоните по телефону expr.trim().split("\\s+");, чтобы убедиться, что строка не содержит лишних пробелов.

+0

Спасибо, что помогли мне. Я понятия не имел, что это не выбросит первое пространство. – dsorenson

0

Правило № 1: Если код не работает, не делать то, что я сделал, и не вставить.

Ответ: Добавьте .trim(), иначе ваша строка будет пустой, а затем добавьте еще один .trim() или ответ будет 0.0.

String[] word = expr.trim().trim().split("\\s+"); 
+0

Я не следую вашим рассуждениям о наличии двух вызовов 'trim()'. Я думаю, вы найдете его достаточно. –

+0

Да, это давало мне 0,0 в качестве ответа с одной отделкой, но я попробую еще раз. – dsorenson

+0

Да, одна отделка работает хорошо. – dsorenson

Смежные вопросы