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

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

【Java】单词倒序输出的更多相关文章

  1. PHP学习笔记:输入一句话,实现单词倒序输出

    约定:句子以空格为词语分割符号,以句号为结束符号. 实现思路: 用函数explode(separator,string,limit)对字符串进行分割,再对得到的数据最后一个成员分割切掉符号.用一个新的 ...

  2. java list倒序输出及复制list集合

    如原来有一个集合list,list里面是有数据的,现在如果把list中的集合倒序过来,加这代码 Collections.reverse(list);此代码中传入原来的list数据 有这代码后list在 ...

  3. 为什么getline()后要两次回车????(将输入的字符串按单词倒序输出)

    #include<iostream>#include<string>#include<algorithm>using namespace std;int main( ...

  4. C#字符串的倒序输出

    介绍 在本文中,我将演示如何将字符串的单词倒序输出.在这里我不是要将“John” 这样的字符串倒序为成“nhoJ”,.这是不一样的,因为它完全倒序了整个字符串.而以下代码将教你如何将“你 好 我是 缇 ...

  5. java倒序输出List

    先贴代码 package com.tsubasa.collection; import java.util.ArrayList; import java.util.Arrays; import jav ...

  6. Java——倒序输出Map集合

    package com.java.test.a; import java.util.ArrayList; import java.util.LinkedHashMap; import java.uti ...

  7. Java基础知识强化08:将字符串倒序输出(包括空格)的几种方法

    1.最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了: package himi.hebao05; public class TestDemo02 { pub ...

  8. java字符串实现正序和倒序输出

    ##一共4种方式 /*         * string倒序输出          * 利用String类的toCharArray(),再倒序输出数组的方法         * 2018-5-18 1 ...

  9. Java实现字符串倒序输出的几种方法

    1. 最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了. import javax.swing.JOptionPane; public class Rever ...

随机推荐

  1. PHP Server Nginx 安装

    1. PHP 安装: http://jingyan.baidu.com/article/b2c186c8f16d05c46ef6ff3c.html PHP 问题: http://www.cnblogs ...

  2. C GOTO使用示例

    GOTO虽然会破坏程序的结构,使用代码可读性变差,但是GOTO依然还是有可用的地方 #include <stdio.h>#include <stdbool.h> int mai ...

  3. 实验测试之------创建DBlink,查询远端的yang用户下的abcdedfa表,创建同义词

    --测试环境,20远端,30本地: --准备1,20远端建立表的同义词,用户信息: 1.11 ---------------------------------------------------准备 ...

  4. 读取本地的json文件

    最近写项目需要读取本地的json文件,然后悲催的发现前端新手的我居然不会,查查找找发现这东西并不难,但是应该是比较常用的,毕竟json太好用了! 我是直接用的jquery实现的,但是Ajax也可以,不 ...

  5. Java 中冷门的 synthetic 关键字原理解读

    看JAVA的反射时,看到有个synthetic ,还有一个方法isSynthetic() 很好奇,就了解了一下: 1.定义 Any constructs introduced by a Java co ...

  6. 《mysql必知必会》读书笔记--存储过程的使用

    以前对mysql的认识与应用只是停留在增删改查的阶段,最近正好在学习mysql相关内容,看了一本书叫做<MySQL必知必会>,看了之后对MySQL的高级用法有了一定的了解.以下内容只当读书 ...

  7. android开发第一天

    今天可以说是我正式投入android怀抱的第一天吧,按着自己的兴趣,努力地吸取知识.听了程老师的课,也觉得收获很多,毕竟以前都是看着书本或者网页教程来学习,第一次有人这么直接地跟你教授着,说着一些你听 ...

  8. java使用for循环做猜数字游戏

    package org.llh.test;import java.util.Random;import java.util.Scanner;/** * 猜数字游戏 *  * @author llh * ...

  9. SpringMVC自定义配置消息转换器踩坑总结

    问题描述 最近在开发时候碰到一个问题,springmvc页面向后台传数据的时候,通常我是这样处理的,在前台把数据打成一个json,在后台接口中使用@requestbody定义一个对象来接收,但是这次数 ...

  10. THINKPHP中几个缓存的问题

    1.字段缓存. THINKPHP是默认开启字段缓存的.如果关闭了APPDEBUG(即在index.php中设置了这样一句话:define("APP_DEBUG","FAL ...