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()。

我的疑惑

  1. 为什么会这样,尽管我发现它更多的时间效率。
  2. 什么是落后鼓励使用StringTokenizer的原因是什么?
  3. 如果有什么人愿意使用简单的regex像我的问题,然后是StringTokenizerString.split()更好?

回答:

String.split()是更灵活和更容易比的StringTokenizer使用。 StringTokenizer早于Java支持正则表达式,而String.split()支持正则表达式,这使得它比StringTokenizer更强大。此外,String.split的结果是一个字符串数组,这通常是我们想要的结果。 StringTokenizer确实比String.split()更快,但对于大多数实际用途而言,String.split()足够快。

检查关于这一问题的答案,了解更多详情Scanner vs. StringTokenizer vs. String.Split

回答:

虽然技术上来说,总体而言,StringTokenizerString.split(),更快,当你缩小范围到单个字符分隔符,他们几乎是相同的。在性能方面。

看着String.split()源代码显示它检查正则表达式模式是否是一个简单的分隔符,如果是,它会执行一个老式的while循环来搜索String。在使用单个char解析字符串时,我发现几乎没有什么区别。这是StringTokenizer的典型用例。因此,如此小的性能提升实在不值得所有额外的代码。

以上是 StringTokenizer在JAVA中分割字符串更高效吗? 的全部内容, 来源链接: utcz.com/qa/261952.html

回到顶部