簡體   English   中英

StringTokenizer在JAVA中拆分字符串是否更有效?

[英]Is StringTokenizer more efficient in splitting strings in JAVA?

我一直在解決SPOJ的反印跡系統問題

首先,我嘗試使用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所述,請在此處回答

如果我想用比單個字符更復雜的邏輯來標記字符串(例如,在\\ r \\ n上分割),則不能使用StringTokenizer,但可以使用String.split()。

我的懷疑

  1. 為什么會這樣,即使我發現它更省時。
  2. 不鼓勵使用StringTokenizer的原因是什么?
  3. 如果有人想像我的問題一樣使用簡單的正則表達式,那StringTokenizerString.split()好嗎?

String.split()比StringTokenizer更靈活,更易於使用。 StringTokenizer早於Java對正則表達式的支持,而String.split()支持正則表達式,這使它比StringTokenizer強大得多。 同樣,String.split的結果是一個字符串數組,通常這是我們想要我們的結果的方式。 StringTokenizer確實比String.split()快,但對於大多數實際目的而言,String.split()足夠快。

檢查此問題的答案以獲取更多詳細信息掃描程序與StringTokenizer與String.Split

從技術上講,總體而言, StringTokenizerString.split()快,但將范圍縮小到單個字符定界符時,它們的性能幾乎相同。

查看String.split()源代碼表明它檢查了regex模式是否是一個簡單的定界符,如果是,則執行老式的while循環來搜索String 在簡單的測試中,使用單個char解析字符串時,我發現時間幾乎沒有區別。 這是StringTokenizer的典型用例。 因此,對於這么小的性能提升,確實不值得所有額外的代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM