use*_*111 6 java string parsing split stringtokenizer
为了这个问题,让我们假设我有一个String包含值Two;.Three;.Four(等等),但元素是分开的;..
现在我知道有多种方法可以分割字符串,例如split()和StringTokenizer(更快的一个并且运行良好),但我的输入文件大约是1GB,我正在寻找比它更有效的东西StringTokenizer.
经过一些研究,我发现indexOf并且substring非常有效,但这些示例只有单个分隔符,或者结果只返回一个单词/元素.
示例代码使用indexOf和substring:
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);
Run Code Online (Sandbox Code Playgroud)
上面的工作用于打印,brown但我如何使用indexOf和substring分割具有多个分隔符的行并显示如下所有项目.
预期产出
Two
Three
Four
....and so on
Run Code Online (Sandbox Code Playgroud)
这是我用于分割大型(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;
}
Run Code Online (Sandbox Code Playgroud)
如果您想要最终的效率,我根本不会使用Strings,更不用说拆分它们了。我会做编译器所做的事情:一次处理一个字符。使用BufferedReader具有大缓冲区大小的 a,例如 128kb,并一次读取 a char,将它们累加到 a 中,StringBuilder直到您获得 a;或行终止符。
StringTokenizer比 更快StringBuilder。
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());
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5718 次 |
| 最近记录: |