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

时间:2012-11-17 15:44:36

标签: java calculator

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

3 个答案:

答案 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());
    }               
}