从文件读入时如何使用字符串标记器?

我正在用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
七十六分之二十○/ 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逐行工作? 我对我想要遵循的算法感到非常困惑。

由于您的问题现在已完全从其原始版本更改 – 这是对原始版本的响应,这是如何使用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的数字问题,但希望它有助于上半年。

🙂

因为所有运算符都是单个字符,所以可以指示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); } }