Java 第一次出现数字时分割字符串的最有效方法是什么?
我想把它分成两部分{JamesBond | 001},{JamesBond | 002},{JamesBond | 003}Java 第一次出现数字时分割字符串的最有效方法是什么?,java,arrays,regex,list,char,Java,Arrays,Regex,List,Char,我想把它分成两部分{JamesBond | 001},{JamesBond | 002},{JamesBond | 003}(?(?类似于: JamesBond001.txt JamesBond002.txt JamesBond003.txt (?<=\D)(?=\d) String agent=“JamesBond001.txt”; int len=agent.length(); 字符串left=null,right=null; 对于(int i=0;i
(?(?类似于:
JamesBond001.txt
JamesBond002.txt
JamesBond003.txt
(?<=\D)(?=\d)
String agent=“JamesBond001.txt”;
int len=agent.length();
字符串left=null,right=null;
对于(int i=0;i
但可能您在错误的地方进行了优化。请编写清晰、简单且有效的代码,然后测量时间的实际进展情况。我敢打赌,它大部分不在应用程序的这一部分中!类似于:
(?<=\D)(?=\d)
String agent=“JamesBond001.txt”;
int len=agent.length();
字符串left=null,right=null;
对于(int i=0;i
但你可能在错误的地方进行了优化。请编写清晰、简单且有效的代码,然后衡量时间的真正走向。我敢打赌,它大部分不在你应用程序的这一部分!为了让你做出明智的决定,这里有两个相互竞争的解决方案的基准
String agent = "JamesBond001.txt";
int len = agent.length();
String left = null, right = null;
for (int i = 0; i < len; i++) {
if (Character.isDigit(agent.charAt(i))) {
left = agent.substring(0, i);
right = agent.substring(i);
break;
}
}
自定义循环将正则表达式打到了基础上,尽管我们非常小心地编译了正则表达式。为了让您做出明智的决定,这里有两个相互竞争的解决方案的基准
String agent = "JamesBond001.txt";
int len = agent.length();
String left = null, right = null;
for (int i = 0; i < len; i++) {
if (Character.isDigit(agent.charAt(i))) {
left = agent.substring(0, i);
right = agent.substring(i);
break;
}
}
自定义循环将正则表达式打到了最底层,尽管我们非常小心地编译了正则表达式。这里有一个紧凑的循环,它可以利用String.indexof
的任何特殊效率。我对它的效率感兴趣
Benchmark Mode Samples Score Error Units
o.s.Measure.loop avgt 5 96,772 ± 8,671 ns/op
o.s.Measure.regex avgt 5 3720,446 ± 1096,872 ns/op
public static int indexAnyOf(字符串of,字符串in){
对于(int i=0;i
这是一个紧凑的,可以利用String.indexof
的任何特殊效率。我对它的效率感兴趣
Benchmark Mode Samples Score Error Units
o.s.Measure.loop avgt 5 96,772 ± 8,671 ns/op
o.s.Measure.regex avgt 5 3720,446 ± 1096,872 ns/op
public static int indexAnyOf(字符串of,字符串in){
对于(int i=0;i
您尝试过的任何方法都无效吗?我将字符串拆分为一个数组,然后检查它是数字还是字符。然后将其插入数组。@Paul确实如此,但目录中有数千个文件,我想知道最有效的方法是什么。无需拆分为数组。迭代字符串并查看r一个数字?。然后用子字符串获取位。它将和其他任何东西一样快。regexp肯定会慢一些。@vks(?您尝试的任何方法都无效?我将字符串拆分为数组,然后检查它是数字还是字符。然后将其插入数组。@Paul确实如此,但目录中有数千个文件,我想知道最有效的方法是什么。无需拆分为数组。迭代字符串并查找digit?。然后使用子字符串获取位。它将和其他任何东西一样快。一个regexp肯定会慢一些。@vks(?OP需要高效。这不是最快的。有一种观点认为,这是一件不需要担心优化的事情!对于仅仅1000个文件来说,优化是没有意义的。在我的基准测试中,拆分一个长字符串(100个字符)正则表达式所需的时间不超过4µs。你永远不会注意到这一差异。OP需要高效。这不是最快的。有一个论点认为,优化这一点是错误的!对于仅1000个文件来说,优化是毫无意义的。在我的基准测试中,拆分一个长字符串(100个字符)用正则表达式计算的时间小于4µs。你永远不会注意到差异。你的速度比我的“循环”慢四倍。这可能是因为你有O(n^2)复杂度。嗯,不完全是O(n^2),但您确实要根据每个数字检查每个字符,而不是利用它们的算术分组。@MarkoTopolnik-谢谢Marko-我想知道是否有某种rep scasb
功能编译到indexOf
中,这会使它几乎O(n)
但显然不是。我也在想类似的事情:)但是rep scasb
只能从indexOf
中提取一些常量因子——它仍然需要扫描每个字符的整个“数字”字符串。如果只做两个简单的大小比较,就可以避免这种情况。你比我的“循环”慢四倍.那可能是因为你有O(n^2)的复杂性。嗯,不完全是O(n^2),但您确实要根据每个数字检查每个字符,而不是利用它们的算术分组。@MarkoTopolnik-谢谢Marko-我想知道是否有某种rep scasb
功能编译到indexOf
中,这会使它几乎O(n)
但显然不是。我也在想类似的事情:)但是rep scasb
只能从indexOf
中提取一些常量因子——它仍然需要扫描每个字符的整个“数字”字符串。如果只做两个简单的大小比较,就可以避免这种情况。