我正在用Java实现一个RPN计算器,需要帮助创建一个类来将方程解析为单独的标记。
我的输入文件将具有未知数量的等式,类似于下面所示的等式:
49+62*61-36 4/64 (53+26) 0*72 21-85+75-85 90*76-50+67 46*89-15 34/83-38 20/76/14+92-15
我已经在程序中使用了我自己的通用堆栈类,但我现在正试图弄清楚如何从输入文件中读取数据。任何帮助表示赞赏。
我已经在PasteBin发布了我的堆栈类的源代码,以防它可能会有所帮助。
我还将没有文件阅读的计算器上传到PasteBin,以显示我已经完成的工作。
我现在已经设法将文件读入并且令牌被分解,感谢您的帮助。当它到达文件末尾并且想知道如何解决时,我收到错误?
以下是代码:
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
public class TestClass {
static public void main(String[] args) throws IOException {
File file = new File("testEquations.txt");
String[] lines = new String[10];
try {
FileReader reader = new FileReader(file);
BufferedReader buffReader = new BufferedReader(reader);
int x = 0;
String s;
while((s = buffReader.readLine()) != null){
lines[x] = s;
x++;
}
}
catch(IOException e){
System.exit(0);
}
String OPERATORS = "+-*/()";
for (String st : lines) {
StringTokenizer tokens = new StringTokenizer(st, OPERATORS, true);
while (tokens.hasMoreTokens()) {
String token = tokens.nextToken();
if (OPERATORS.contains(token))
handleOperator(token);
else
handleNumber(token);
}
}
}
private static void handleNumber(String token) {
System.out.println(""+token);
}
private static void handleOperator(String token) {
System.out.println(""+token);
}
}
另外,我如何确保RPN逐行工作?我对我想要遵循的算法感到非常困惑。
答案 0 :(得分:4)
因为所有运算符都是单个字符,所以您可以指示StringTokenizer
将它们与数字标记一起返回。
String OPERATORS = "+-*/()";
String[] lines = ...
for (String line : lines) {
StringTokenizer tokens = new StringTokenizer(line, OPERATORS, true);
while (tokens.hasMoreTOkens()) {
String token = tokens.nextToken();
if (OPERATORS.contains(token))
handleOperator(token);
else
handleNumber(token);
}
}
答案 1 :(得分:1)
由于你的问题现在完全改变了它的原始版本 - 这是对原始版本的回应,这是如何使用FileReader从文件中获取值。
这会将每一行放入String数组的单独元素中。您可能应该使用ArrayList,因为它更灵活,但我刚刚做了一个快速演示 - 您可以按照自己的意愿清理它,虽然我注意到您使用的代码需要一个String数组作为它的输入。也许您最初可以将值读入ArrayList,然后在拥有所有行后将其复制到数组中 - 这样您可以根据需要添加任意数量的行,并使代码保持灵活,以便更改您的行数输入文件。
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class TestClass {
static public void main(String[] args) {
File file = new File("myfile.txt");
String[] lines = new String[10];
try {
FileReader reader = new FileReader(file);
BufferedReader buffReader = new BufferedReader(reader);
int x = 0;
String s;
while((s = buffReader.readLine()) != null){
lines[x] = s;
x++;
}
}
catch(IOException e){
//handle exception
}
// And just to prove we have the lines right where we want them..
for(String st: lines)
System.out.println(st);
}
}
您之前提到过您使用此链接上的代码:
http://www.technical-recipes.com/2011/a-mathematical-expression-parser-in-java/#more-1658
这似乎已经处理过运营商优先权了吗?并解析数组中的每个String并将它们分类为数字或运算符?从我的快速看,它至少似乎这样做。
所以看起来你需要的只是你的行在一个String数组中,然后传递给你已经拥有的代码。无论如何,从我所看到的。
显然,这并没有解决数字大于9的问题,但希望它有助于上半年。
: - )
答案 2 :(得分:0)
public void actionPerformed(ActionEvent e) {
double sum=0;
int count = 0 ;
try {
String nomFichier = "Fichier.txt";
FileReader fr = new FileReader(nomFichier);
BufferedReader br = new BufferedReader(fr);
String ligneLue;
do {
ligneLue = br.readLine();
if(ligneLue != null) {
StringTokenizer st = new StringTokenizer(ligneLue, ";");
String nom = st.nextToken();
String prenom = st.nextToken();
String age = st.nextToken();
String tele = st.nextToken();
String adress = st.nextToken();
String codePostal = st.nextToken();
String ville = st.nextToken();
String paye = st.nextToken();
double note = Double.parseDouble(st.nextToken());
count++;
}
}
while(ligneLue != null);
br.close();
double mediane = count / 2;
if(mediane % 2 == 0) {
JOptionPane.showMessageDialog(null, "Le mediane dans le fichier est " + mediane);
}
else {
mediane +=1;
JOptionPane.showMessageDialog(null, "Le mediane dans le fichier est " + mediane);
}
}//fin try
catch(FileNotFoundException ex) {
System.out.println(ex.getMessage());
}
catch(IOException ex) {
System.out.println(ex.getMessage());
}
}