Jim*_*Jim 7 java regex string optimization
我有以下字符串:
A:B:1111;domain:80;a;b
该A是可选的,所以B:1111;domain:80;a;b也是有效的输入.
这:80也是可选的,B:1111;domain;a;b或者:1111;domain;a;b也是有效的输入
我想要的最终结果String[]是:
s[0] = "A";
s[1] = "B";
s[2] = "1111";
s[3] = "domain:80"
s[4] = "a"
s[5] = "b"
Run Code Online (Sandbox Code Playgroud)
我这样做如下:
List<String> tokens = new ArrayList<String>();
String[] values = s.split(";");
String[] actions = values[0].split(":");
for(String a:actions){
tokens.add(a);
}
//Start from 1 to skip A:B:1111
for(int i = 1; i < values.length; i++){
tokens.add(values[i]);
}
String[] finalResult = tokens.toArray();
Run Code Online (Sandbox Code Playgroud)
我想知道有更好的方法吗?我怎么能更有效地做到这一点?
这里没有太多效率问题,我看到的都是线性的。
无论如何,您可以使用正则表达式或手动标记器。
您可以避免该列表。values你知道和的长度actions,所以你可以这样做
String[] values = s.split(";");
String[] actions = values[0].split(":");
String[] result = new String[actions.length + values.length - 1];
System.arraycopy(actions, 0, result, 0, actions.legnth);
System.arraycopy(values, 1, result, actions.length, values.length - 1);
return result;
Run Code Online (Sandbox Code Playgroud)
它应该是相当有效的,除非你坚持split自己实现。
未经测试的低级方法(确保在使用前进行单元测试和基准测试):
// Separator characters, as char, not string.
final static int s1 = ':';
final static int s2 = ';';
// Compute required size:
int components = 1;
for(int p = Math.min(s.indexOf(s1), s.indexOf(s2));
p < s.length() && p > -1;
p = s.indexOf(s2, p+1)) {
components++;
}
String[] result = new String[components];
// Build result
int in=0, i=0, out=Math.min(s.indexOf(s1), s.indexOf(s2));
while(out < s.length() && out > -1) {
result[i] = s.substring(in, out);
i++;
in = out + 1;
out = s.indexOf(s2, in);
}
assert(i == result.length - 1);
result[i] = s.substring(in, s.length());
return result;
Run Code Online (Sandbox Code Playgroud)
注意:此代码以疯狂的方式进行了优化,它只会:在第一个组件中考虑 a 。处理最后一个组件有点棘手,因为out它将具有值-1。
我通常不会使用最后一种方法,除非性能和内存非常重要。很可能其中仍然存在一些错误,并且代码相当难以阅读,特别是与上面的代码相比。