如何将一段单词倒序输出?把“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. [js高手之路]封装运动框架实战左右与上下滑动的焦点轮播图

    在这篇文章[js高手之路]打造通用的匀速运动框架中,封装了一个匀速运动框架,我们在这个框架的基础之上,加上缓冲运动效果,然后用运动框架来做幻灯片(上下,左右),效果如下: 1 2 3 4 5 // 0 ...

  2. 如何开发webpack loader

    关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ...

  3. STM32F10X -- 模拟IIC程序

    听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...

  4. iOS开发中使用文字图标iconfont

    在iOS的开发中,各种图标的使用是不可避免的,如果把全部图标做成图片放在项目中,那么随着项目的逐渐庞大起来,图片所占的地方就会越来越大,安装包也就随之变大了,如果图标需要根据不同的场景改变使用不同的颜 ...

  5. (转)Java正则表达式的语法与示例

    转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串 ...

  6. Unix英雄传:图文细数十五位计算机先驱

    Unix,一款多任务多用户操作系统,最早由AT&T公司员工及合作伙伴在贝尔实验室于1969年开发完成.Unix的衍生及克隆版本包括Berkeley Unix.Minix.Linux.AIX.A ...

  7. LeetCode 122. Best Time to Buy and Sell Stock II (买卖股票的最好时机之二)

    Say you have an array for which the ith element is the price of a given stock on day i. Design an al ...

  8. LeetCode 119. Pascal's Triangle II (杨辉三角之二)

    Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...

  9. LeetCode 88. Merge Sorted Array(合并有序数组)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

  10. Python BDD自动化测试框架初探

    1. 什么是BDD BDD全称Behavior Driven Development,译作"行为驱动开发",是基于TDD (Test Driven Development 测试驱动 ...