자바 stringtokenizer해결책 구해요
조회수 2616회
StringTokenizer st; for (int k = 0; k < sentence.length; k++) { System.out.print(sentence[k]); st = new StringTokenizer(sentence[k], " ");
for (int i = 0; i < cnt_line; i++) {
op[i] = st.nextToken();
for (int j = 0; j < 2; j++) {
n[i][j] = Integer.parseInt(st.nextToken());
if (j == 1)
System.out.println(": " + Calc(n[i][0], n[i][1], op[i]));
}
}
}
stringtokenizer에 반복문으로 sentence 배열에 있는 문장들을 다시 대입시키고있는데 k가 0일때 이후로는 에러가 아래와 같이 뜹니다.
Exception in thread "main" java.util.NoSuchElementException at java.util.StringTokenizer.nextToken(StringTokenizer.java:349) at prac.practice.main(practice.java:47)
센텐스를 가르키고있는 포인터가 다시 맨앞으로 가지 않는것인가요? 해결책을 구합니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
3 답변
-
코드 전체가 있는게 아니라서 작성자분의 의도를 파악하긴 어렵지만 nextToken에서 에러가 나는 것이라면 hasMoreTokens()을 이용하시는 게 좋을 듯 싶습니다.
StringTokenizer st; for (int k = 0; k < sentence.length; k++) { System.out.print(sentence[k]); st = new StringTokenizer(sentence[k], " ");
여기에서는 k가 갈 때마다 st를 덮어쓰는 형식이 될텐데 이렇게 짜신 의도를 모르겠습니다.
-
package prac;
import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.util.ArrayList; import java.util.Collections; import java.util.StringTokenizer;
public class practice { static FileReader reader;
public static void main(String args[]) throws Exception { try { reader = new FileReader("input.txt"); } catch (FileNotFoundException e) { System.out.println("파일을 열 수 없습니다."); System.exit(1); } BufferedReader rd = new BufferedReader(reader); int cnt_line = 0;// 파일의 행 수 String line = null;// 파일로 부터 읽어들인 조각들을 저장하는것 while ((line = rd.readLine()) != null) {// 한줄씩 읽는다 cnt_line++; } rd.close(); String sentence[] = new String[cnt_line];// 라인들을 연결해서 하나의 문장으로 만드는것 reader = new FileReader("input.txt"); BufferedReader rd2 = new BufferedReader(reader); int a = 0; while ((line = rd2.readLine()) != null) {// 한줄씩 읽는다 System.out.println(line); sentence[a++] = line; } rd2.close(); String op[] = new String[cnt_line];// 연산자를 행별로 담음 int n[][] = new int[cnt_line][2]; StringTokenizer st; for (int k = 0; k < sentence.length; k++) { System.out.print(sentence[k]); st = new StringTokenizer(sentence[k], " "); for (int i = 0; i < cnt_line; i++) { op[i] = st.nextToken(); for (int j = 0; j < 2; j++) { n[i][j] = Integer.parseInt(st.nextToken()); if (j == 1) System.out.println(": " + Calc(n[i][0], n[i][1], op[i])); } } } } static int Calc(int a, int b, String op) { int result = 0; switch (op) { case "ADD": result = a + b; break; case "SUB": result = a - b; break; case "MUL": result = a * b; break; case "DIV": result = a / b; break; default: result = 923; break; } return result; }
}
-
(•́ ✖ •̀)
알 수 없는 사용자
-
-
input.txt 에 무슨 정보가 들어 갔는 지는 모르겠지만, sentence[k] 를 인자로 스트링 토크나이저를 만드 셨는데 int i = 0; i < cnt_line; i++ 를 for문의 조건으로 해 버리시면 input.txt의 모든 줄이 스트링토큰나이저를 했을 때 토큰의 개수가 input 줄의 개수랑 똑같아야 하는 좀 이상한 코드가 됩니다. for 문 대신에 while문을 사용하여 hasMoreToken()을 사용하는 것이 더 적당해 보입니다.
- 그 부분에 대해서는 while ((line = rd.readLine()) != null) {// 한줄씩 읽는다 cnt_line++; } 알 수 없는 사용자 2018.12.3 16:50
- 이 부분으로 해결해서 자동으로 똑같아지게 됩니다. 문제인 부분은 op[i] = st.nextToken() 이부분 같습니다. 알 수 없는 사용자 2018.12.3 16:50
- 아 제 말은 op[i] = st.nextToken() 라는 코드가 for문 안에 있잖아요?? 그렇기 때문에 토큰의 개수가 input의 줄의 개수 이상은 항상 있어야 하는 코드라는 말이였습니다. JakeOne IM 2018.12.3 16:52
댓글 입력