Java 在这里分割字符串的好方法是什么?
我有以下字符串:Java 在这里分割字符串的好方法是什么?,java,regex,string,optimization,Java,Regex,String,Optimization,我有以下字符串: A:B:1111;域名:80;A.b A是可选的,因此B:1111;域名:80;A.b也是有效的输入。 :80也是可选的,因此B:1111;领域;A.b或:1111;领域;A.b也是有效的输入 我想要的是以一个字符串[]结束,该字符串具有: s[0] = "A"; s[1] = "B"; s[2] = "1111"; s[3] = "domain:80" s[4] = "a" s[5] = "b" 我是这样做的: List<String>
A:B:1111;域名:80;A.b
A
是可选的,因此B:1111;域名:80;A.b
也是有效的输入。:80
也是可选的,因此B:1111;领域;A.b
或:1111;领域;A.b
也是有效的输入我想要的是以一个
字符串[]
结束,该字符串具有:
s[0] = "A";
s[1] = "B";
s[2] = "1111";
s[3] = "domain:80"
s[4] = "a"
s[5] = "b"
我是这样做的:
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();
List tokens=new ArrayList();
字符串[]值=s.split(“;”);
字符串[]操作=值[0]。拆分(“:”;
对于(字符串a:操作){
代币。添加(a);
}
//从1开始跳过A:B:1111
对于(inti=1;i
我想知道有没有更好的办法?我还能如何更有效地完成这项工作 你可以这样做
String str = "A:B:1111;domain:80;a;b";
String[] temp;
/* delimiter */
String delimiter = ";";
/* given string will be split by the argument delimiter provided. */
temp = str.split(delimiter);
/* print substrings */
for(int i =0; i < temp.length ; i++)
System.out.println(temp[i]);
String str=“A:B:1111;域:80;A;B”;
字符串[]温度;
/*分隔符*/
字符串分隔符=“;”;
/*给定的字符串将由提供的参数分隔符分割*/
temp=str.split(分隔符);
/*打印子字符串*/
对于(int i=0;i
除非这是代码中的瓶颈,并且您已经验证了这一点,否则不要太担心效率,因为这里的逻辑是合理的。您可以避免创建临时数组列表,而是直接创建数组,因为您知道所需的大小。通过对可接受字符的一些假设,此正则表达式提供了验证,并可以拆分为所需的组
Pattern p = Pattern.compile("^((.+):)?(.+):(\\d+);(.+):(\\d+);(.+);(.+)$");
Matcher m = p.matcher("A:B:1111;domain:80;a;b");
if(m.matches())
{
for(int i = 0; i <= m.groupCount(); i++)
System.out.println(m.group(i));
}
m = p.matcher("B:1111;domain:80;a;b");
if(m.matches())
{
for(int i = 0; i <= m.groupCount(); i++)
System.out.println(m.group(i));
}
及
这里没有太多的效率问题,我所看到的只是线性的 无论如何,您可以使用正则表达式或手动标记器 你可以避开这个列表。您知道
值的长度
和操作的长度
,因此您可以
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;
它应该相当有效,除非您坚持自己实现split
未经测试的低级方法(确保在使用前进行单元测试和基准测试):
//分隔符字符,作为字符,而不是字符串。
最终静态int s1=':';
最终静态int s2=';';
//计算所需大小:
int分量=1;
对于(int p=Math.min(s.indexOf(s1),s.indexOf(s2));
p-1;
p=s.indexOf(s2,p+1)){
组件++;
}
字符串[]结果=新字符串[组件];
//构建结果
int in=0,i=0,out=Math.min(s.indexOf(s1),s.indexOf(s2));
while(out-1){
结果[i]=s.子串(in,out);
i++;
输入=输出+1;
out=s.indexOf(s2,in);
}
断言(i==result.length-1);
结果[i]=s.substring(in,s.length());
返回结果;
注意:这个代码是以一种疯狂的方式优化的,它只考虑第一个组件中的<代码>:<代码>。处理最后一个组件有点棘手,因为out
的值为-1
我通常不会使用最后一种方法,除非性能和内存非常重要。最有可能的是,其中仍然存在一些bug,并且代码相当不可读,特别是与上面的代码相比。如果您希望将域和端口保持在一起,那么我相信您将需要两个拆分。你也许可以用一些正则表达式魔法来实现它,但我怀疑你是否能从中看到任何真正的性能提升 如果您不介意拆分域和端口,则:
String s= "A:B:1111;domain:80;a;b";
List<String> tokens = new ArrayList<String>();
String[] values = s.split(";|:");
for(String a : values){
tokens.add(a);
}
String s=“A:B:1111;域:80;A;B”;
List tokens=new ArrayList();
字符串[]值=s.split(“;;:”);
for(字符串a:值){
代币。添加(a);
}
您是否尝试过使用:s.split(“[;:]”)这个正则表达式拆分字符“;”或者“:”域后面总是跟一个80
?@codaddict:不,这是可选的,另外一个选择是使用正则表达式,但我非常怀疑你能做任何比你上面所做的更有效的事情。我不知道这是否是一个瓶颈。但我也有兴趣学习其他方法来提高自己
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;
// 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;
String s= "A:B:1111;domain:80;a;b";
List<String> tokens = new ArrayList<String>();
String[] values = s.split(";|:");
for(String a : values){
tokens.add(a);
}