续原来的帖子:http://topic.csdn.net/u/20110514/12/64eec56e-3947-4ef8-83d1-cccc79cc338c.html#replyachor
判断符除了":",还有"|",":"相当于每一字段的标志,而"|"相当于同一字段的几行组成部分的分隔符
字段又分大类的字段和小类的字段,例如例子中的"10"是大类字段,没有详细说明,而"101","102"这些是属于"10"大类里面的小类字段,有各自的详细说明。
源字符串是为"10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::",或
源字符串是为"10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::121:Apr" 或
源字符串是为"10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::121:Apr|12|121212"
对应输出为:
:10:
:101:ABC
:102:GUANGZHOU  
:103:OK   
:11:
:111:TIAN HE   
968   
:12:
或:
:10:
:101:ABC
:102:GUANGZHOU  
:103:OK   
:11:
:111:TIAN HE   
968   
:12:
:121:Apr
或:
:10:
:101:ABC
:102:GUANGZHOU  
:103:OK   
:11:
:111:TIAN HE   
968   
:12:
:121:Apr
12
121212
我的原逻辑:
public class Dtest {
public static void main(String args[]){        String s1 = "10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::121:TEST   ";        if (!(s1.trim().endsWith(":")|s1.trim().endsWith("|"))){
         s1 = s1.trim().concat(":");
        }
        char[] cstr = s1.trim().toCharArray();
        char[] tstr = new char[s1.trim().length()+100];
        int w2 = 0;
        int w1beg = 0;
        int clength = cstr.length - 1;
        boolean cboolean = true;
        for (int j = 0; j<=clength; j+=1 ){
         if (cstr[j]==':'|cstr[j]=='|'){
         if (cboolean&cstr[j]!='|'){
         cboolean = false;
         }
         else {
         if (cstr[j]==':'){
         tstr[w2]=':';
         w2+=1;
         }
        
         int alength = s1.substring(w1beg, j).trim().length();
         char[] nchar = s1.substring(w1beg,j).trim().toCharArray();
         for (int k = 0; k< alength; k+=1,w2++){
         tstr[w2] = nchar[k];
         }
         tstr[w2] = '$';
         w1beg = j + 1;
         w2 = w2 + 1;
         cboolean = true;
        
         }
         }
        }
        System.out.println(tstr);
}
}感觉不好,请问有没有其他有效率的方法呢?另外后面的tstr如何转为字符串?tstr.tostring不能正确转换为字符串。谢谢

解决方案 »

  1.   


    public class Test {
    private String processFiled(String s) {
    StringBuilder stringBuilder = new StringBuilder();
    if (s.indexOf(":") == -1) {
    stringBuilder.append(s + "\n");
    } else {
    String[] ss = s.split(":");
    int loops = ss.length - 1;
    if (loops > 0) {
    for (int i = 0; i < loops; i += 2) {
    stringBuilder.append(":");
    stringBuilder.append(ss[i]);
    stringBuilder.append(":");
    stringBuilder.append(ss[i + 1]);
    stringBuilder.append("\n");
    }
    } else {
    stringBuilder.append(":");
    stringBuilder.append(ss[0]);
    stringBuilder.append(":");
    stringBuilder.append("\n");
    }
    }
    return stringBuilder.toString();
    }

    public String process(String s) {
    StringBuilder stringBuilder = new StringBuilder();
    String[] ss = s.split("\\|");
    for (int i = 0; i < ss.length; i++)
    stringBuilder.append(this.processFiled(ss[i]));
    return stringBuilder.toString();
    }

    public static void main(String[] args) {
    Test test = new Test();
    System.out.println(test.process("10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::"));
    System.out.println(test.process("10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::121:Apr"));
    System.out.println(test.process("10::101:ABC:102:GUANGZHOU :103:OK :11::111:TIAN HE |968 |12::121:Apr|12|121212"));
    }
    }
      

  2.   


    谢谢1楼回复。
    我看了一下,你的想法我也尝试过。有两个问题,一是循环里加二,会漏了最后面一个;第二是再次用'|'来分,会导致紧跟|
    后的12最后的输出没有前面的:
    例如
    : 10 :: 101: ABC: 102:GUANGZHOU:103: OK :11 : : 111: TIAN HE |968 |12 :这个'|'后面连着的12也要带一个':'是原逻辑里面比较麻烦的地方,所以不能分别以':'/'|'来split