hahn

[JAVA] StringTokenizer 본문

개발 공부/JAVA

[JAVA] StringTokenizer

hahn 2021. 9. 17. 12:34
728x90
반응형

문제 상황


스택 구현하다가 시간제한 때문에

 

Scanner에서 BufferedReader로 교체하려 하는데

 

push 1

push 2

 

이런 식으로 입력이 들어올 때가 문제였다.

 

top

size

empty

pop

pop

pop

size

empty

pop

 

다른 입력은 이렇게 들어와서 String.split으로 쪼개기에는 곤란했다.

 

그래서 StringTokenizer라는 클래스를 발견했다.


StringTokenizer 속 method

 

constructor / method 설명
StringTokenizer(String str,
String delim)
delim을 구분자로 하여 str을 나누어
StringTokenizer을 생성한다.
StringTokenizer(String str,
String delim, boolean returnDelims)
delim도 토큰으로 StringTokenizer을 생성한다.
countTokens() 토큰의 수를 int로 반환
hasMoreElements()
/
hasMoreTokens()
토큰 소지 여부를 boolean으로 반환
nextToken()
/
nextElement()
토큰을 한 개 씩 String(Object)로 반환하고
읽은 토큰은 제거된다.

StringTokenizer 예제

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

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 commandCount = Integer.parseInt(br.readLine()),
			point = -1;
		
		StringTokenizer st;
		
		List<Integer> arr = new ArrayList<Integer>();
		
		for(int i = 0; i < commandCount; i++) {
			
			st = new StringTokenizer(br.readLine(), " ");
			
			switch(st.nextToken()) {
			
			case "push":
			
				point++;
				arr.add(Integer.parseInt(st.nextToken()));
				break;
				
			case "pop":
				
				if(point == -1) {
					
					bw.write(String.valueOf(-1));
					bw.newLine();
					
				}else {
					
					bw.write(String.valueOf(arr.remove(point)));
					point--;
					bw.newLine();
					
				}
				
				break;
				
			case "size":
				
				bw.write(String.valueOf(point + 1));
				bw.newLine();
				break;
				
			case "empty":
				
				if(arr.isEmpty()) {
					
					bw.write(String.valueOf(1));
					bw.newLine();
					
				}else {
					
					bw.write(String.valueOf(0));
					bw.newLine();
					
				}
				
				break;
				
			case "top":
				
				if(point == -1) {
					
					bw.write(String.valueOf(-1));
					bw.newLine();
					
				}else {
					
					bw.write(String.valueOf(arr.get(point)));
					bw.newLine();
					
				}
				
				break;
				
			}
				
			
		}
		
		bw.close();
        
    }
    
}

 

예제 설명

 

StringTokenizer st;

st = new StringTokenizer(br.readLine(), " ");

switch(st.nextToken()) {

case "push":
			
	point++;
	arr.add(Integer.parseInt(st.nextToken()));
	break;

}

 

push 1이 입력이 들어왔을 때

 

" "을 기준으로 StringTokenizer을 생성한다.

 

이후 switch문에서 nextToken()을 이용하여 push를 반환받고,

 

nextToken()을 한 번 더 이용하여 1을 반환받는다.

 

이와 같이 라인 단위로 입력을 받아오는 BufferedReader을 이용할 때

 

구분자 기준으로 쪼개지는 String의 수가 일정하지 않을 때 용이하다.

728x90
반응형