【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 ...
随机推荐
- [js高手之路]封装运动框架实战左右与上下滑动的焦点轮播图
在这篇文章[js高手之路]打造通用的匀速运动框架中,封装了一个匀速运动框架,我们在这个框架的基础之上,加上缓冲运动效果,然后用运动框架来做幻灯片(上下,左右),效果如下: 1 2 3 4 5 // 0 ...
- 如何开发webpack loader
关于webpack 作为近段时间风头正盛的打包工具,webpack基本占领了前端圈.相信你都不好意思说不知道webpack. 有兴趣的同学可以参考下我很早之前的webpack简介 . 确实webpac ...
- STM32F10X -- 模拟IIC程序
听说STM32的IIC硬件做的很鸡肋,所以在这里通过模拟的方式实现IIC协议.此程序能成功对AT24C02操作. 程序中的带参数宏 IIC_DELAY(time)的功能是延时time us,在实际中具 ...
- iOS开发中使用文字图标iconfont
在iOS的开发中,各种图标的使用是不可避免的,如果把全部图标做成图片放在项目中,那么随着项目的逐渐庞大起来,图片所占的地方就会越来越大,安装包也就随之变大了,如果图标需要根据不同的场景改变使用不同的颜 ...
- (转)Java正则表达式的语法与示例
转自:http://www.cnblogs.com/lzq198754/p/5780340.html 概要: Java正则表达式的语法与示例 | |目录 1匹配验证-验证Email是否正确 2在字符串 ...
- Unix英雄传:图文细数十五位计算机先驱
Unix,一款多任务多用户操作系统,最早由AT&T公司员工及合作伙伴在贝尔实验室于1969年开发完成.Unix的衍生及克隆版本包括Berkeley Unix.Minix.Linux.AIX.A ...
- 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 ...
- 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, ...
- LeetCode 88. Merge Sorted Array(合并有序数组)
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...
- Python BDD自动化测试框架初探
1. 什么是BDD BDD全称Behavior Driven Development,译作"行为驱动开发",是基于TDD (Test Driven Development 测试驱动 ...