Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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_Regex_String_Optimization - Fatal编程技术网

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);
  }