Разбор текстового файла для расчетов - PullRequest
0 голосов
/ 28 ноября 2011

Вот пример того, что я пытаюсь сделать, что должно направить меня на правильный путь

У меня есть текстовый файл, например:

  2*3
  4-4
  4+2  
  8*1

Для каждой строки мне нужнодля разделения чисел и определения типа действия (например, умножение в 1-й строке), чтобы я мог создать следующий вывод:

  6
  0
  6
  8
  • Должен ли я использовать разделитель для их разделения (неВы уверены, как это сделать, поскольку разделитель может быть +, -, * и /)?

  • Или использовать цикл for?(Я бы точно хотел этого избежать ...)

Ответы [ 5 ]

4 голосов
/ 28 ноября 2011

Одно решение (без проверки ошибок, добавьте его, если оно вам нужно), которое будет работать:

myfile.txt

2 + 2

фрагмент кода

Scanner sc = new Scanner(new File("myfile.txt"));
double firstNumber = sc.nextDouble();
String operation = sc.next("[+-/\\*]");
double secondNumber = sc.nextDouble();

double result;
if("+".equals(operation))
  result = firstNumber + secondNumber;
else if("-".equals(operation))
  result = firstNumber - secondNumber;
else if("*".equals(operation))
  result = firstNumber * secondNumber;
else if("/".equals(operation))
  result = firstNumber / secondNumber;
else
  System.out.println("Operation unrecognized");

System.out.println(firstNumber + operation + secondNumber + " = " + result);
3 голосов
/ 28 ноября 2011

Вот очень упрощенный ответ, не очень надежный, если данные не сформированы, как вы описали.

static Pattern pattern = Pattern.compile("([0-9]+)([+-/\\*])([0-9]+)");
public static int calculate(String arg) {
    Matcher matcher = pattern.matcher(arg);
    if (matcher.find()) {
        int a = Integer.parseInt(matcher.group(1));
        int b = Integer.parseInt(matcher.group(3));
        String operator = matcher.group(2);
        if ("+".equals(operator)) {
            return a+b;
        } else if ("-".equals(operator)) {
            return a-b;
        } else if ("/".equals(operator)) {
            return a/b;
        } else if ("*".equals(operator)) {
            return a*b;
        }
    }
    throw new IllegalArgumentException("Could not parse '" + arg + " '");
}

Он анализирует строку как три группы: сначала группу чисел, затем одну из (+, -, / или *), а затем другую группу чисел.

1 голос
/ 28 ноября 2011
//puesdocode
while end of file not reached
{
   int x = next int from input file
   char ch = next char from input file
   int y = next int from input file
   int z;
   switch(ch)
   {
      case '*': z = x*y; break;
      case '/': z = x/y; break;
      case '-': z = x-y; break;
      case '+': z = x+y; break;
   }
   println to file (z);
}
0 голосов
/ 29 ноября 2011

Механизм ECMAScript (JavaScript) ScriptEngine может выполнять вычисления построчно.

0 голосов
/ 28 ноября 2011

Вместо того, чтобы создавать свои собственные (так как это может стать сложным, когда вы начинаете поддерживать несколько операций / операндов на строку), я предлагаю использовать arity - Arithmetic Engine для Java . Ниже приведен пример с их сайта.

import org.javia.arity.Symbols;
import org.javia.arity.SyntaxException;

public class Try {
    public static void main(String args[]) throws SyntaxException {
        Symbols symbols = new Symbols();
        double value = symbols.eval("2^10");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...