Java实现单词倒序输出
如何将一段单词倒序输出?把“HelloJavaHelloChina”变成“ChinaHelloJavaHello”?
看起来好像很简单,只需要把字符串先分割成单词,然后加入一个StringBuilder或者StringBuffer中,最后再使用toString方法即可,现在来实现一下:
/** *@authorFrank *@create2017/11/24 *@description */ publicclassTest{ publicstaticvoidmain(String[]args){ Stringsrc="HelloJavaHelloChina";//需要处理的字符串 String[]arr=src.split("");//按空格分割 intlength=arr.length;//计算数组长度 StringBuildersb=newStringBuilder(src.length());//新建一个StringBuilder对象 for(inti=length-1;i>=1;i--){ sb.append(arr[i]+"");//将字符串依次加入StringBuilder中 } sb.append(arr[0]);//最后一个单词不加空格 System.out.println(sb.toString());//输出 } }
ChinaHelloJavaHello
好的,现在就完美的解决了问题。
但事实上,通常并不是全用空格分隔开来的,而是有逗号,句号,引号等,那么这该如何处理呢?
那就只能一个字符一个字符判断了,用charAt()来判断字符是否为逗号句号或者引号,空格,如果是的话就知道到了分隔点了,如果不是的话就加入一个临时的StringBuilder对象,代码如下:
/** *@authorFrank *@create2017/11/24 *@description */ publicclassTest2{ publicstaticvoidmain(String[]args){ Stringsrc="HelloJava,HelloChina.";//需要处理的字符串 StringBuildertmp=newStringBuilder(20);//定义一个StringBuilder对象 StringBuildergoal=newStringBuilder(src.length());//定义一个StringBuilder对象来存放最终要输出的信息 charc;//定义一个字符变量 for(inti=src.length()-1;i>=0;i--){ c=src.charAt(i);//从后往前取字符 if(c==''||c==','||c=='.'){//判断是否为分隔字符 goal.append(tmp);//如果是的话就把tmp加入到goal中来 goal.append(c);//在把分隔字符也一起加入 tmp.delete(0,tmp.length());//清空tmp }else{ tmp.insert(0,c);//如果不是分隔字符,说明单词未完整,继续加入tmp中 } } if(!tmp.equals("")){ goal.append(tmp);//如果tmp中还有内容,在添加到goal中 } System.out.println(goal.toString());//输出 } }
输出如下:
.ChinaHello,JavaHello
好像没什么问题了。
现在难度进一步升级,如果有一个20M的字符串,“Hello_,_China_..._Bye.”(...代表中间省略的部分),单词之间用空格隔开,现在需要把所有单词全部颠倒顺序,要求效率不能太低。不看这个20M的话,好像没什么难度,关键就在于这个20M,肯定不能像第一种方式用split分割,那样的话会创建一个很大的字符串数组,浪费很多空间。
所以这里采用第二种方式。
我们先随机生成一个字符串,然后再使用第二种方式进行处理:
/** *@authorFrank *@create2017/11/24 *@description */ publicclassTest3{ publicstaticvoidmain(String[]args){ longtime=0; StringBuildersb=newStringBuilder(); //先生成一个比较大的字符串 for(inti=0;i<10000000;i++){ sb.append(i+""); } System.out.println("字符串长度:"+sb.length()); //开始计算时间 time=System.currentTimeMillis(); StringBuildertmp=newStringBuilder(20);//定义一个StringBuilder对象存放临时数据 StringBuildergoal=newStringBuilder(sb.length());//定义一个StringBuilder对象来存放最终要输出的信息 charc;//定义一个字符变量 for(inti=sb.length()-1;i>=0;i--){ c=sb.charAt(i);//从后往前取字符 if(c==''){//判断是否为分隔字符 goal.append(tmp);//如果是的话就把tmp加入到goal中来 goal.append(c);//在把分隔字符也一起加入 tmp.delete(0,tmp.length());//清空tmp }else{ tmp.insert(0,c);//如果不是分隔字符,说明单词未完整,继续加入tmp中 } } if(!tmp.equals("")){ goal.append(tmp);//如果tmp中还有内容,在添加到goal中 } System.out.println(System.currentTimeMillis()-time);//输出运行时间 } }
输出如下:
字符串长度:78888890
608
608毫秒,速度还ok,生成字符串还是要花挺多时间的,因为一直要进行内存复制,如果在循环次数后再加一个0,就会内存不足了。。。。
Exceptioninthread"main"java.lang.OutOfMemoryError:Javaheapspace
atjava.util.Arrays.copyOf(Arrays.java:3332)
atjava.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
atjava.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
atjava.lang.StringBuilder.append(StringBuilder.java:136)
atcom.frank.string.test1.Test3.main(Test3.java:14)
至此,本篇问题讨论完毕,如果有更好更快的方法,欢迎留言交流讨论。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。