java单词倒序输出_Java倒序输出 Java实现单词倒序输出

想了解Java实现单词倒序输出的相关内容吗,弗兰克的猫在本文为您仔细讲解Java倒序输出的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:Java,倒序输出,Java,输出,下面大家一起来学习吧。

如何将一段单词倒序输出?把“Hello Java Hello China”变成“China Hello Java Hello”?

看起来好像很简单,只需要把字符串先分割成单词,然后加入一个StringBuilder或者StringBuffer中,最后再使用toString方法即可,现在来实现一下:

/**

* @author Frank

* @create 2017/11/24

* @description

*/

public class Test {

public static void main(String[] args) {

String src = "Hello Java Hello China";//需要处理的字符串

String[] arr = src.split(" ");//按空格分割

int length = arr.length;//计算数组长度

StringBuilder sb = new StringBuilder(src.length());//新建一个StringBuilder对象

for (int i=length-1;i>=1;i--){

sb.append(arr[i]+" ");//将字符串依次加入StringBuilder中

}

sb.append(arr[0]);//最后一个单词不加空格

System.out.println(sb.toString());//输出

}

}

China Hello Java Hello

好的,现在就完美的解决了问题。

但事实上,通常并不是全用空格分隔开来的,而是有逗号,句号,引号等,那么这该如何处理呢?

那就只能一个字符一个字符判断了,用charAt()来判断字符是否为逗号句号或者引号,空格,如果是的话就知道到了分隔点了,如果不是的话就加入一个临时的StringBuilder对象,代码如下:

/**

* @author Frank

* @create 2017/11/24

* @description

*/

public class Test2 {

public static void main(String[] args) {

String src = "Hello Java,Hello China.";//需要处理的字符串

StringBuilder tmp = new StringBuilder(20);//定义一个StringBuilder对象

StringBuilder goal = new StringBuilder(src.length());//定义一个StringBuilder对象来存放最终要输出的信息

char c;//定义一个字符变量

for (int i=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());//输出

}

}

输出如下:

.China Hello,Java Hello

好像没什么问题了。

现在难度进一步升级,如果有一个20M的字符串,“Hello_,_China_..._Bye.”(...代表中间省略的部分),单词之间用空格隔开,现在需要把所有单词全部颠倒顺序,要求效率不能太低。不看这个20M的话,好像没什么难度,关键就在于这个20M,肯定不能像第一种方式用split分割,那样的话会创建一个很大的字符串数组,浪费很多空间。

所以这里采用第二种方式。

我们先随机生成一个字符串,然后再使用第二种方式进行处理:

/**

* @author Frank

* @create 2017/11/24

* @description

*/

public class Test3 {

public static void main(String[] args) {

long time = 0;

StringBuilder sb = new StringBuilder();

//先生成一个比较大的字符串

for (int i=0;i<10000000;i++){

sb.append(i+" ");

}

System.out.println("字符串长度:"+sb.length());

//开始计算时间

time = System.currentTimeMillis();

StringBuilder tmp = new StringBuilder(20);//定义一个StringBuilder对象存放临时数据

StringBuilder goal = new StringBuilder(sb.length());//定义一个StringBuilder对象来存放最终要输出的信息

char c;//定义一个字符变量

for (int i=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,就会内存不足了。。。。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Arrays.java:3332)

at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)

at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)

at java.lang.StringBuilder.append(StringBuilder.java:136)

at com.frank.string.test1.Test3.main(Test3.java:14)

至此,本篇问题讨论完毕,如果有更好更快的方法,欢迎留言交流讨论。

相关文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值