将整数和操作存储在数组中以供使用

时间:2014-11-28 23:28:40

标签: java

我有一个包含各种整数和操作的行文件,如何将它们分开并将它们存储到一个数组中,以便我可以相互使用它们。例如,读取一行586 + - ,并执行(6 + 8)-5。

修改

实际上字符用空格分隔,应该处理任何整数。线看起来像5 8 6 + - 或另一个10 50 30 * 6 + -

3 个答案:

答案 0 :(得分:1)

如果知道每个输入都是一个数字(并且没有空格),那么解析文件非常简单:

while(has more lines){
    nextLine = read line
    for each char c in nextLine
        parse character into digit or operation
}

在Java中,您可以使用ScannerBufferedReader执行此操作。 ScannerScanner.hasNextLine()方法。在BufferedReader的情况下,您可以执行以下操作:

final BufferedReader br = new BufferedReader(new FileReader(fileName));
while((nextLine = br.readLine()) != null){
    ...
}

(见BufferedReader.readLine()

有几种方法可以将字符解析为符号。要获得数字,首先要测试以确保 是一个数字:

boolean isDigit(final char c){
    return c >= '0' && c <= '9';
}

如果一个数字,那么找到它的值:

int getDigit(final char digit){
    return digit - '0';
}

否则,如果是一个操作,那么你需要使用switch语句来确定它是什么操作:

int getOp(final char c){
    switch(c){
    case OP1_CHAR : return OP1_CODE;
    case OP2_CHAR : return OP2_CODE;
    ...
    default: throw new RuntimeException(c + " is an unknown operation");
    }
}

由于操作会导致您从堆栈中弹出,因此您不需要在OP_CODE上分配这个中间步骤,而只需打开OP_CHAR然后执行所需的操作......类似于:

void doOp(final char op){
    switch(c){
    case OP1_CHAR : perform operation 1 which probably requires 
                        popping from the stack, doing some operation,
                        and pushing back onto the stack
        break; // or return;

    case OP2_CHAR : perform operation 2
        break;
    ...
    default: throw new RuntimeException(op + " is an unknown operation");
    }
}

答案 1 :(得分:0)

您在该文件中给出了后缀(也称为反向波兰表示法)表达式 因此,您的任务是首先解析它们,以便从中计算结果 要在代码中实现这一点,您需要知道执行此操作的算法 参见例如Postfix notation to expression tree
您也可以谷歌搜索“解析后缀表达式”。有足够的资源。

答案 2 :(得分:-1)

解决方案:

Operations.txt包含以空格分隔的数字列表:

5 8 6 + +

10 50 30 * 6 + -

.......

这里是代码:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Scanner; 
public class Operations {
static String[] stack = new String[100];
static int index=-1;

public static void main(String[] args) throws FileNotFoundException, IOException {       
    File f = new File ("C:\\Operations.txt");
    Scanner input = new Scanner(f);               
    String line;        
    while(input.hasNextLine())
    {
        line = input.nextLine();
        String [] opes = line.split("\\s+");      
        for(int i=0; i<opes.length;i++) {                
            if (opes[i].matches("[\\*+-/]")) {                     
                push(calculate(opes[i]));
            }
            else    
                push(opes[i]);
        }
        System.out.println(line+" = "+pop());
    }        
}

public static void push(String value) {
    index++;
    stack[index]=value;        
}

public static String pop() {        
    String value = stack[index];
    index--;
    return value;
}

public static String calculate(String operation) {
    double res = 0.0;
    double ope1=Double.parseDouble(pop());
    double ope2=Double.parseDouble(pop());
    switch (operation) {
        case "+": res = ope1 + ope2;
            break;
        case "-": res = ope1 - ope2;    
            break;
        case "*": res = ope1 * ope2;    
            break;
        case "/": res = ope1 / ope2;    
            break;    
    }
    return String.valueOf(res);
  }    
}