【问题标题】:Most efficient way of splitting String in Java在Java中拆分字符串的最有效方法
【发布时间】:2015-05-29 20:07:51
【问题描述】:

为了这个问题,假设我有一个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

【问题讨论】:

  • 你想达到什么目的?你做过各种测试用例的测试,看看哪个“高效”吗?
  • 还有一个indexOf 重载需要String...
  • 你的意思是string.replaceAll(";\\.", "\n");
  • @BuhakeSindi 是的,我已经完成了测试。对于我的机器上使用 StringTokenizer 的示例字符串需要 8.0 us,split() 需要 23 us
  • 只是循环,indexOf() 需要一个开始参数,它应该是最后找到的索引。

标签: java string parsing split stringtokenizer


【解决方案1】:

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

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;
}

【讨论】:

  • 您可以通过一次获取所有索引来进一步改进这一点,因为 indexOf 循环遍历字符串
  • @Sport 在循环内部,我在前一次出现的索引 (line.indexOf(delimiter, i)) 之后开始每次搜索,因此每个字符只检查一次。我可能会编写 indexOf(char, int) 的内联版本以避免重复方法调用的开销。
【解决方案2】:

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

【讨论】:

  • 好的,我会试一试并报告。谢谢
  • @AvinashRaj 您的评论与我的回答无关。不要在这里发布不相关的 cmets。
  • @AvinashRaj 这与我的回答比您之前的评论没有任何关系。
【解决方案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());
    }
}

【讨论】:

  • 根据JDK DocsStringTokenizer 现在被认为是一个传统类有一段时间了。建议使用String.splitjava.util.regex 包中的内容。
猜你喜欢
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 1970-01-01
  • 2016-03-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多