StringTokenizer在JAVA中分割字符串的效率更高吗?

时间:2015-06-11 12:45:31

标签: java string split stringtokenizer

我一直在从SPOJ解决问题Anti-Blot System

首先,我尝试使用String' split方法分割输入字符串,并在提交后获得TLE

我的代码使用拆分方法

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 Docs中,他们不鼓励使用StringTokenizer。

  

StringTokenizer是一个遗留类,出于兼容性原因而保留,尽管在新代码中不鼓励使用它。建议任何寻求此功能的人都使用String的split方法或java.util.regex包。

正如Jason S回答here

中所述
  

如果我想标记一个逻辑比单个字符更复杂的字符串(例如,在\ r \ n上拆分),我就不能使用StringTokenizer但我可以使用String.split()。

我的怀疑

  1. 为什么会这样,即使我发现它更有时间效率。
  2. 阻止使用StringTokenizer
  3. 的原因是什么?
  4. 如果想要像我的问题一样使用简单的正则表达式,那么StringTokenizerString.split()好吗?

2 个答案:

答案 0 :(得分:3)

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

查看此问题的答案,了解更多详情Scanner vs. StringTokenizer vs. String.Split

答案 1 :(得分:2)

虽然技术上确实如此,StringTokenizer总体上比String.split()快,但当您将范围缩小到单字符分隔符时,它们在性能方面几乎相同。

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