
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
for (int i = 0; i<n; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
bw.write(x+y+"\n");
}
bw.flush();
bw.close();
}
}
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
StreamTokenizer st = new StreamTokenizer(System.in);
StringBuilder sb = new StringBuilder();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
st.nextToken();
int n = (int)st.nval;
for(int i = 0; i < n; i++) {
st.nextToken();
int a = (int)st.nval;
st.nextToken();
int b = (int)st.nval;
sb.append(a + b).append('\n');
}
bw.write(sb.toString());
bw.flush();
bw.close();
}
}
StreamTokenizer class. The StringTokenizer methods do not distinguish among identifiers, numbers, and quoted strings, nor do they recognize and skip comments.’“지정된 문자열에 대한 StringTokenizer를 구성한다. StringTokenizer는 " \t \n \r \f"공백 문자, 탭 문자, 개행 문자, 캐리지 리턴 문자, 용지 공급 문자 등 기본 구분 기호 세트를 사용합니다. 구분 기호 문자 자체는 토큰으로 처리되지 않습니다.”라는 설명이 되어있다.
String만 넣어주면 문자열로 토큰을 생성하고 구분자는 공백으로 구분, 구분자는 토큰으로 처리되지 않는다는 말인 것 같다.
하지만 프로그래머는 코드로 말하는 법. 한번 직접 사용해보자
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
//입력
coding is very hard.but,this,is,very,funny
//출력
coding
is
very
hard.but,this,is,very,funny
설명대로 공백으로 구분하여 토큰을 잘라준 것을 볼 수 있다. 공백이 아무리 많아도 구분자는 토큰으로 처리되지 않기 때문에 구분자는 다 사라진 것도 확인할 수 있다.
그렇다면 이번에는 delim을 사용해보자
“지정된 문자열에 대한 문자열 토크나이저를 구성합니다. 인수 의 문자는 delim토큰을 구분하기 위한 구분 기호입니다. 구분 기호 문자 자체는 토큰으로 처리되지 않습니다.’”라는 설명이 있다.
delim을 통해 문자열을 구분하는 구분자를 지정해줄 수 있는 것 같다.
한번 사용해보자
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(),",");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
//입력
coding is very hard.but,this,is,very,funny
//출력
coding is very hard.but
this
is
very
funny
“,”를 구분자로 지정해주었더니 “,”를 기준으로 문자열이 잘린 것을 볼 수 있다.
그렇다면 공백과 “,”를 둘 다 구분자로 해줄 수는 없는것일까…..
이것 저것 만져보다가 드디어 찾아냈다!
문자열의 “+” 기능을 사용하면 된다!!!!👍
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," "+",");
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
//입력
coding is very hard.but,this,is,very,funny
//출력
coding
is
very
hard.but
this
is
very
funny
이건 여러모로 많이 사용할 수 있을 것 같다 ㅎㅎ
그럼 다음으로 boolean returnDelims까지 사용해보자
“플래그 returnDelims가 이면 true구분 기호 문자도 토큰으로 반환됩니다. 각 구분 기호 는 구분 기호의 단일 유니코드 코드 포인트char (1개 또는 2 개일 수 있음)로 구성된 문자열로 반환됩니다. 플래그가 인 경우 false구분 기호 문자는 건너뛰고 토큰 사이의 구분 기호로만 사용됩니다.delimis 인 경우 null이 생성자는 예외를 발생시키지 않습니다. 그러나 결과에 대해 다른 메서드를 호출하려고 StringTokenizer하면 NullPointerException이 발생합니다.”
“returnDelims- 구분 기호를 토큰으로 반환할지 여부를 나타내는 플래그입니다.”
위와 같은 설명이 있다.
그럼 코드로 말해보자
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," "+",", true);
while (st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
//입력
coding is,funny
//출력
coding
is
,
funny
위와 예제들과 같은 입력을 넣으니 출력이 너무 길어져서 조금 줄였다..
returnDelims를 true로 해주니 내가 지정한 구분자인 공백과 “,“도 함께 토큰에 들어간 것을 확인할 수 있다.
이것도 어딘가모르게 유용하게 사용할 수 있을 것만 같은 냄새가 난다…🤔
| Modifier and Type | Method | Description |
|---|---|---|
| int | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTokenizer.html#countTokens()() | 토큰의 갯수를 int 형태로 반환해준다! |
| boolean | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTokenizer.html#hasMoreElements()() | hasMoreTokens 메소드 와 동일한 값을 반환합니다 . (이거 왜 있지..) |
| boolean | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTokenizer.html#hasMoreTokens()() | 더 반환할 토큰이 있으면 true, 없으면 false를 반환한다. |
| Object | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTokenizer.html#nextElement()() | 다음 토큰을 Object 형태로 반환한다 |
| String | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTokenizer.html#nextToken()() | 다음 토큰을 반환한다. |
| String | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/util/StringTokenizer.html#nextToken(java.lang.String)(https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/String.html delim) | StringTokenizer의 문자열에서 다음 토큰을 반환합니다. |
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," "+",", true);
System.out.println(st.hasMoreTokens());
System.out.println(st.hasMoreElements());
}
//입력
kim min je
//출력
true
true
|Returns the same value as the hasMoreTokens method.
|It exists so that this class can implement the Enumeration interface.
|Returns : true if there are more tokens; false otherwise.
|See Also : Enumeration, hasMoreTokens()
public boolean hasMoreElements() {
return hasMoreTokens();
}
StreamTokenizer class takes an input stream and parses it into "tokens", allowing the tokens to be read one at a time. The parsing process is controlled by a table and a number of flags that can be set to various states. The stream tokenizer can recognize identifiers, numbers, quoted strings, and various comment styles.”과 같은 설명이 있다.StreamTokenizer는 입력 스트림을 가져와 "토큰"으로 구문 분석하여 토큰을 한 번에 하나씩 읽을 수 있도록 합니다. 구문 분석 프로세스는 테이블과 다양한 상태로 설정할 수 있는 여러 플래그에 의해 제어됩니다. 스트림 토크나이저는 식별자, 숫자, 인용 문자열 및 다양한 주석 스타일을 인식할 수 있습니다.”라고 한다.public StreamTokenizer(Reader r) {
this();
if (r == null) {
throw new NullPointerException();
}
reader = r;
}
private Reader reader = null;| Modifier and Type | Method | Description |
|---|---|---|
| double | nval | 현재 토큰이 숫자인 경우 이 필드에는 해당 숫자의 값이 포함된다 |
| String | sval | 현재 토큰이 단어 토큰인 경우 이 필드에는 단어 토큰의 문자를 제공하는 문자열이 포함된다. |
| int | ttype | 메소드 호출 후 nextToken이 필드에는 방금 읽은 토큰 유형이 포함됩니다. |
| Modifier and Type | Method | Description |
|---|---|---|
| void | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/StreamTokenizer.html#lowerCaseMode(boolean)(boolean fl) | 단어 토큰이 자동으로 소문자로 표시되는지 여부를 결정한다. |
| int | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/StreamTokenizer.html#nextToken()() | 이 토크나이저의 입력 스트림에서 다음 토큰을 구문 분석한다. |
| void | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/StreamTokenizer.html#parseNumbers()() | 이 토크나이저가 숫자를 구문 분석해야 함을 지정한다. |
| void | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/StreamTokenizer.html#whitespaceChars(int,int)(int low, int hi) | 범위의 모든 문자 low≤hi를 공백 문자로 지정한다. |
| void | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/StreamTokenizer.html#wordChars(int,int)(int low, int hi) | 범위의 모든 문자 low≤hi를 단어 구성요소로 지정합니다. |
| String | https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/io/StreamTokenizer.html#toString()() | 현재 스트림 토큰의 문자열 표현과 그것이 발생하는 줄 번호를 반환한다. |