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

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

/***@authorFrank

* @create 2017/11/24

* @description*/

public classTest {public static voidmain(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对象,代码如下:

/***@authorFrank

* @create 2017/11/24

* @description*/

public classTest2 {public static voidmain(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分割,那样的话会创建一个很大的字符串数组,浪费很多空间。

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

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

/***@authorFrank

* @create 2017/11/24

* @description*/

public classTest3 {public static voidmain(String[] args) {long time = 0;

StringBuilder sb= newStringBuilder();//先生成一个比较大的字符串

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)

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

原文:http://www.cnblogs.com/mfrank/p/7891512.html

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

  1. java句子单词颠倒_翻转单词顺序列(Java)

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,"st ...

  2. java背单词软件_背单词的java小软件

    [实例简介] 这是我写的背单词的一个软件,自己输入单词,然后可以有挑战模式,在规定时间内输入单词,比较有意思,练手不错 [实例截图] [核心代码] 单词背背背 └── 单词背背背 ├── bin │  ...

  3. java取负数_[Java] 告别“CV 工程师”码出高效!(基础篇)

    作为一名资深的 CV 工程师,某天,当我再一次日常看见满屏的报错信息与键盘上已经磨的泛白的 Ctrl.C.V 这三个按键时,我顿悟了. 百度谷歌复制粘贴虽然很香,但是总是依靠前人种树,终会有一天失去乘 ...

  4. java wordcount程序_[java]wordcount程序

    词数统计系统. 作业解析:这次作业的内容是从本地读取一个程序代码,计算出这个程序中的行数,单词数,也可进行拓展. 实现语言:java 编程思路: 程序是由各种单词和符号组成的,单词包括关键字,标识符这 ...

  5. java控制语句练习题_[Java初探实例篇02]__流程控制语句知识相关的实例练习

    本例就流程控制语句的应用方面,通过三个练习题来深入学习和巩固下学习的流程控制语句方面的知识,设计到,if条件判断语句,switch多分支语句,for循环语句及其嵌套多层使用,while循环语句. 练习 ...

  6. java 文本压缩_[Java基础]Java使用GZIP进行文本压缩

    import java.io.IOException; import java.util.zip.GZIPOutputStream; import org.apache.commons.io.outp ...

  7. java private 对象_[Java笔记]类的所有构造器都是private权限,就一定没有办法实例化它的对象了么?...

    笔者以前学过C++语言.众所周知,C++也是一门面向对象程序设计语言.还记得当时在大学的时候,老师讲过这样的话:类的构造函数不应该设置成private权限,这样的话还怎么去实例化类的对象?当时也信以为 ...

  8. java resources 目录_[Java] 在 jar 文件中读取 resources 目录下的文件

    注意两点: 1. 将资源目录添加到 build path,确保该目录下的文件被拷贝到 jar 文件中. 2. jar 内部的东西,可以当作 stream 来读取,但不应该当作 file 来读取. 例子 ...

  9. python扇贝单词书_扇贝单词如何创建自己的单词书

    扇贝单词如何创建自己的单词书 工具/原料 扇贝 方法/步骤 1 用扇贝记单词时使用的是别人的单词书,如果想记哪些单词就记哪些,可以自己创建一本单词书.首先打开扇贝网,找到单词书,点击进入. 2 找到右 ...

  10. java斗地主发牌_[Java源码]扑克牌——斗地主发牌实现

    --------------------------------------- --------------------------------------- ----------一个扑克牌核心和简单 ...

最新文章

  1. oracle归档日志是否启用,oracle归档日志满了,导致无法启动 ORA-03113
  2. html语言星号,如何使HTML代码,输入的东西星号显示出来
  3. Spring MVC零配置(全注解)(版本5.0.7)
  4. DayDayUp:分析“普通人”如何逐步走上食物链顶端(看那些成名史案例,有感而发)
  5. 【DP】K星人的语言(2020特长生 T3)
  6. java派生类_我可以使派生类从Java的基类继承派生成员...
  7. 通过jQuery给select元素的option标签添加自定义属性
  8. linux增加阵列磁盘空间,Linux Ubuntu系统下通过LVM创建软raid来实现硬盘合并大小
  9. Matplotlib Line2D设置
  10. 回车,换行,转义字符“\r”,“\n”是什么关系?
  11. 2T比特每秒!瞻博推出业界最快防火墙
  12. 三、java IO--使用字节流写入文件
  13. Python输出异常信息(行号)
  14. C++复合类型-指针变量
  15. 打开FOXMAIL常见错误提示“Message format error”
  16. 当当网张亮:Sharding-JDBC 未来将更加多样化
  17. 可信平台模块TPM(Trusted Platform Module)介绍及tpm-tools安装使用
  18. 中学物理教学参考杂志社中学物理教学参考编辑部2022年第21期目录
  19. 安徽汽车网程序员删库跑路?不,真相是这样!
  20. Lync 2010 升级到2013 之安装准备!

热门文章

  1. 项目管理系统--设计篇--第五篇
  2. 寒流来袭·《求职初体验》
  3. linux储存文件格式,linux中的.local文件是什么类型的文件?
  4. linux快捷删除151617文件,mengzhaoliang
  5. smale学习之数学表达式(day2)
  6. tm1639c语言程序,51单片机各种汇编延时子程序整理汇总
  7. opencv ret, binary = cv2.threshold(src, 180, 255, )二值化的类型
  8. rdesktop连接windows远程桌面详解
  9. 递归学习简单的小例子之hanoi塔问题
  10. python实现对解析之后的DOM进行层次化处理升序输出