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()() | 현재 스트림 토큰의 문자열 표현과 그것이 발생하는 줄 번호를 반환한다. |