2012-11-17 18 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)。 –

相關問題