在Java中分割String的最有效方法

时间:2015-03-25 22:31:38

标签: java string parsing split stringtokenizer

为了这个问题,让我们假设我有一个String,其中包含值Two;.Three;.Four(依此类推)但元素之间用;.分隔。

现在我知道分割字符串的方法有多种,例如split()StringTokenizer(速度更快但效果很好),但我的输入文件大约是 1GB 我正在寻找比StringTokenizer更有效率的东西。

经过一些研究,我发现indexOfsubstring非常有效,但示例只有单个分隔符,或者结果只返回一个单词/元素。

使用indexOfsubstring的示例代码:

String s = "quick,brown,fox,jumps,over,the,lazy,dog";
int from = s.indexOf(',');
int to = s.indexOf(',', from+1);
String brown = s.substring(from+1, to);

以上内容适用于打印brown,但如何使用indexOfsubstring拆分包含多个分隔符的行并显示所有项目,如下所示。

预期输出

Two
Three
Four
....and so on

3 个答案:

答案 0 :(得分:4)

如果你想要最高效率,我根本不会使用Strings,更不用说拆分它们了。我会做编译器做的事情:一次处理一个字符。使用具有较大缓冲区大小的BufferedReader,例如128kb,并一次读取char,将它们累加到StringBuilder中,直到获得;或行终止符

答案 1 :(得分:3)

StringTokenizerStringBuilder快。

public static void main(String[] args) {

    String str = "This is String , split by StringTokenizer, created by me";
    StringTokenizer st = new StringTokenizer(str);

    System.out.println("---- Split by space ------");
    while (st.hasMoreElements()) {
        System.out.println(st.nextElement());
    }

    System.out.println("---- Split by comma ',' ------");
    StringTokenizer st2 = new StringTokenizer(str, ",");

    while (st2.hasMoreElements()) {
        System.out.println(st2.nextElement());
    }
}

答案 2 :(得分:0)

这是我用于拆分大型(1GB +)制表符分隔文件的方法。它仅限于char分隔符,以避免额外方法调用的任何开销(可能由运行时优化),但它可以很容易地转换为String-delimited。如果有人能提出更快的方法或改进这种方法,我会感兴趣。

public static String[] split(final String line, final char delimiter)
{
    CharSequence[] temp = new CharSequence[(line.length() / 2) + 1];
    int wordCount = 0;
    int i = 0;
    int j = line.indexOf(delimiter, 0); // first substring

    while (j >= 0)
    {
        temp[wordCount++] = line.substring(i, j);
        i = j + 1;
        j = line.indexOf(delimiter, i); // rest of substrings
    }

    temp[wordCount++] = line.substring(i); // last substring

    String[] result = new String[wordCount];
    System.arraycopy(temp, 0, result, 0, wordCount);

    return result;
}