2012-11-17 17 views
1

我用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 

我已经实现了在程序中使用我自己的泛型Stack类,但现在我想弄清楚如何从输入文件读取数据。任何帮助赞赏。

我已经发布了我的堆栈类的源代码在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

/如何堆栈类相关阅读解析文件? –

+0

您可以逐行阅读,将不同的行放在ArrayList中。之后,对不同的表达式进行标记,解析并计算结果。你可以看到类似的(可能是一个更复杂的例子)在这里http://github.com/mgechev/elang –

+0

感谢您的帮助。 堆栈类在那里,因为我需要使用它来创建堆栈来存储计算答案而不是使用内置的java utils时的标记。 – Ph9

回答

1

你的问题现在已经完全改变了它的原始版本 - 这是针对你原来,这是如何使用的FileReader从您的文件中获取的值。

这将使每条线为一个字符串阵列的单独元件。你应该使用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

这似乎已经处理运算符优先级,不是吗?从数组中解析每个字符串并将它们排序为数字或运算符?从我的快速看,至少它似乎是这样做的。

所以它看起来像所有你需要的是你的线在一个字符串数组,然后你传递给你已经有的代码。无论如何,我都能看到。

显然这并没有解决数字大于9的问题,但希望它有助于上半场。

:-)

+0

嗨,谢谢你。结合你的代码和下面的答案,我已经设法将所有的令牌从类中取出,但在到达文件结尾时出现错误。我如何阻止这种情况发生? – Ph9

+0

你得到的错误究竟是什么? –

+0

线程“主”java.lang.NullPointerException中的异常,并且它被认为是行 StringTokenizer tokens = new StringTokenizer(st,OPERATORS,true); – Ph9

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); 
    } 
} 
+0

我的答案解决了您有关使用字符串标记器来解析方程的原始问题。请注意,这些公式使用中缀操作 - *不* RPN。如果您希望得到有意义的帮助,我会将您的问题分为多个单一问题问题。 –

+0

嗨,感谢helo David。我现在已经设法读取文件并获取令牌。现在我将如何设置优先顺序?谢谢 – Ph9

+0

@ Ph9 - 欢迎来到StackOverflow。 :)请开始一个关于运营商优先级或RPN如何工作的新问题。 SO与论坛网站的不同之处在于,每个问题都应该最终解决单一的,狭隘的,可回答的主题。我建议快速阅读[FAQ](http://stackoverflow.com/faq)。 –

相关问题