【Java】单词倒序输出
如何将一段单词倒序输出?把“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】单词倒序输出的更多相关文章
- PHP学习笔记:输入一句话,实现单词倒序输出
约定:句子以空格为词语分割符号,以句号为结束符号. 实现思路: 用函数explode(separator,string,limit)对字符串进行分割,再对得到的数据最后一个成员分割切掉符号.用一个新的 ...
- java list倒序输出及复制list集合
如原来有一个集合list,list里面是有数据的,现在如果把list中的集合倒序过来,加这代码 Collections.reverse(list);此代码中传入原来的list数据 有这代码后list在 ...
- 为什么getline()后要两次回车????(将输入的字符串按单词倒序输出)
#include<iostream>#include<string>#include<algorithm>using namespace std;int main( ...
- C#字符串的倒序输出
介绍 在本文中,我将演示如何将字符串的单词倒序输出.在这里我不是要将“John” 这样的字符串倒序为成“nhoJ”,.这是不一样的,因为它完全倒序了整个字符串.而以下代码将教你如何将“你 好 我是 缇 ...
- java倒序输出List
先贴代码 package com.tsubasa.collection; import java.util.ArrayList; import java.util.Arrays; import jav ...
- Java——倒序输出Map集合
package com.java.test.a; import java.util.ArrayList; import java.util.LinkedHashMap; import java.uti ...
- Java基础知识强化08:将字符串倒序输出(包括空格)的几种方法
1.最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了: package himi.hebao05; public class TestDemo02 { pub ...
- java字符串实现正序和倒序输出
##一共4种方式 /* * string倒序输出 * 利用String类的toCharArray(),再倒序输出数组的方法 * 2018-5-18 1 ...
- Java实现字符串倒序输出的几种方法
1. 最容易想到的估计就是利用String类的toCharArray(),再倒序输出数组的方法了. import javax.swing.JOptionPane; public class Rever ...
随机推荐
- BZOJ-1045-[HAOI2008] 糖果传递(中位数原理)
Description 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. Input 第一行一个正整数nn<=1'000'000,表示小朋友的个 ...
- JAVA中HashMap和Hashtable区别
Hashtable和HashMap在Java面试中相当容易被问到,甚至成为了集合框架面试题中最常被考的问题,所以在参加任何Java面试之前,都不要忘了准备这一题. 我们先看2个类的定义 public ...
- Jquery的树插件jqxTreeGrid的使用小结
一.引入相应的js <link rel="stylesheet" href="../../jqwidgets/styles/jqx.base.css" t ...
- web.xml中<init-param>报错
报错信息如下图: 控制台报错:严重: Servlet /*** threw load() exceptionjava.lang.ClassNotFoundException: MyApplicatio ...
- Linux系统Shell脚本编程
1. shell脚本概念:C语言编写的.命令解释器.编程语言. 是用户使用linux的桥梁. shell脚本语言非常擅长处理文本类型的数据. 2. shell脚本作用:自动化管理.监控管理.日志数据处 ...
- 使用python实现计算器功能
学习python过程中的作业.实现了+.-.×./.及幂运算,支持括号优先级. 代码为python3.5 import re def formatEquation(string): string = ...
- 《mysql必知必会》读书笔记--安全管理及数据库维护
安全管理 mysql自带的mysql数据库中的user表可查看用户所有资料 创建用户帐号 CREATE USER ben IDENTIFIED BY 'p@$$wOrd' 重命名用户帐号 RENAME ...
- 安装mayavi和VTK库的血泪史
一开始安装VTK库是从官网上下载,但是怎么都找不到whl文件,只有exe文件(vtkpython-7.1.1-Windows-64bit.exe).下载安装之后再PyCharm中import vtk出 ...
- C++获取Windows7 32位系统中所有进程名(类似于任务管理器中的进程)
代码是网上查找资料,然后自己调试,修改之后可以运行. 系统:win7 32位,VS2008 ------------------------------------------------------ ...
- Count the Colors
Count the Colors Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Subm ...