κ°μ π
μκ³ λ¦¬μ¦μ νλ€λ³΄λ©΄, νμ°μ μΌλ‘ μ λ ₯κ° μ²λ¦¬λ₯Ό νκ²λλ€. λ€μν μΌμ΄μ€μ λμνκΈ° μν΄, μ¬μ©μμ κ°μ μ§μ μ λ ₯λ°μ μ΄λ₯Ό μ²λ¦¬νκ² λλ€. μ΄ λ, μ°λ¦¬λ μμ€νꡬ μ΄μ κ°μ μν©μ΄ λ°μνλ€. λ°μ΄ν°μ μ 보λ΄κΈ° μν΄ λ°μ΄ν°μ λͺ¨μμ ꡬλΆμ(곡백 νΉμ μΌν)λ₯Ό ν΅ν΄ νλμ λ¬Έμμ΄λ‘ ν©μ³ μ λ¬νλ€.
μ΄λ₯Όν
λ©΄, μμ κ°μ΄ μ κ°μ λ°°μ΄μ μ λ¬νκΈ° μν΄, κ° μμλ₯Ό 곡백μΌλ‘ ꡬλΆνμ¬ μ κ°μ΄ μ λ¬νκ² λλ€. λ³΄ν΅ λ΄ κ²½μ° split
λ©μλλ₯Ό νμ©νλλ°, μκ³ λ¦¬μ¦ νμ΄λ₯Ό μ°Ύμ보λ€λ³΄λ StringTokenizer
μ΄λΌλ classλ₯Ό μ°λ μ½λλ€μ΄ λλ¬μμλ€. μ²μ보λ classμΈλ°λ€, μ κ·Όμ±μ΄ ν¨μ¬ λ°μ΄λ split
λ₯Ό κ΅³μ΄ λ체ν΄μ μ°λ μ΄μ κ° μμκ±°λΌ νλ¨. μ§μ νΌν¬λ¨Όμ€λ₯Ό λΉκ΅ν΄λ³΄κΈ°λ‘ νλ€. μκ³ λ¦¬μ¦μ μνμλ μμ μ€μν μ§νλ‘ μμ©νκΈ° λλ¬Έμ, μ‘°κΈμ΄λΌλ μκ°μ μ€μΌ νμκ° μλ€. μνκΉκ²λ λλ μ½λ μ΅μ ν μ€λ ₯μ΄ μ΅μ
μ΄λΌ, μ΄λ°μμΌλ‘ μ€μΌ μ μλ μμν λΆλΆμ μ€μ¬μΌνλ€. ν΅μ¬ μ½λλ₯Ό μ΅μ νν μκ°μ μ νκ³ μ΄λ°λ°μ μκ°μ λ¨μΆνλκ² κΌ λ€μ΄μ΄νΈνλ΅μκ³ νΌμ λ¨ΉμΌλ©΄μ μ λ‘μ½λΌ λ§μλ λλμ΄κΈ΄ νλ, StringTokenizer
μ΄ λ μ±λ₯μ΄ λ°μ΄λλ€λ©΄ μμΌλ‘ νΈλ μκ³ λ¦¬μ¦μ μ μ©ν κ°μΉκ° μμ κ²μ΄λ€.
ν μ€νΈ νκ²½ π
split λ©μλ π
split
λ©μλλ νΉμ ꡬλΆμλ‘ λ¬Έμμ΄μ λΆλ¦¬νλ μ ν΅μ μΈ λ©μλλ€. κ΅³μ΄ JAVAκ° μλλλΌλ C(++, #), JavaScript, Python λ± μ¬λ¬ μΈμ΄μ μ‘΄μ¬νλ ν€μλλΌ μ΄λ€ μΈμ΄λ λ¬Έμμ΄μ ꡬλΆν λ μ μΌ λ¨Όμ μλνλ λ°©λ²μ΄λ€.
JAVAμ split
μ λ¬Έμμ΄ λ°μ΄ν° νμμΈ String
classμ ν¬ν¨λ λ©μλλ€. λ¬Έμμ΄ λ°μ΄ν°λΌλ©΄ split
λ₯Ό νΈμΆνμ¬ λ¬Έμμ΄μ ꡬλΆν μ μλ€. λ°νκ°μ String[]
κ°μ²΄.
μ¬μ©λ²μ μλμ κ°λ€.
JAVA
0 | import java.util.Arrays; |
1 | |
2 | /** |
3 | * λ©μΈ ν΄λμ€ |
4 | * |
5 | * @author RWB |
6 | * @since 2021.06.13 Sun 22:50:57 |
7 | */ |
8 | public class Main |
9 | { |
10 | /** |
11 | * λ©μΈ ν¨μ |
12 | * |
13 | * @param args: [String[]] λ§€κ°λ³μ |
14 | */ |
15 | public static void main(String[] args) |
16 | { |
17 | String text = "A B C D"; |
18 | |
19 | String[] splited = text.split(" "); |
20 | |
21 | System.out.println(Arrays.toString(splited)); |
22 | } |
23 | } |
μΆλ ₯μ μλμ κ°λ€.
TC
0 | [A, B, C, D] |
λ¬Έμμ΄ A B C D
κ° κ³΅λ°±μ κΈ°μ€μΌλ‘ [A, B, C, D]
λ‘ λΆλ¦¬λκ±Έ νμΈν μ μλ€. κ·Έ λ°μ ν κ°μ§ νΉμ΄ν μ μ΄ μλλ°, JAVAμ split
λ©μλλ ꡬλΆμμ μ κ·μμ μ μ©ν μ μλ€. μ΄λ₯Ό μλ§ μ΄μ©νλ©΄ 볡ν©μ μΈ κ΅¬λΆμλ₯Ό μ¬μ©ν μλ μλ€.
StringTokenizer π
μ΄ ν¬μ€ν
μ μ°κ² λ§λ μ§μ μ μΈ μμΈ. StringTokenizer
μμ λ¬Έμμ΄μ ꡬλΆνλλ° νΉνλ classμ μΌμ’
μ΄λ€. String[]
μ λ°ννλ split
κ³Ό λ¬λ¦¬ κ·Έ μμ²΄λ‘ νλμ κ°λ³μ μΈ classλΌλ μ°¨μ΄κ° μλ€.
StringTokenizer tokenizer = new StringTokenizer("λ¬Έμμ΄");
κ³Ό κ°μ ννλ‘ μ΄κΈ°νν΄μ μ¬μ©νλ€. StringTokenizer
μΈμ€ν΄μ€λ₯Ό μ¬μ©νλλ° μμλλ©΄ μ’μλ²ν λ©μλλ μλμ κ°λ€.
λ©μλ | λ°νκ° | λ΄μ© |
---|---|---|
countToken | int | ν ν°μ κ°―μ |
nextToken | String | λ€μ ν ν° |
hasMoreTokens | boolean | λ€μ ν ν°μ μ‘΄μ¬ μ 무 |
StringTokenizer tokenizer = new StringTokenizer("λ¬Έμμ΄", "ꡬλΆμ");
μ κ°μ΄ μμ±μμ μΈμμ ꡬλΆμλ₯Ό μΆκ°νμ¬ μνλ ꡬλΆμλ‘ κ΅¬λΆνκ² ν μλ μλ€. λ³λλ‘ μ§μ νμ§ μλλ€λ©΄ ꡬλΆμλ \t\n\r\t
λ‘, μ€λ°κΏ, 곡백, νμ ꡬλΆνλ€. μ¬κΈ°μ μ£Όμν μ μ΄ νλ μλλ°, κΈ°λ³Έ ꡬλΆμ \t\n\r\t
λ μ€λ°κΏ, 곡백, νμ μ λΆ ν¬ν¨νλ€. μ¦, A B C D\nA B C D
μ κ°μ΄ 곡백과 μ€λ°κΏμ΄ νΌμ©λμ΄ μμ κ²½μ°, 곡백과 μ€λ°κΏμ μ λΆ κ΅¬λΆνμ¬ [A, B, C, D, A, B, C, D]
μ κ°μ΄ μΆλ ₯λλ€. μμ±μμ ꡬλΆμλ₯Ό κ°μ λ‘ μ§μ ν΄μ€ κ²½μ°, μ΄λ₯Ό λ§μ μ μλ€. μ§μ μ§μ ν κ²½μ° κ³΅λ°±μ΄λ μ€λ°κΏμ΄ μλλλΌλ μ¬λ¬ λ¬Έμμ΄μ μ¬μ©ν μ μλ€.
JAVA
0 | import java.util.Arrays; |
1 | import java.util.StringTokenizer; |
2 | |
3 | /** |
4 | * λ©μΈ ν΄λμ€ |
5 | * |
6 | * @author RWB |
7 | * @since 2021.06.13 Sun 23:48:14 |
8 | */ |
9 | public class Test |
10 | { |
11 | /** |
12 | * λ©μΈ ν¨μ |
13 | * |
14 | * @param args: [String[]] λ§€κ°λ³μ |
15 | */ |
16 | public static void main(String[] args) |
17 | { |
18 | String text = "A B C D"; |
19 | |
20 | StringTokenizer tokenizer = new StringTokenizer(text); |
21 | |
22 | String[] splited = new String[tokenizer.countTokens()]; |
23 | |
24 | for (int i = 0; i < splited.length; i++) |
25 | { |
26 | splited[i] = tokenizer.nextToken(); |
27 | } |
28 | |
29 | System.out.println(Arrays.toString(splited)); |
30 | } |
31 | } |
μΆλ ₯μ λμΌνλ€.
TC
0 | [A, B, C, D] |
μλ λΉκ΅ π
κ·Έλ λ€λ©΄ split
κ³Ό StringTokenizer
μ μ±λ₯μ μ΄λ¨κΉ? μ΄λ₯Ό λΉκ΅νκΈ° μν΄ κ°λ¨ν ν
μ€νΈ νλ‘κ·Έλ¨μ λ§λ€μλ€.
- λ°λ³΅νμ
t
κ° ν λΉλλ€. - μΌμ΄μ€λ§λ€ 5 ~ 20μμ λλ€ν λ¬Έμμ΄μ μμ±νλ€. κ° λ¬Έμ μ¬μ΄μ κ³΅λ°±μ΄ ν¬ν¨λλ€.
- 곡백μ ꡬλΆμλ‘ λ¬Έμμ΄μ ꡬλΆνλ€
split
μ¬μ©StringTokenizer
μ¬μ©
- μ΄ μμ μκ° λ° νκ· μμ μκ°μ κ³μ°νλ€
- κ²°κ³Όλ₯Ό νμνλ€
μμ€λ μλμ κ°λ€.
JAVA
0 | import java.text.DecimalFormat; |
1 | import java.util.Arrays; |
2 | import java.util.Random; |
3 | import java.util.StringTokenizer; |
4 | |
5 | /** |
6 | * λ©μΈ ν΄λμ€ |
7 | * |
8 | * @author RWB |
9 | * @since 2021.06.14 Mon 00:06:32 |
10 | */ |
11 | public class Main |
12 | { |
13 | /** |
14 | * λ©μΈ ν¨μ |
15 | * |
16 | * @param args: [String[]] λ§€κ°λ³μ |
17 | */ |
18 | public static void main(String[] args) |
19 | { |
20 | int t = 10000; |
21 | |
22 | long[] timer = { 0, 0 }; |
23 | |
24 | int[] sum = { 0, 0 }; |
25 | |
26 | for (int i = 0; i < t; i++) |
27 | { |
28 | int random = (int) ((Math.random() * (20 - 5)) + 5); |
29 | |
30 | String text = getTestString(random); |
31 | |
32 | // split λ‘μ§ ---------------------------------------- |
33 | long timeStart = System.nanoTime(); |
34 | |
35 | String[] a1 = useSplit(text); |
36 | |
37 | long timeEnd = System.nanoTime() - timeStart; |
38 | |
39 | sum[0] += a1.length; |
40 | |
41 | timer[0] += timeEnd; |
42 | |
43 | System.out.println(Arrays.toString(a1) + ": " + addComma(timeEnd) + "ns"); |
44 | // split λ‘μ§ ---------------------------------------- |
45 | |
46 | // StringTokenizer λ‘μ§ ---------------------------------------- |
47 | timeStart = System.nanoTime(); |
48 | |
49 | String[] a2 = useStringTokenizer(text); |
50 | |
51 | timeEnd = System.nanoTime() - timeStart; |
52 | |
53 | sum[1] += a2.length; |
54 | |
55 | timer[1] += timeEnd; |
56 | |
57 | System.out.println(Arrays.toString(a2) + ": " + addComma(timeEnd) + "ns"); |
58 | // StringTokenizer λ‘μ§ ---------------------------------------- |
59 | } |
60 | |
61 | System.out.println(addComma(t) + "κ° λ°μ΄ν° κ·Έλ£Ή μν"); |
62 | |
63 | System.out.println(); |
64 | |
65 | System.out.println("split κ²°κ³Ό"); |
66 | System.out.println(" * μ΄ μμ: " + addComma(timer[0]) + "ns"); |
67 | System.out.println(" * νκ· μμ: " + addComma((timer[0] / t)) + "ns"); |
68 | System.out.println(" * λΆν΄ν μμ: " + addComma(sum[0]) + "κ°"); |
69 | |
70 | System.out.println(); |
71 | |
72 | System.out.println("StringTokenizer κ²°κ³Ό"); |
73 | System.out.println(" * μ΄ μμ: " + addComma(timer[1]) + "ns"); |
74 | System.out.println(" * νκ· μμ: " + addComma((timer[1] / t)) + "ns"); |
75 | System.out.println(" * λΆν΄ν μμ: " + addComma(sum[1]) + "κ°"); |
76 | |
77 | System.out.println(); |
78 | |
79 | System.out.println("split " + (timer[0] == timer[1] ? "==" : (timer[0] > timer[1]) ? "<" : ">") + " StringTokenizer"); |
80 | } |
81 | |
82 | /** |
83 | * ꡬλΆλ λ¬Έμμ΄ λ°ν ν¨μ (split) |
84 | * |
85 | * @param text: [String] λμ λ¬Έμμ΄ |
86 | * |
87 | * @return [String[]] ꡬλΆλ λ¬Έμμ΄ |
88 | */ |
89 | private static String[] useSplit(String text) |
90 | { |
91 | return text.split(" "); |
92 | } |
93 | |
94 | /** |
95 | * ꡬλΆλ λ¬Έμμ΄ λ°ν ν¨μ (StringTokenizer) |
96 | * |
97 | * @param text: [String] λμ λ¬Έμμ΄ |
98 | * |
99 | * @return [String[]] ꡬλΆλ λ¬Έμμ΄ |
100 | */ |
101 | private static String[] useStringTokenizer(String text) |
102 | { |
103 | StringTokenizer tokenizer = new StringTokenizer(text, " "); |
104 | |
105 | int count = tokenizer.countTokens(); |
106 | |
107 | String[] result = new String[count]; |
108 | |
109 | for (int i = 0; i < count; i++) |
110 | { |
111 | result[i] = tokenizer.nextToken(); |
112 | } |
113 | |
114 | return result; |
115 | } |
116 | |
117 | /** |
118 | * 무μμ λ¬Έμμ΄ λ°ν ν¨μ |
119 | * |
120 | * @param n: [int] λ¬Έμ κ°―μ |
121 | * |
122 | * @return [String] 무μμ λ¬Έμ |
123 | */ |
124 | private static String getTestString(int n) |
125 | { |
126 | Random random = new Random(); |
127 | |
128 | StringBuilder builder = new StringBuilder(); |
129 | |
130 | for (int i = 0; i < n; i++) |
131 | { |
132 | builder.append((char) ((random.nextInt(26)) + 97)).append(" "); |
133 | } |
134 | |
135 | return builder.toString().trim(); |
136 | } |
137 | |
138 | /** |
139 | * 1000 λ¨μ κ΅¬λΆ μ«μ λ°ν ν¨μ |
140 | * |
141 | * @param num: [long] λμ μ«μ |
142 | * |
143 | * @return [String] 1000 λ¨μ κ΅¬λΆ μ«μ |
144 | */ |
145 | private static String addComma(long num) |
146 | { |
147 | DecimalFormat format = new DecimalFormat(",###"); |
148 | |
149 | return format.format(num); |
150 | } |
151 | } |
νμλ³λ‘ 10λ²μ© λλ¦° κ²°κ³Όλ₯Ό μλμ νλ‘ μ 리νλ€.
ν μ€νΈ νμ | split μ΄ μμ | StringTokenizer μ΄ μμ | μλ |
---|---|---|---|
1 | 80.3us | 44.8us | split < StringTokenizer |
2 | 83.7us | 46.2us | split < StringTokenizer |
3 | 136.6us | 31.8us | split < StringTokenizer |
4 | 111.3us | 40.4us | split < StringTokenizer |
5 | 93.4us | 32.2us | split < StringTokenizer |
6 | 104.5us | 28.7us | split < StringTokenizer |
7 | 40.1us | 42.7us | split > StringTokenizer |
8 | 40.1us | 42.7us | split > StringTokenizer |
9 | 104.7us | 28.3us | split < StringTokenizer |
10 | 38.3us | 29.2us | split < StringTokenizer |
ν λ²λ§ λ°λ³΅ν κ²½μ°, 8:2λ‘ StringTokenizer
μ΄ μμΉνλ€.
ν μ€νΈ νμ | split μ΄ μμ | StringTokenizer μ΄ μμ | μλ |
---|---|---|---|
1 | 1.12ms | 0.602ms | split < StringTokenizer |
2 | 1.11ms | 0.612ms | split < StringTokenizer |
3 | 1.06ms | 0.562ms | split < StringTokenizer |
4 | 1.02ms | 0.595ms | split < StringTokenizer |
5 | 1.ms | 0.550ms | split < StringTokenizer |
6 | 1.16ms | 0.651ms | split < StringTokenizer |
7 | 98ms | 0.558ms | split < StringTokenizer |
8 | 1.11ms | 0.627ms | split < StringTokenizer |
9 | 0.981ms | 0.555ms | split < StringTokenizer |
10 | 1.23ms | 0.666ms | split < StringTokenizer |
100λ²μ λ°λ³΅ν λ μμ 10:0μΌλ‘ StringTokenizer
μ΄ μμΉνλ€.
ν μ€νΈ νμ | split μ΄ μμ | StringTokenizer μ΄ μμ | μλ |
---|---|---|---|
1 | 3.00ms | 3.17ms | split > StringTokenizer |
2 | 2.53ms | 2.71ms | split > StringTokenizer |
3 | 2.79ms | 2.84ms | split > StringTokenizer |
4 | 2.53ms | 2.67ms | split > StringTokenizer |
5 | 2.67ms | 2.97ms | split > StringTokenizer |
6 | 2.58ms | 2.87ms | split > StringTokenizer |
7 | 2.48ms | 2.65ms | split > StringTokenizer |
8 | 2.69ms | 3.01ms | split > StringTokenizer |
9 | 2.50ms | 2.90ms | split > StringTokenizer |
10 | 2.62ms | 2.94ms | split > StringTokenizer |
, μ²λΌ λμ΄κ°λ€κ° λ¬κΈμμ΄ 1000μ λ£μ μ΄μ λ, μ΄μνκ² μΌ λ split
μ΄ μμΉνλ€.
ν μ€νΈ νμ | split μ΄ μμ | StringTokenizer μ΄ μμ | μλ |
---|---|---|---|
1 | 9.91ms | 9.27ms | split < StringTokenizer |
2 | 9.49ms | 9.19ms | split < StringTokenizer |
3 | 9.02ms | 8.61ms | split < StringTokenizer |
4 | 9.95ms | 9.25ms | split < StringTokenizer |
5 | 9.03ms | 8.87ms | split < StringTokenizer |
6 | 8.83ms | 9.08ms | split > StringTokenizer |
7 | 9.14ms | 8.68ms | split < StringTokenizer |
8 | 9.28ms | 9.07ms | split < StringTokenizer |
9 | 9.49ms | 9.66ms | split > StringTokenizer |
10 | 11.79ms | 11.20ms | split < StringTokenizer |
λ€μ 8:2λ‘ StringTokenizer
μ΄ μμΉνλ€.
ν μ€νΈ νμ | split μ΄ μμ | StringTokenizer μ΄ μμ | μλ |
---|---|---|---|
1 | 306.86ms | 373.06ms | split > StringTokenizer |
2 | 287.26ms | 262.05ms | split < StringTokenizer |
3 | 289.92ms | 255.51ms | split < StringTokenizer |
4 | 272.43ms | 267.96ms | split < StringTokenizer |
5 | 278.35ms | 322.28ms | split > StringTokenizer |
6 | 285.23ms | 264.57ms | split < StringTokenizer |
7 | 273.37ms | 268.18ms | split < StringTokenizer |
8 | 278.65ms | 264.34ms | split < StringTokenizer |
9 | 278.56ms | 266.62ms | split < StringTokenizer |
10 | 306.00ms | 256.56ms | split < StringTokenizer |
8:2λ‘ StringTokenizer
μ΄ μμΉνλ€.
μ΄λΌλ νΉμν μν©μ μ μΈνκ³ λ 보νΈμ μΌλ‘ StringTokenizer
κ° μ±λ₯μ΄ λ μ°μνλ€. μ λ° νμμ΄ μ λ°μνλμ§ μ΄ν΄λ μ μ λλ€. λ¬Όλ‘ ν΅κ³λΌλκ² μ«μκ° ν΄ μλ‘ μλ―Έκ° μ»€μ§λ―λ‘ 10λ²μ΄λΌλ μμ νμλ§μΌλ‘ λ¨μ μ§κΈ΄ μ΄λ ΅λ€.
νμ¬ μ»΄ν¨ν°(AMD Ryzen 2700X)μμλ λͺ¨λ μΌμ΄μ€μμ StringTokenizer
μ μλκ° λΉ¨λλ€. CPUμ λ°λΌ μ°μ° κ²°κ³Όλ λ°©μμ μ‘°κΈμ© μ°¨μ΄κ° μμ μ μκ² λ€.
JAVA APIμ μνλ©΄, StringTokenizer
μ νμ νΈνμ±μ 보μ₯νκΈ° μν λ κ±°μ ν΄λμ€λΌκ³ νλ€. JAVA APIλ κ°κΈμ StringTokenizer
λ³΄λ€ split
λ΄μ§λ regex
ν¨ν€μ§λ₯Ό νμ©νλλ‘ κΆκ³ νκ³ μλ€.
μλ¬Έ
StringTokenizer
is a legacy class that is retained for compatibility reasons although its use is discouraged in new code. It is recommended that anyone seeking this functionality use thesplit
method of String or thejava.util.regex
package instead.
κ²°λ‘ π
νμ μμΉ μ StringTokenizer
κ° split
μ λΉν΄ μ΅λ μ½ 20% μ λ λ λΉ λ₯΄λ€. νμ§λ§ JAVA APIμμ κ°κΈμ λ€λ₯Έ λ체μ λ₯Ό μ¬μ©νλλ‘ κΆκ³ νκ³ μκ³ , λ°±λ§λ²μ μ°μ°μλ λ¨μμμ μμ§μΈλ€. μλμ μΌλ‘ μ°¨μ΄κ° μμ΄λ κ°κ΄μ μΈ μ§νλ‘ λ΄€μλ λ³λ€λ₯Έ μ°¨μ΄κ° μλ μ
. λ¬Έμμ΄ λΆλ¦¬νμκ³ μλ‘μ΄ classλ₯Ό λ€λ£° λ°μ κ·Έλ₯ λ¬Έμμ΄ μ체λ₯Ό λ€λ£¨λ split
μ μ¬μ©νλ κ² λ ν¨μ¨μ μ΄λΌ μκ°νλ€.
π μμ±μΌ
2021-06-14 Mon 01:56:01
π μΉ΄ν κ³ λ¦¬
π·οΈ νκ·Έ