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

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

原文链接:https://cloud.tencent.com/developer/article/1016618

java单词倒序输出_Java实现单词倒序输出相关推荐

  1. java文件输入与输出_java文件输入和输出

    1.输入 读取文件: import java.io.*; import java.math.*; import java.util.*; public class Main { public stat ...

  2. java 字符串原样输出_Java 中如何原样输出转义符号

    标签: Java 中的转义字符有好几种,常见的有: 八进制转义字符,格式:\ + 1到3位八进制数字,如\1, \20,范围为 \0 ~ \377,即最大值为255. Unicode转义字符,格式:\ ...

  3. java 日期格式化 英文_Java中使用SimpleDateFormat输出英文日期(原创)

    Java中使用SimpleDateFormat输出英文日期(原创) 由萱萱 发表于2013-12-14 如果你想输出英文日期,形如: September 29, 2013 可以借助java.text. ...

  4. java从屏幕输入数据_java键盘输入/屏幕输出练习

    清明节后继续编程实践. 以下两个程序展示了如何通过键盘输入数据以及通过显示器显示数据,从而使下用户与计算机之间的交互. (一)使用System.in 静态标准输入流对象进行键盘输入 package e ...

  5. java使用变量输出_JAVA定义变量与输出详解

    一些重要知识 一个源文件里只能有一个public类,其它类数量不限.文件名与public类名相同 java程序严格区分大小写 JAVA应用程序的执行入口是main方法固定写法:public stati ...

  6. java 横向 打印出来_java语句怎样横向输出呢?

    publicclasstest{publicstaticvoidmain(String[]args){StringarrStu[][]={{"20073401","王红& ...

  7. java实现英文文件单词搜索系统_java对于目录下文件的单词查找操作代码实现

    这篇文章主要介绍了java对于目录下文件的单词查找操作代码实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 写入文件的目录.代码通过找目录下的文件 ...

  8. java统计有多少个单词_Java不同单词个数统计

    描述 编写一个程序,输入一个句子,然后统计出这个句子当中不同的单词个数.例如:对于句子"one little two little three little boys",总共有5个 ...

  9. C++ | 从键盘输入任意多个英语单词,统计同一个英语单词被输入几次,最后对英文单词按字典顺序输出(C语言/C++/Java)

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

最新文章

  1. Openstack组件部署 — Networking service_Compute Node
  2. Pandas简明教程:八、Pandas数据透视表
  3. 3.5 向量化实现的解释-深度学习-Stanford吴恩达教授
  4. SpringMVC的数据转换、格式化和数据校验
  5. Java基础day17
  6. Android RaingBar评分条的使用
  7. 张平文院士:展示计算数学的魅力
  8. mysql和ORTHOMCL_Orthomcl的详细使用
  9. 五校联考R1 Day2T2 矩阵matrix(容斥)
  10. 一些抄来的冷知识...
  11. jQuery源码系列(一)
  12. MySQL是怎样运行的(实体书扫描+掘金小册)免费下载
  13. 关于光学软件设计衍射透镜的一点总结
  14. amd支持服务器内存,AMD专用内存为什么只能在AMD平台使用?与普通内存有什么区别?...
  15. pbs转换html,pbs 脚本实例说明.docx
  16. Codeforces 760B Frodo and pillows
  17. 计算机科学导论任务书,计算机科学导论论文提纲格式范文 计算机科学导论论文提纲如何写...
  18. 2013-1-20·
  19. R语言符号秩检验及其应用
  20. (Java面试)Java面试越来越难,不加油卷起来,怎么拿到大厂offer!!

热门文章

  1. PAT JAVA 乙 1020 吃月饼
  2. 创建第一个three.js三维场景,可通过鼠标缩放与移动方块(vue中使用three.js02)
  3. springboot生成 .docx的word文档
  4. MySQL连接查询(内连接,外连接,全连接)
  5. 【报告分享】2020年车载音频市场价值洞察-易观智库(附下载)
  6. 索尼9500G(包括8500),在使用云极光或者奇异果时,卡顿问题解决方法
  7. C波段 波长和中心频率对应表
  8. Hoststool使用教程
  9. 【51单片机STC89C52】串口通信(蓝牙)
  10. 【macOS温度监控】-istats