完美分割字符串,实现字符串的splict功能

class Str:Client_C    

{        

  string val;        

  string[] str = new string[100];      

  public void StrT1()        

  {            

    //1.正常情况            

    //2.两个分隔符相邻            

    //3.以分隔符开始或者结束。            

    //如果只有一次,做个细小的改变,让他跟随又规律的其他            

    int nIdx = -1;            

    int xIdn = val.IndexOf(',', 0);  //必须从0开始,而不是现在的nIdx=-1

            int maxIdn = val.Length-1;            

    int i = 0;                        

    while (xIdn <= maxIdn && xIdn!=-1)            

    {

                  nIdx++;//将到达正式字符串,从此开始截取。,,hh                 //1.以分隔符开始,或者相邻,处理特殊情况                                if (nIdx == xIdn)                

      {                    

        str[i++] = "";                     //在小于最大索引的情况下递增,等于最大都不往下找了                    

        if (xIdn < maxIdn)                    

        {                        

          //nIdx不变,寻找下一个Idx                        

          xIdn = val.IndexOf(',', nIdx + 1);                        

          continue;                    

        }                    

        else //如果nIdx == xIdn,那么nIdx不变,xIdx该成-1,代表结束                    

        {                        

          xIdn = -1;                        

          break;                    

        }                

      }                

      str[i++] = val.Substring(nIdx, xIdn - nIdx); 

      //想想为什么是xIdx-nIdx,想想什么是下标,现在的nIdx和xIdx各代表什么,在什么位置。                

      nIdx = xIdn;                 //从后一个分隔符的下一个标记开始查                

      xIdn = val.IndexOf(',', nIdx+1);            

    }            

    //最后一次的时候,xIdn失效-1,同时也处理了以分隔符结束的情况,截取0个字符串的时候,结果为空,恰好            

    //没经过while循环内的nIdx++,标记还停留在分隔符位置,所以要从nIdx+1开始            

    str[i] = val.Substring(nIdx+1, maxIdn - nIdx);//nIdx还未加1,计算长度的时候,直接相减恰好

    Print();        

}        

public void Print()        

{            

  StringBuilder sb = new StringBuilder();            

  foreach (string item in str)            

  {                

    sb.Append(item + "  ");            

  }            

  Console.WriteLine(sb.ToString());        

}

        public void Client()        

   {

            StrT1();        

  }    

}

 

 

总结:编程的关键不在于处理好常规情况,而是处理好特殊情况,然后将两种情况结合起来。

posted @ 2013-07-06 20:39  randroid  阅读(5104)  评论(0编辑  收藏  举报