Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 第一次出现数字时分割字符串的最有效方法是什么?_Java_Arrays_Regex_List_Char - Fatal编程技术网

Java 第一次出现数字时分割字符串的最有效方法是什么?

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

我想把它分成两部分{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
但可能您在错误的地方进行了优化。请编写清晰、简单且有效的代码,然后测量时间的实际进展情况。我敢打赌,它大部分不在应用程序的这一部分中!

类似于:

(?<=\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
中提取一些常量因子——它仍然需要扫描每个字符的整个“数字”字符串。如果只做两个简单的大小比较,就可以避免这种情况。