2012-11-17 2 views
1

저는 RPN 계산기를 Java로 구현하고 있습니다. 방정식을 별도의 토큰으로 구문 분석하는 클래스를 만드는 데 도움이 필요합니다.파일에서 읽을 때 문자열 토크 나이저를 사용하는 방법은 무엇입니까?

것과 비슷한 식의 알 수없는 번호가됩니다 내 입력 파일은 다음과 같습니다 :

난 이미 내 자신의 일반적인 스택 클래스는 프로그램에 사용되는,하지만 난 지금에 노력하고 구현 한
 
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

스택 클래스는 파일 읽기/파싱과 관련이 있습니까? –

+0

한 줄씩 읽을 수 있고 다른 줄을 ArrayList에 넣을 수 있습니다. 그런 다음 다른 표현식을 토큰 화 한 다음 구문 분석하고 결과를 계산하십시오. 유사하게 보일 수 있습니다 (좀 더 복잡한 예일 수도 있습니다). http://github.com/mgechev/ELang –

+0

도움을 주셔서 감사합니다. 스택 클래스는 빌트인 자바 유틸리티를 사용하는 대신 답변을 계산할 때 토큰을 저장할 스택을 생성 할 때 사용해야합니다. – Ph9

답변

1

는 원래 버전입니다 -이 파일의 값을 얻을을 FileReader를 사용하는 방법이었다 원래 하나에 대한 응답이다.

이렇게하면 각 줄을 문자열 배열의 개별 요소에 넣을 수 있습니다. 아마 훨씬 더 유연한 ArrayList를 사용해야 할 것입니다. 그러나 이것을 방금 데모로 해 보았습니다. 사용하고있는 코드가 문자열 배열을 입력 할 것으로 예상 했음에도 불구하고 원하는대로 정리할 수 있습니다. 아마도 처음에는 ArrayList에 값을 읽어 들인 다음 모든 행을 가져 와서 배열에 복사하면됩니다. 원하는만큼 많은 행을 넣을 수 있고 코드를 유연하게 유지하여 행의 수를 변경할 수 있습니다. 입력 파일.

http://www.technical-recipes.com/2011/a-mathematical-expression-parser-in-java/#more-1658

이 이미 연산자 우선 순위를 처리하지 않습니다 나타납니다 : 당신은이 링크에 코드를 사용하고 그 전에 언급

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

? 그리고 배열의 각 문자열을 파싱하고 숫자 나 연산자로 정렬하면됩니까? 나의 빠른보기에서 적어도 그것을하는 것처럼 보인다.

여러분이 필요로하는 모든 것이 문자열 배열에있는 것만 큼 이미 보이는 코드로 전달됩니다. 어쨌든 내가 볼 수있는 것.

분명히 이것은 9보다 큰 숫자의 문제를 다루지는 않지만, 전반적으로 도움이되기를 바랍니다.

:-)

+0

안녕하세요. 코드를 아래의 답변과 결합하여 모든 토큰을 클래스에서 가져 왔지만 파일의 끝에 도달하면 오류가 발생합니다. 이 일을 어떻게 멈추게합니까? – Ph9

+0

오류가 정확히 무엇입니까? –

+0

스레드 "main"의 예외 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

안녕하세요 데이빗에게 감사드립니다. 이제 파일을 읽고 토큰을 가져 왔습니다. 지금 제가 어떻게 우선 순위를 정합니까? 감사합니다 – Ph9

+0

@ Ph9 - 오신 것을 환영합니다 StackOverflow. :) 운영자 우선 순위 또는 RPN 작동 방식에 대한 새로운 질문을 시작하십시오. 그래서 각 질문은 궁극적으로 하나의 좁고 답답한 주제를 다루어야한다는 점에서 포럼 사이트와 다릅니다. 나는 [FAQ] (http://stackoverflow.com/faq)를 빨리 읽을 것을 권장한다. –

관련 문제