StringTokenizer在JAVA中拆分字符串是否更有效?
我一直在解决SPOJ的一个问题 首先,我尝试使用string的StringTokenizer在JAVA中拆分字符串是否更有效?,java,string,split,stringtokenizer,Java,String,Split,Stringtokenizer,我一直在解决SPOJ的一个问题 首先,我尝试使用string的split方法拆分输入字符串,提交后得到了TLE 我的代码使用split方法 import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.regex.Pattern; import java.util.regex.Matcher; class ABSYS { pub
split
方法拆分输入字符串,提交后得到了TLE
我的代码使用split方法
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class ABSYS {
public static void main(String[] args) throws IOException {
int t;
String[] numArray = new String[2];
String[] numArray2 = new String[2];
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
t = Integer.parseInt(reader.readLine());
while(t > 0) {
String input = reader.readLine();
if(input.isEmpty()) {
continue;
}
numArray = input.split("\\s{1}=\\s{1}");
numArray2 = numArray[0].split("\\s{1}\\+\\s{1}");
Pattern pattern = Pattern.compile("machula");
Matcher matcher = pattern.matcher(numArray[1]);
if(matcher.find()) {
System.out.println(numArray[0] + " = " + (Integer.parseInt(numArray2[0]) + Integer.parseInt(numArray2[1])));
}
else {
matcher = pattern.matcher(numArray2[0]);
if(matcher.find()) {
System.out.println((Integer.parseInt(numArray[1]) - Integer.parseInt(numArray2[1])) + " + " + numArray2[1] + " = " + numArray[1]);
}
else {
System.out.println(numArray2[0] + " + " + (Integer.parseInt(numArray[1]) - Integer.parseInt(numArray2[0])) + " = " + numArray[1]);
}
}
t--;
}
}
}
在多次尝试之后,我失败了,无法使我的代码更加高效
然后,今天我读了关于StringTokenizer
,并在我的代码中使用了它,我就在那里得到了它(在spoj上)
我的代码使用StringTokenizer
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.regex.Pattern;
import java.util.StringTokenizer;
class ABSYS {
public static void main(String[] args) throws IOException {
int t, a = 0, b = 0, c = 0, matchula = 0;
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
Pattern pattern = Pattern.compile("^(\\d)+$");
t = Integer.parseInt(reader.readLine());
while(t > 0) {
String input = reader.readLine();
if(input.isEmpty()) {
continue;
}
StringTokenizer tokenizer = new StringTokenizer(input);
String token = tokenizer.nextToken();
if(pattern.matcher(token).matches()) {
a = Integer.parseInt(token);
}
else
matchula = 1;
tokenizer.nextToken();
token = tokenizer.nextToken();
if(pattern.matcher(token).matches()) {
System.out.println("b = " + token);
b = Integer.parseInt(token);
}
else
matchula = 2;
tokenizer.nextToken();
token = tokenizer.nextToken();
if(pattern.matcher(token).matches()) {
c = Integer.parseInt(token);
}
else
matchula = 3;
switch(matchula) {
case 1: System.out.println((c-b) + " + " + b + " = " + c);
break;
case 2: System.out.println(a + " + " + (c-a) + " = " + c);
break;
case 3: System.out.println(a + " + " + b + " = " + (a+b));
break;
}
t--;
}
}
}
在JAVA文档中,他们不鼓励使用StringTokenizer
StringTokenizer是一个遗留类,尽管新代码中不鼓励使用它,但出于兼容性原因保留它。建议任何寻求此功能的人改用String的split方法或java.util.regex包
如回答中所述
如果我想用比单个字符更复杂的逻辑对字符串进行标记(例如,在\r\n上拆分),我不能使用StringTokenizer,但可以使用string.split()
我的怀疑
StringTokenizer
的原因是什么StringTokenizer
比String.split()
好吗查看此问题的答案以了解更多详细信息虽然从技术上讲,
StringTokenizer
比String.split()
更快,但当您将范围缩小到单字符分隔符时,它们的性能几乎相同
查看
String.split()
源代码,它会检查regex模式是否是简单的分隔符,如果是,它会执行老式的while循环来搜索字符串。在我做的一个简单测试中,我发现使用单个char
解析字符串的时间几乎没有差别。这是StringTokenizer
的典型用例。因此,对于如此微小的性能提升来说,真的不值得所有额外的代码。你所说的“StringTokenizer
早于Java对正则表达式的支持,而String.split()支持正则表达式”是什么意思?我的意思是,StringTokenizer来自一个时代(Java 1.0)在此之前,Java为正则表达式提供了标准库,因此它不支持正则表达式,而String.split()支持正则表达式。