StringTokenizer

Algospot에서 이 문제 (https://algospot.com/judge/problem/read/ZEROONE) 를 풀려다 보니 IO가 느려서 시간 초과가 계속 떴다.

리플들을 보니 StringTokenizer를 이용해 시간을 줄이려고 노력했다는 것을 보았는데 난 부끄럽게도 이 Class를 본 적이 없으므로 찾아보았다.

근데 IO랑 뭔 상관인지는 잘 모르겠다. 그냥 split보다 빠르게 하려고 StringTokenizer를 사용한 것 같다.

아무튼 이 글과 관련 없이 함수 별 IO 속도 차이를 보기 위해서는 여기를 참고하시라.

결론

  • StringTokenizer: 형식이 정해진 문자열을 분리할 때 사용.
  • String.split(): 형식이 정해지지 않은 문자열을 분리할 때 사용. JDK1.4에 추가되었음.

  • 속도: StringTokenizer > String.split()

    • String.split()은 내부적으로 정규표현식을 사용하기 때문에 많은 처리가 필요할 경우 심하게 느려짐.
  • 주의점

    • StringTokenizer를 사용할 경우 parsing되는 데이터가 공백이라면 부적절하다. 데이터에 뭐라도 채워져 있어야 한다.

예시로 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
String people[] = new String[] {
"Matthew, 01011111111, Male, Student",
"David, 01022222222, , Swimmer",
"Maria, 01033333333, Female, Student, "
};
for (String a : people) {
StringTokenizer st = new StringTokenizer(a, ", ");
String[] temp = a.split(", ");
System.out.println("----------");
System.out.println("** StringTokenizer");
while (st.hasMoreElements()) {
System.out.println(st.nextToken());
}
System.out.println("** String.split()");
for (String b : temp) {
System.out.println(b);
}
System.out.println("----------");
}
}
}

결과는 이렇다

David에 대한 데이터를 보면 성별 정보를 빈 칸으로 해놓으니 StringTokenizer에서는 이를 무시해버렸다.

Mariad의 마지막 데이터도 마찬가지이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
----------
** StringTokenizer
Matthew
01011111111
Male
Student
** String.split()
Matthew
01011111111
Male
Student
----------
----------
** StringTokenizer
David
01022222222
Swimmer
** String.split()
David
01022222222
Swimmer
----------
----------
** StringTokenizer
Maria
01033333333
Female
Student
** String.split()
Maria
01033333333
Female
Student
----------

참조

Share