如何将一段单词倒序输出?把“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());//输出
    }
}

  因为是使用单线程,所以用StringBuilder的效率会高于StringBuffer,输出如下:

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 spaceat 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)

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

真正重要的东西,用眼睛是看不见的。

【Java】单词倒序输出相关推荐

  1. java单词倒序输出_Java实现单词倒序输出

    如何将一段单词倒序输出?把"Hello Java Hello China"变成"China Hello Java Hello"? 看起来好像很简单,只需要把字符 ...

  2. java数字倒序输出

    数字倒序输出 题目描述 输入10个数字,然后逆序输出. 输入 十个整数 输出 逆序输出,空格分开 样例输入 1 2 3 4 5 6 7 8 9 0 样例输出 0 9 8 7 6 5 4 3 2 1 解 ...

  3. java数组倒序输出简单方式

    简述一个自想的Java数组倒序方法思路, 因为很简单, 要是网上有重复,多有原谅,我并不知道 我自己上网搜资料的时候,看着非常复杂.

  4. 字符串按单词逆序输出c 语言,字符串中的每个单词倒序输出问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include void sub_reverse(char *); int main() { char str[256] = "The onl ...

  5. c语言字符串单词反序输出,字符串中的每个单词倒序输出问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include void sub_reverse(char *); int main() { char str[256] = "The onl ...

  6. c语言字符数组英文倒序输出,字符串中的每个单词倒序输出问题

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include void sub_reverse(char *); int main() { char str[256] = "The onl ...

  7. java倒序输出英文句子_java逆序英文句子中的单词顺序

    题目要求:给定n行的英文句子,要求输出句子中逆序单词后的句子,如: 输入:n=3 I love you How are you My name is Liming 输出: you love I you ...

  8. java句子倒序_Java实现英文句子中的单词顺序逆序输出的方法

    摘要:这篇Java开发技术栏目下的"Java实现英文句子中的单词顺序逆序输出的方法",介绍的技术点是"逆序输出.单词顺序.英文句子.Java.实现.方法",希望 ...

  9. java从键盘输入一个数,并将其倒序输出

    从键盘输入一个数,并将其倒序输出 import java.util.Scanner;/*** 从键盘上录入任意整数,倒叙输出*/ public class Test06 {public static ...

最新文章

  1. EOJ Monthly 2020.7 Sponsored by TuSimple 部分题解
  2. 示波器探头×1和×10的意义
  3. linux vi 是目录,linux基本操作之目录、vi等
  4. 如何画好一张架构图?(内含知识图谱)
  5. 【linux】 redhat中设置时区
  6. 语言for循环联程_Lua循环
  7. 那些年我用过的SAP IDE 1
  8. java修饰类的关键字_JAVA中的修饰关键字
  9. b样条曲面绘制 opengl_CAD制图软件中如何利用EXCEL输入坐标绘制曲线?
  10. 面象对象设计6大原则之二:开放封闭原则
  11. 详解协同感知数据集OPV2V: An Open Benchmark Dataset and Fusion Pipeline for Perception with V2V Communication
  12. Ubuntu 安装和使用 jupyter 出现的问题总结
  13. 作者:张丹(1991-),女,中南大学信息与工程学院硕士生。
  14. thinkPHP仿QQ飞车手游模拟抽奖源码
  15. 在系统启动时至少有一个服务或驱动程序产生错误_Cassandra Java驱动程序
  16. python 运维包_python运维常用模块
  17. Linux之交叉编译器的构建
  18. python爬虫实例评论_python爬取微博评论的实例讲解
  19. 广义线性模型的计算机应用技术学院,SPSS数据分析—广义线性模型
  20. 朴素贝叶斯算法实现新闻分类(Sklearn实现)

热门文章

  1. linux下常用的关机命令有:shutdown、halt、poweroff、init;重启命令有:reboot。下面本文就主要介绍一些常用的关机命令以及各种关机命令之间的区别和具体用法。
  2. mysql数据库自动重新连接_mysql数据库自动重新连接
  3. js reduce实现中间件_MapReduce 模型
  4. hibernate by example 排除某些列
  5. mybatis分页插件PageHelper简单应用
  6. 微信WebView关闭后本地cookie无法清除问题
  7. Java技术小册(基础篇)
  8. 5-4 是否同一棵二叉搜索树 (25分)
  9. 20135223何伟钦—信息安全系统设计基础第七周学习总结
  10. Python for Data Analysis