string split的用法

1. 有时候需要使用某些字符来作为值的合并存储,比如以@作为分隔符, 232332@232323@323232, 用一个属性存储这3个值, 用的时候再拿出来split就可以了.

2. 问题是有时候某个值会缺失,比如第一个值没有的情况, @232323@323232  第2,3个值没有的情况 232332@@ ,当然也期望是能返回3个值,只是后边2个值为空字符就行了。

事实上,结果不是这样,即使 2,3个值没有的情况 232332@@  也只返回第1个值,数组大小是1. 这就让人很迷惑,明明有分隔符,为什么当看不到呢?所以再编程时要注意.

split是惰性搜索, 后边如果没有值存在就当没有结果,但是如果只有第3个值,确实能返回数组大小是3的,前两个是空字符串. 也就是split遵循一个原则,返回结果和数组所在

索引一定是对应着的最少数组.

3. Java的这种做法会令写手写C++ split的人抓狂, 做C++切换Java时要注意.

4. 也就是说String的split 即使指定了分隔符个数也不能得到固定的分割个数.

 

情况1.

 

[java] view plain copy
  1. String value = "\n\n2";  
  2.         String[] names = value.split("\n");  
  3. for (int i = 0; i < names.length; i++) {  
  4.             System.out.println("i:"+names[i]);  
  5.         }  


输出:

 

 

[plain] view plain copy
  1. i:  
  2. i:  
  3. i:2  


情况2.

 

 

[java] view plain copy
  1. String value = "2\n\n";  
  2.         String[] names = value.split("\n");  
  3. for (int i = 0; i < names.length; i++) {  
  4.             System.out.println("i:"+names[i]);  
  5.         }  


输出:

 

 

[plain] view plain copy
 
  1. i:2  

 

 

情况3:

 

  1. String value = "\n\n";  
  2.         String[] names = value.split("\n");  
  3. for (int i = 0; i < names.length; i++) {  
  4.             System.out.println("i:"+names[i]);  
  5.         }  


输出: 无输出,个数是0.

经过一个同事的纠正,split还有一个重载的方法可以做到最大分割数, 就是设置split的第2个参数为-1,如果有两个分隔符的情况下,最大分割数是3.

 

[java] view plain copy
  1. String value = "2\n5\n";  
  2. String[] names = value.split("\n",-1);  
  3. for (int i = 0; i < names.length; i++) {  
  4.     System.out.println("i:"+names[i]);  
  5. }  


输出:

 

 

[java] view plain copy
  1. i:2
  2. i:5
  3. i:  

猜你喜欢

转载自5keit.iteye.com/blog/2321999