我有一个包含各种整数和操作的行文件,如何将它们分开并将它们存储到一个数组中,以便我可以相互使用它们。例如,读取一行586 + - ,并执行(6 + 8)-5。
修改
实际上字符用空格分隔,应该处理任何整数。线看起来像5 8 6 + - 或另一个10 50 30 * 6 + -
答案 0 :(得分:1)
如果知道每个输入都是一个数字(并且没有空格),那么解析文件非常简单:
while(has more lines){
nextLine = read line
for each char c in nextLine
parse character into digit or operation
}
在Java中,您可以使用Scanner
或BufferedReader
执行此操作。 Scanner
有Scanner.hasNextLine()
方法。在BufferedReader
的情况下,您可以执行以下操作:
final BufferedReader br = new BufferedReader(new FileReader(fileName));
while((nextLine = br.readLine()) != null){
...
}
有几种方法可以将字符解析为符号。要获得数字,首先要测试以确保 是一个数字:
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);
}
}