StringTokenizer在JAVA中分割字符串更高效吗?
我已经从SPOJStringTokenizer在JAVA中分割字符串更高效吗?
解决问题Anti-Blot System
首先,我试图用字符串的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--;
}
}
}
提交后,我得到TLE
我的很多代码后我尝试失败,无法使我的代码更具时效
然后,今天我读到StringTokenizer
在我的鳕鱼用它e和我得到了它在那里(上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或java.util.regex包的拆分方法。
如Jason S答案here
提到,如果我想与记号化更复杂的逻辑比单字符(例如,上\ r \ n个分割)的字符串,我无法使用的StringTokenizer但我可以使用String.split()。
我的疑惑
- 为什么会这样,尽管我发现它更多的时间效率。
- 什么是落后鼓励使用
StringTokenizer
的原因是什么? - 如果有什么人愿意使用简单的regex像我的问题,然后是
StringTokenizer
比String.split()
更好?
回答:
String.split()是更灵活和更容易比的StringTokenizer使用。 StringTokenizer早于Java支持正则表达式,而String.split()支持正则表达式,这使得它比StringTokenizer更强大。此外,String.split的结果是一个字符串数组,这通常是我们想要的结果。 StringTokenizer确实比String.split()更快,但对于大多数实际用途而言,String.split()足够快。
检查关于这一问题的答案,了解更多详情Scanner vs. StringTokenizer vs. String.Split
回答:
虽然技术上来说,总体而言,StringTokenizer
比String.split()
,更快,当你缩小范围到单个字符分隔符,他们几乎是相同的。在性能方面。
看着String.split()
源代码显示它检查正则表达式模式是否是一个简单的分隔符,如果是,它会执行一个老式的while循环来搜索String
。在使用单个char
解析字符串时,我发现几乎没有什么区别。这是StringTokenizer
的典型用例。因此,如此小的性能提升实在不值得所有额外的代码。
以上是 StringTokenizer在JAVA中分割字符串更高效吗? 的全部内容, 来源链接: utcz.com/qa/261952.html