求一字符解析方法 问题描述如下: 参数:任意字符串,命名遵循骆驼命名法,如tabName,tabNamePlus 要求:碰到大写解析为格式tab_name,tab_name_plus 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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()); } 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倍 . 性能好不好测一下就知道了啊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);//输出代码运行时间}} 连如何测试都不懂的话,那如何谈测试.那样的例子连thinktime时间都不够. 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); }}这就是结果,测试一下确实能说明问题.4780i_am_axman_i_am_a_great_man_who_are_you356i_am_axman_i_am_a_great_man_who_are_you 看看火龙果的正则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); } }} 环视。果子的正则是否代表,以非字串开始的大写字母为分隔符,但是改大写字母不会被裁进前一段子串?干嘛不用替换,大写字母全部换成对应的_小写字母比如tabName,然后找到N,然后用_lowcase(N)替代,记得用replaceAll然后是反向引用。replaceAll("[A-Z]","_"+lowcase("\1"));手边也没java得环境如果是我,我会选择/g的全局替换模式。 无论是正则还是直接替换都有大量的数据COPY,这就是String类的不变性的副作用.况且不论如何build新串, 扫描源串都会隐式访问chatAt,而不象c的字符串直接访问str[x];如果串很长光在循环中访问每个字符就已不可接受了,不断构造和销毁方法帧.仅仅为返回数组中的一个元素. 这位兄弟说的对。但是,即便是C。由于你需要为字符串中添加字符,其实本身还是需要重新开辟一个数组来实现。所以比较有效地一个办法就是一次性开辟数组。也就是说,首先拿到一个字符中所有大写字母的位置。然后新建一个新的数组(大小根据大写字母的数目+原有数组大小)然后再copy数组过去,并且添加_。String实在是。。嘿嘿 果子perl要转化还是比较简单的 myeclipse的问题 JTable中如何设置列的行数,及每个单元格宽与长 用了struts,tomcat启动就出错 最合适Java初学者的教材 j2ee最通俗的理解... 请大家帮我分析一下这个小程序执行流程,来者有分 在命令窗口中如何运行java程序 诸位大哥不才想问(1)在win系统下java如何调用系统的dll,(2) 怎么读取word等office文档????? 背英语单词的小程序,有点困难 新人小白求帮忙 过滤器代码求解释 我在主页上加了ajax的登录,登录成功后,如果进入另一个页面在浏览器点击返回的时候还是显示未登录状态?
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());
}
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倍 .
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);//输出代码运行时间
}
}
那样的例子连thinktime时间都不够.
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
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);
}
}
}
比如tabName,然后找到N,然后用_lowcase(N)替代,记得用replaceAll
然后是反向引用。
replaceAll("[A-Z]","_"+lowcase("\1"));
手边也没java得环境
如果是我,我会选择/g的全局替换模式。
况且不论如何build新串, 扫描源串都会隐式访问chatAt,而不象c的字符串直接访问str[x];
如果串很长光在循环中访问每个字符就已不可接受了,不断构造和销毁方法帧.仅仅为返回
数组中的一个元素.
但是,即便是C。由于你需要为字符串中添加字符,其实本身还是需要重新开辟一个数组来实现。
所以比较有效地一个办法就是一次性开辟数组。
也就是说,首先拿到一个字符中所有大写字母的位置。然后新建一个新的数组(大小根据大写字母的数目+原有数组大小)
然后再copy数组过去,并且添加_。
String实在是。。嘿嘿