问题描述如下:
  参数:任意字符串,命名遵循骆驼命名法,如tabName,tabNamePlus
  要求:碰到大写解析为格式tab_name,tab_name_plus

解决方案 »

  1.   

    String str=tabName;
     for(i=0;i<str.length();i++)
     {  
       if((int)str.charAt(i)<=90&&(int)str.charAt(i)>=65&&i!=0)//判断每个字符的ascii码是否为65,也就是判断是不是大写的
        str=str.substring(0,i)+"_"+str.substring(i,i+1).toLowerCase()+str.substring(i+1,str.length());
     }
      

  2.   

    char[] buf = new char[str.length()*2];
    char[] src = str.toCharArray();
    int pos = 0;
    for(int i=0;i<src.length;i++){
      if(65 <= src[i] && src[i]<= 90){
         buf[pos++] = '_';
         buf[pos++] = (char)(src[i] + ('a' - 'A'));//或直接 + 32
      }else
         buf[pos++] = src[i];
      
    }
    return new String(buf,0,pos);这样性能最高,只有两次方法调用(toCharArray()和 new String()),其它都是数值运算.而且没有数据COPY而在循环中大量调用 charAt以及substring,toLowerCase,性能至少降低10倍 .
      

  3.   

    性能好不好测一下就知道了啊
    import java.util.Date;
    public class Str{
    public static void main(String arg[])
    {
     String str="sanivLoveSadan";
     Long start=System.currentTimeMillis();
    for(int j=0;j <str.length();j++) 
             {
               if((int)str.charAt(j) <=90&&(int)str.charAt(j)>=65&&j!=0)
               str=str.substring(0,j)+"_"+str.substring(j,j+1).toLowerCase()+str.substring(j+1,str.length()); 
     }
    Long end=System.currentTimeMillis();

    System.out.println(end-start);//输出代码运行时间
    String s="sanivLoveSadan";
    Long start1=System.currentTimeMillis();
    char[] buf = new char[s.length()*2]; 
    char[] src = s.toCharArray(); 
    int pos = 0; 
    for(int i=0;i <s.length();i++){
       if(65 <= src[i] && src[i] <= 90){
         buf[pos++] = '_'; 
         buf[pos++] = (char)(src[i] + ('a' - 'A'));//或直接 + 32 
       }else 
         buf[pos++] = src[i]; 
    }
    Long end1=System.currentTimeMillis();
    System.out.println(end1-start1);//输出代码运行时间
    }
    }
      

  4.   

    连如何测试都不懂的话,那如何谈测试.
    那样的例子连thinktime时间都不够.
      

  5.   


    public class Main { /**
     * @param args
     */
    public static void main(String[] args) {
    //System.out.println(u2l("axmanTestString"));
    String str="iAmAxmanIAmAGreatManWhoAreYou"; 
    String s = null;
    Long start=System.currentTimeMillis(); 
    for(int i=0;i<1000000;i++){
    s = u2l1(str);
    }
    Long end=System.currentTimeMillis();  System.out.println(end-start);//输出代码运行时间 
    System.out.println(s);
    Long start1=System.currentTimeMillis(); 
    for(int i=0;i<1000000;i++){
    s = u2l(str);
    }
    Long end1=System.currentTimeMillis(); 
    System.out.println(end1-start1);//输出代码运行时间 
    System.out.println(s);
    }
    public static String u2l1(String str){
    for(int j=0;j <str.length();j++) 
            { 
              if((int)str.charAt(j) <=90&&(int)str.charAt(j)>=65&&j!=0) 
              str=str.substring(0,j)+"_"+str.substring(j,j+1).toLowerCase()+str.substring(j+1,str.length()); 
            }
    return str;
    }

    public static String u2l(String str){
    char[] buf = new char[str.length()*2];
    char[] src = str.toCharArray();
    int pos = 0;
    for(int i=0;i<src.length;i++){
      if(65 <= src[i] && src[i]<= 90){
         buf[pos++] = '_';
         buf[pos++] = (char)(src[i] + ('a' - 'A'));//或直接 + 32
      }else
         buf[pos++] = src[i];
      
    }
    return new String(buf,0,pos);
    }
    }这就是结果,测试一下确实能说明问题.
    4780
    i_am_axman_i_am_a_great_man_who_are_you
    356
    i_am_axman_i_am_a_great_man_who_are_you
      

  6.   

    看看火龙果的正则
    public class Test {
        public static void main(String[] args) {
            String str = "AQuickBrownFoxJumpsOverTheLazyDog";
            String[] strs = str.split("(?<!^)(?=[A-Z])");
            for(String s : strs) {
                System.out.println(s);
            }
        }
    }
      

  7.   

    环视。果子的正则是否代表,以非字串开始的大写字母为分隔符,但是改大写字母不会被裁进前一段子串?干嘛不用替换,大写字母全部换成对应的_小写字母
    比如tabName,然后找到N,然后用_lowcase(N)替代,记得用replaceAll
    然后是反向引用。
    replaceAll("[A-Z]","_"+lowcase("\1"));
    手边也没java得环境
    如果是我,我会选择/g的全局替换模式。
      

  8.   

    无论是正则还是直接替换都有大量的数据COPY,这就是String类的不变性的副作用.
    况且不论如何build新串, 扫描源串都会隐式访问chatAt,而不象c的字符串直接访问str[x];
    如果串很长光在循环中访问每个字符就已不可接受了,不断构造和销毁方法帧.仅仅为返回
    数组中的一个元素.
      

  9.   

    这位兄弟说的对。
    但是,即便是C。由于你需要为字符串中添加字符,其实本身还是需要重新开辟一个数组来实现。
    所以比较有效地一个办法就是一次性开辟数组。
    也就是说,首先拿到一个字符中所有大写字母的位置。然后新建一个新的数组(大小根据大写字母的数目+原有数组大小)
    然后再copy数组过去,并且添加_。
    String实在是。。嘿嘿
      

  10.   

    果子perl要转化还是比较简单的